bootifyjs 0.1.1 → 1.1.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/dist/api.d.ts +8 -27
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +68 -134
- package/dist/api.js.map +1 -1
- package/dist/cache/bootstrap.d.ts +6 -0
- package/dist/cache/bootstrap.d.ts.map +1 -0
- package/dist/cache/bootstrap.js +23 -0
- package/dist/cache/bootstrap.js.map +1 -0
- package/dist/cache/cache.service.d.ts +9 -0
- package/dist/cache/cache.service.d.ts.map +1 -0
- package/dist/cache/cache.service.js +40 -0
- package/dist/cache/cache.service.js.map +1 -0
- package/dist/cache/cache.types.d.ts +14 -0
- package/dist/cache/cache.types.d.ts.map +1 -0
- package/dist/cache/cache.types.js +8 -0
- package/dist/cache/cache.types.js.map +1 -0
- package/dist/cache/decorators.d.ts +12 -0
- package/dist/cache/decorators.d.ts.map +1 -0
- package/dist/cache/decorators.js +53 -0
- package/dist/cache/decorators.js.map +1 -0
- package/dist/cache/in-memory-cache.store.d.ts +8 -0
- package/dist/cache/in-memory-cache.store.d.ts.map +1 -0
- package/dist/cache/in-memory-cache.store.js +39 -0
- package/dist/cache/in-memory-cache.store.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/component-registry.d.ts +7 -0
- package/dist/core/component-registry.d.ts.map +1 -0
- package/dist/core/component-registry.js +9 -0
- package/dist/core/component-registry.js.map +1 -0
- package/dist/core/decorators.d.ts +38 -22
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +155 -174
- package/dist/core/decorators.js.map +1 -1
- package/dist/core/di-container.d.ts +31 -0
- package/dist/core/di-container.d.ts.map +1 -0
- package/dist/core/di-container.js +219 -0
- package/dist/core/di-container.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +21 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/request-context.service.d.ts +24 -0
- package/dist/core/request-context.service.d.ts.map +1 -0
- package/dist/core/request-context.service.js +52 -0
- package/dist/core/request-context.service.js.map +1 -0
- package/dist/core/router.d.ts +4 -32
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +81 -258
- package/dist/core/router.js.map +1 -1
- package/dist/events/bootstrap.d.ts +8 -0
- package/dist/events/bootstrap.d.ts.map +1 -0
- package/dist/events/bootstrap.js +37 -0
- package/dist/events/bootstrap.js.map +1 -0
- package/dist/events/decorators.d.ts +16 -0
- package/dist/events/decorators.d.ts.map +1 -0
- package/dist/events/decorators.js +37 -0
- package/dist/events/decorators.js.map +1 -0
- package/dist/events/event-bus.service.d.ts +21 -0
- package/dist/events/event-bus.service.d.ts.map +1 -0
- package/dist/events/event-bus.service.js +78 -0
- package/dist/events/event-bus.service.js.map +1 -0
- package/dist/events/event.types.d.ts +17 -0
- package/dist/events/event.types.d.ts.map +1 -0
- package/dist/events/event.types.js.map +1 -0
- package/dist/events/index.d.ts +5 -13
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +4 -54
- package/dist/events/index.js.map +1 -1
- package/dist/examples/controllers/health.controller.d.ts +7 -0
- package/dist/examples/controllers/health.controller.d.ts.map +1 -0
- package/dist/{events/examples/system.events.js → examples/controllers/health.controller.js} +16 -15
- package/dist/examples/controllers/health.controller.js.map +1 -0
- package/dist/examples/controllers/todo.controller.d.ts +31 -0
- package/dist/examples/controllers/todo.controller.d.ts.map +1 -0
- package/dist/examples/controllers/todo.controller.js +102 -0
- package/dist/examples/controllers/todo.controller.js.map +1 -0
- package/dist/examples/events/TodoEventHandler.d.ts +2 -0
- package/dist/examples/events/TodoEventHandler.d.ts.map +1 -0
- package/dist/examples/events/TodoEventHandler.js +31 -0
- package/dist/examples/events/TodoEventHandler.js.map +1 -0
- package/dist/examples/events/todo.events.d.ts +16 -0
- package/dist/examples/events/todo.events.d.ts.map +1 -0
- package/dist/examples/events/todo.events.js +13 -0
- package/dist/examples/events/todo.events.js.map +1 -0
- package/dist/examples/index.d.ts +2 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +35 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/repositories/todo.repository.d.ts +20 -0
- package/dist/examples/repositories/todo.repository.d.ts.map +1 -0
- package/dist/examples/repositories/todo.repository.js +33 -0
- package/dist/examples/repositories/todo.repository.js.map +1 -0
- package/dist/examples/services/todo.service.d.ts +33 -0
- package/dist/examples/services/todo.service.d.ts.map +1 -0
- package/dist/examples/services/todo.service.js +80 -0
- package/dist/examples/services/todo.service.js.map +1 -0
- package/dist/examples/todos/schema.d.ts +54 -0
- package/dist/examples/todos/schema.d.ts.map +1 -0
- package/dist/examples/todos/schema.js +20 -0
- package/dist/examples/todos/schema.js.map +1 -0
- package/dist/index.d.ts +7 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -95
- package/dist/index.js.map +1 -1
- package/dist/logging/config/logging.config.d.ts +31 -3
- package/dist/logging/config/logging.config.d.ts.map +1 -0
- package/dist/logging/config/logging.config.js +43 -93
- package/dist/logging/config/logging.config.js.map +1 -1
- package/dist/logging/core/decorators.d.ts +16 -0
- package/dist/logging/core/decorators.d.ts.map +1 -0
- package/dist/logging/core/decorators.js +74 -0
- package/dist/logging/core/decorators.js.map +1 -0
- package/dist/logging/core/logger.provider.d.ts +4 -0
- package/dist/logging/core/logger.provider.d.ts.map +1 -0
- package/dist/logging/core/logger.provider.js +68 -0
- package/dist/logging/core/logger.provider.js.map +1 -0
- package/dist/logging/core/logger.service.d.ts +9 -27
- package/dist/logging/core/logger.service.d.ts.map +1 -0
- package/dist/logging/core/logger.service.js +34 -164
- package/dist/logging/core/logger.service.js.map +1 -1
- package/dist/logging/core/{startup-logger.service.d.ts → startup.logger.d.ts} +4 -6
- package/dist/logging/core/startup.logger.d.ts.map +1 -0
- package/dist/logging/core/{startup-logger.service.js → startup.logger.js} +36 -42
- package/dist/logging/core/startup.logger.js.map +1 -0
- package/dist/logging/index.d.ts +7 -14
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +17 -28
- package/dist/logging/index.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +3 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +18 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/middleware/context.middleware.d.ts +7 -0
- package/dist/middleware/context.middleware.d.ts.map +1 -0
- package/dist/middleware/context.middleware.js +25 -0
- package/dist/middleware/context.middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +20 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-logger.middleware.d.ts +4 -0
- package/dist/middleware/request-logger.middleware.d.ts.map +1 -0
- package/dist/middleware/request-logger.middleware.js +18 -0
- package/dist/middleware/request-logger.middleware.js.map +1 -0
- package/package.json +52 -47
- package/LICENSE +0 -21
- package/README.md +0 -423
- package/dist/config/app.config.d.ts +0 -29
- package/dist/config/app.config.js +0 -55
- package/dist/config/app.config.js.map +0 -1
- package/dist/controllers/config.controller.d.ts +0 -16
- package/dist/controllers/config.controller.js +0 -66
- package/dist/controllers/config.controller.js.map +0 -1
- package/dist/controllers/events.controller.d.ts +0 -66
- package/dist/controllers/events.controller.js +0 -145
- package/dist/controllers/events.controller.js.map +0 -1
- package/dist/controllers/health.controller.d.ts +0 -20
- package/dist/controllers/health.controller.js +0 -92
- package/dist/controllers/health.controller.js.map +0 -1
- package/dist/controllers/user.controller.d.ts +0 -13
- package/dist/controllers/user.controller.js +0 -209
- package/dist/controllers/user.controller.js.map +0 -1
- package/dist/core/application.d.ts +0 -21
- package/dist/core/application.js +0 -90
- package/dist/core/application.js.map +0 -1
- package/dist/core/config.d.ts +0 -3
- package/dist/core/config.js +0 -78
- package/dist/core/config.js.map +0 -1
- package/dist/core/container.d.ts +0 -17
- package/dist/core/container.js +0 -92
- package/dist/core/container.js.map +0 -1
- package/dist/core/errors.d.ts +0 -18
- package/dist/core/errors.js +0 -74
- package/dist/core/errors.js.map +0 -1
- package/dist/core/middleware.d.ts +0 -8
- package/dist/core/middleware.js +0 -23
- package/dist/core/middleware.js.map +0 -1
- package/dist/core/openapi.d.ts +0 -80
- package/dist/core/openapi.js +0 -189
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/utils.d.ts +0 -7
- package/dist/core/utils.js +0 -75
- package/dist/core/utils.js.map +0 -1
- package/dist/core/validation.d.ts +0 -15
- package/dist/core/validation.js +0 -161
- package/dist/core/validation.js.map +0 -1
- package/dist/events/core/event-bus.d.ts +0 -26
- package/dist/events/core/event-bus.js +0 -253
- package/dist/events/core/event-bus.js.map +0 -1
- package/dist/events/core/event-registry.d.ts +0 -31
- package/dist/events/core/event-registry.js +0 -170
- package/dist/events/core/event-registry.js.map +0 -1
- package/dist/events/decorators/event.decorators.d.ts +0 -11
- package/dist/events/decorators/event.decorators.js +0 -123
- package/dist/events/decorators/event.decorators.js.map +0 -1
- package/dist/events/examples/system.events.d.ts +0 -15
- package/dist/events/examples/system.events.js.map +0 -1
- package/dist/events/examples/user.events.d.ts +0 -68
- package/dist/events/examples/user.events.js +0 -73
- package/dist/events/examples/user.events.js.map +0 -1
- package/dist/events/examples/user.handlers.d.ts +0 -20
- package/dist/events/examples/user.handlers.js +0 -157
- package/dist/events/examples/user.handlers.js.map +0 -1
- package/dist/events/middleware/logging.middleware.d.ts +0 -7
- package/dist/events/middleware/logging.middleware.js +0 -44
- package/dist/events/middleware/logging.middleware.js.map +0 -1
- package/dist/events/middleware/metrics.middleware.d.ts +0 -11
- package/dist/events/middleware/metrics.middleware.js +0 -87
- package/dist/events/middleware/metrics.middleware.js.map +0 -1
- package/dist/events/middleware/validation.middleware.d.ts +0 -8
- package/dist/events/middleware/validation.middleware.js +0 -63
- package/dist/events/middleware/validation.middleware.js.map +0 -1
- package/dist/events/store/memory-event-store.d.ts +0 -21
- package/dist/events/store/memory-event-store.js +0 -81
- package/dist/events/store/memory-event-store.js.map +0 -1
- package/dist/events/types/event.types.d.ts +0 -57
- package/dist/events/types/event.types.js.map +0 -1
- package/dist/examples/basic-api.d.ts +0 -1
- package/dist/examples/basic-api.js +0 -120
- package/dist/examples/basic-api.js.map +0 -1
- package/dist/logging/core/log-context.service.d.ts +0 -11
- package/dist/logging/core/log-context.service.js +0 -40
- package/dist/logging/core/log-context.service.js.map +0 -1
- package/dist/logging/core/startup-logger.service.js.map +0 -1
- package/dist/logging/decorators/log.decorator.d.ts +0 -11
- package/dist/logging/decorators/log.decorator.js +0 -80
- package/dist/logging/decorators/log.decorator.js.map +0 -1
- package/dist/logging/middleware/context.middleware.d.ts +0 -2
- package/dist/logging/middleware/context.middleware.js +0 -29
- package/dist/logging/middleware/context.middleware.js.map +0 -1
- package/dist/logging/middleware/request-logging.middleware.d.ts +0 -3
- package/dist/logging/middleware/request-logging.middleware.js +0 -78
- package/dist/logging/middleware/request-logging.middleware.js.map +0 -1
- package/dist/logging/types/logging.types.d.ts +0 -79
- package/dist/logging/types/logging.types.js +0 -3
- package/dist/logging/types/logging.types.js.map +0 -1
- package/dist/middlewares/auth.middleware.d.ts +0 -2
- package/dist/middlewares/auth.middleware.js +0 -20
- package/dist/middlewares/auth.middleware.js.map +0 -1
- package/dist/middlewares/cors.middleware.d.ts +0 -2
- package/dist/middlewares/cors.middleware.js +0 -16
- package/dist/middlewares/cors.middleware.js.map +0 -1
- package/dist/middlewares/swagger.middleware.d.ts +0 -6
- package/dist/middlewares/swagger.middleware.js +0 -84
- package/dist/middlewares/swagger.middleware.js.map +0 -1
- package/dist/repositories/user.repository.d.ts +0 -16
- package/dist/repositories/user.repository.js +0 -110
- package/dist/repositories/user.repository.js.map +0 -1
- package/dist/schemas/user.schemas.d.ts +0 -214
- package/dist/schemas/user.schemas.js +0 -71
- package/dist/schemas/user.schemas.js.map +0 -1
- package/dist/services/config-demo.service.d.ts +0 -10
- package/dist/services/config-demo.service.js +0 -88
- package/dist/services/config-demo.service.js.map +0 -1
- package/dist/services/user.service.d.ts +0 -21
- package/dist/services/user.service.js +0 -201
- package/dist/services/user.service.js.map +0 -1
- /package/dist/events/{types/event.types.js → event.types.js} +0 -0
package/dist/api.d.ts
CHANGED
@@ -1,32 +1,13 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
5
|
-
* @param options Configuration options for the application
|
6
|
-
* @returns The configured application instance
|
7
|
-
*/
|
8
|
-
export declare function createBootifyApp(options: {
|
1
|
+
import { FastifyInstance } from 'fastify';
|
2
|
+
import { Constructor } from './core/di-container';
|
3
|
+
export interface BootifyAppOptions {
|
4
|
+
controllers: Constructor[];
|
9
5
|
port?: number;
|
10
6
|
hostname?: string;
|
11
|
-
controllers?: any[];
|
12
7
|
enableSwagger?: boolean;
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
};
|
17
|
-
enableCors?: boolean;
|
18
|
-
enableRequestLogging?: boolean;
|
19
|
-
requestLoggingOptions?: {
|
20
|
-
logHeaders?: boolean;
|
21
|
-
slowThreshold?: number;
|
22
|
-
skipPaths?: string[];
|
23
|
-
};
|
24
|
-
}): Promise<{
|
25
|
-
app: Application;
|
26
|
-
config: AppConfig;
|
27
|
-
logger: import("./logging").LoggerService;
|
28
|
-
eventBus: import("./events").EventBus;
|
29
|
-
openApiSpec: import("./core/openapi").OpenAPISpec | undefined;
|
8
|
+
}
|
9
|
+
export declare function createBootifyApp(options: BootifyAppOptions): Promise<{
|
10
|
+
app: FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>;
|
30
11
|
start: () => Promise<void>;
|
31
|
-
stop: () => Promise<void>;
|
32
12
|
}>;
|
13
|
+
//# sourceMappingURL=api.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAUjD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,EAAE,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB;;;GAyEhE"}
|
package/dist/api.js
CHANGED
@@ -1,149 +1,83 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
6
|
exports.createBootifyApp = createBootifyApp;
|
4
|
-
const
|
5
|
-
const
|
6
|
-
const
|
7
|
-
const
|
8
|
-
const
|
9
|
-
const
|
10
|
-
const
|
11
|
-
const swagger_middleware_1 = require("./middlewares/swagger.middleware");
|
12
|
-
const openapi_1 = require("./core/openapi");
|
7
|
+
const fastify_1 = __importDefault(require("fastify"));
|
8
|
+
const zod_1 = require("zod");
|
9
|
+
const router_1 = require("./core/router");
|
10
|
+
const swagger_1 = __importDefault(require("@fastify/swagger"));
|
11
|
+
const swagger_ui_1 = __importDefault(require("@fastify/swagger-ui"));
|
12
|
+
const request_logger_middleware_1 = require("./middleware/request-logger.middleware");
|
13
|
+
const context_middleware_1 = require("./middleware/context.middleware");
|
13
14
|
const logging_1 = require("./logging");
|
14
|
-
const config_1 = require("./core/config");
|
15
|
-
const events_1 = require("./events");
|
16
|
-
/**
|
17
|
-
* Creates and configures a BootifyJS application
|
18
|
-
* @param options Configuration options for the application
|
19
|
-
* @returns The configured application instance
|
20
|
-
*/
|
21
15
|
async function createBootifyApp(options) {
|
22
|
-
|
23
|
-
const appConfig = (0, config_1.getConfigInstance)(app_config_1.AppConfig);
|
24
|
-
// Override config with options
|
25
|
-
if (options.port) {
|
26
|
-
appConfig.server.port = options.port;
|
27
|
-
}
|
28
|
-
if (options.hostname) {
|
29
|
-
appConfig.server.host = options.hostname;
|
30
|
-
}
|
31
|
-
// Initialize logging
|
32
|
-
const { logger, startupLogger } = (0, logging_1.configureLogging)();
|
33
|
-
// Log startup banner
|
16
|
+
const { logger, startupLogger } = await (0, logging_1.intitializeLogging)();
|
34
17
|
startupLogger.logStartupBanner();
|
35
|
-
|
36
|
-
|
37
|
-
nodeVersion: process.version,
|
38
|
-
environment: process.env.NODE_ENV || 'development',
|
39
|
-
serviceName: appConfig.SERVICE_NAME,
|
40
|
-
serverPort: appConfig.server.port,
|
41
|
-
serverHost: appConfig.server.host,
|
42
|
-
platform: process.platform,
|
43
|
-
arch: process.arch
|
18
|
+
const app = (0, fastify_1.default)({
|
19
|
+
logger: false,
|
44
20
|
});
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
21
|
+
startupLogger.logComponentStart('Request Context Middleware');
|
22
|
+
app.addHook('onRequest', context_middleware_1.contextMiddleware);
|
23
|
+
startupLogger.logComponentComplete('Request Context Middleware');
|
24
|
+
// 2. Request Logger Hooks
|
25
|
+
// These log the start and end of the request.
|
26
|
+
startupLogger.logComponentStart('Attaching Request Logger');
|
27
|
+
app.addHook('onRequest', request_logger_middleware_1.requestLoggerOnRequest);
|
28
|
+
app.addHook('onResponse', request_logger_middleware_1.requestLoggerOnResponse);
|
29
|
+
startupLogger.logComponentComplete('Attaching Request Logger');
|
30
|
+
startupLogger.logComponentStart('Attaching Global ErrorHandler');
|
31
|
+
app.setErrorHandler((error, request, reply) => {
|
32
|
+
if (error instanceof zod_1.ZodError) {
|
33
|
+
reply.status(400).send({
|
34
|
+
statusCode: 400,
|
35
|
+
error: 'Bad Request',
|
36
|
+
message: 'Validation failed',
|
37
|
+
details: error.issues,
|
38
|
+
});
|
39
|
+
}
|
40
|
+
else if (error.statusCode) {
|
41
|
+
reply.send(error);
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
// app.log.error(error)
|
45
|
+
logger.error('Internal Server Error', error);
|
46
|
+
reply.status(500).send({ message: 'Internal Server Error' });
|
47
|
+
}
|
51
48
|
});
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
// Add CORS middleware if enabled
|
64
|
-
if (options.enableCors !== false) {
|
65
|
-
middlewares.push(cors_middleware_1.corsMiddleware);
|
66
|
-
}
|
67
|
-
// Add request logging middleware if enabled
|
68
|
-
if (options.enableRequestLogging !== false) {
|
69
|
-
middlewares.push((0, logging_1.createRequestLoggingMiddleware)({
|
70
|
-
logHeaders: process.env.NODE_ENV === 'development',
|
71
|
-
slowThreshold: 1000,
|
72
|
-
skipPaths: ['/health/ping', '/favicon.ico'],
|
73
|
-
...options.requestLoggingOptions
|
74
|
-
}));
|
75
|
-
}
|
76
|
-
// Generate OpenAPI documentation if enabled
|
77
|
-
let openApiSpec;
|
78
|
-
if (options.enableSwagger !== false) {
|
79
|
-
startupLogger.logComponentStart('OpenAPI Generator');
|
80
|
-
const openApiGenerator = new openapi_1.OpenAPIGenerator({
|
81
|
-
title: 'BootifyJS API',
|
82
|
-
version: '1.0.0',
|
83
|
-
description: 'Spring Boot inspired Node.js framework with TypeScript, Dependency Injection, and Validation',
|
84
|
-
contact: {
|
85
|
-
name: 'BootifyJS Team',
|
86
|
-
email: 'support@bootifyjs.com'
|
49
|
+
startupLogger.logComponentComplete('Attaching Global ErrorHandler');
|
50
|
+
if (options.enableSwagger) {
|
51
|
+
startupLogger.logComponentStart('Initializing Swagger');
|
52
|
+
await app.register(swagger_1.default, {
|
53
|
+
openapi: {
|
54
|
+
info: {
|
55
|
+
title: 'Bootify (Fastify) API',
|
56
|
+
description: 'API documentation',
|
57
|
+
version: '1.0.0',
|
58
|
+
},
|
59
|
+
servers: [{ url: `http://${options.hostname ?? 'localhost'}:${options.port ?? 3000}` }],
|
87
60
|
},
|
88
|
-
license: {
|
89
|
-
name: 'MIT',
|
90
|
-
url: 'https://opensource.org/licenses/MIT'
|
91
|
-
}
|
92
|
-
}, [
|
93
|
-
{ url: `http://${appConfig.server.host}:${appConfig.server.port}`, description: 'Development server' }
|
94
|
-
]);
|
95
|
-
openApiGenerator.addControllers(controllers);
|
96
|
-
openApiSpec = openApiGenerator.getSpec();
|
97
|
-
startupLogger.logComponentComplete('OpenAPI Generator', {
|
98
|
-
paths: Object.keys(openApiSpec.paths).length,
|
99
|
-
schemas: Object.keys(openApiSpec.components.schemas).length
|
100
61
|
});
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
}));
|
62
|
+
await app.register(swagger_ui_1.default, {
|
63
|
+
routePrefix: '/api-docs',
|
64
|
+
});
|
65
|
+
startupLogger.logComponentComplete(' Swagger COnfiguiration Done');
|
106
66
|
}
|
107
|
-
startupLogger.logComponentStart('
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
logger,
|
120
|
-
eventBus,
|
121
|
-
openApiSpec,
|
122
|
-
start: async () => {
|
123
|
-
await app.start();
|
124
|
-
logger.info('API Documentation endpoints configured', {
|
125
|
-
docs: `http://${appConfig.server.host}:${appConfig.server.port}/api-docs`,
|
126
|
-
spec: `http://${appConfig.server.host}:${appConfig.server.port}/api-docs/swagger.json`
|
127
|
-
});
|
128
|
-
},
|
129
|
-
stop: async () => {
|
130
|
-
await app.stop();
|
67
|
+
startupLogger.logComponentStart('Registering Controllers');
|
68
|
+
(0, router_1.registerControllers)(app, options.controllers);
|
69
|
+
startupLogger.logComponentComplete('Registering Controllers');
|
70
|
+
startupLogger.logStartupComplete();
|
71
|
+
const start = async () => {
|
72
|
+
try {
|
73
|
+
await app.listen({ port: options.port ?? 3000, host: options.hostname ?? '0.0.0.0' });
|
74
|
+
startupLogger.logStartupSummary();
|
75
|
+
}
|
76
|
+
catch (err) {
|
77
|
+
app.log.error(err);
|
78
|
+
process.exit(1);
|
131
79
|
}
|
132
80
|
};
|
133
|
-
}
|
134
|
-
// Example usage
|
135
|
-
if (require.main === module) {
|
136
|
-
createBootifyApp({
|
137
|
-
port: 3000,
|
138
|
-
hostname: 'localhost',
|
139
|
-
enableSwagger: true,
|
140
|
-
enableCors: true,
|
141
|
-
enableRequestLogging: true
|
142
|
-
}).then(({ start }) => {
|
143
|
-
start();
|
144
|
-
}).catch(error => {
|
145
|
-
console.error('Failed to start application:', error);
|
146
|
-
process.exit(1);
|
147
|
-
});
|
81
|
+
return { app, start };
|
148
82
|
}
|
149
83
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/cache/bootstrap.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,cAAc,SAW7B"}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.bootstrapCache = bootstrapCache;
|
4
|
+
const di_container_1 = require("../core/di-container");
|
5
|
+
const cache_types_1 = require("./cache.types");
|
6
|
+
const in_memory_cache_store_1 = require("./in-memory-cache.store");
|
7
|
+
/**
|
8
|
+
* Checks if a user has provided a custom cache store. If not, it registers
|
9
|
+
* the default InMemoryCacheStore. This makes the caching system work out-of-the-box.
|
10
|
+
*/
|
11
|
+
function bootstrapCache() {
|
12
|
+
console.log('🔄 Bootstrapping Cache System...');
|
13
|
+
if (!di_container_1.container.isRegistered(cache_types_1.CACHE_STORE_TOKEN)) {
|
14
|
+
console.log(' - No custom cache store provided. Binding default InMemoryCacheStore.');
|
15
|
+
// The user didn't bind anything to the token, so we provide the default.
|
16
|
+
di_container_1.container.register(cache_types_1.CACHE_STORE_TOKEN, { useClass: in_memory_cache_store_1.InMemoryCacheStore });
|
17
|
+
}
|
18
|
+
else {
|
19
|
+
console.log(' - Custom cache store detected. Skipping default binding.');
|
20
|
+
}
|
21
|
+
console.log('✅ Cache System bootstrapped successfully!\n');
|
22
|
+
}
|
23
|
+
//# sourceMappingURL=bootstrap.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/cache/bootstrap.ts"],"names":[],"mappings":";;AAQA,wCAWC;AAnBD,uDAAgD;AAChD,+CAAiD;AACjD,mEAA4D;AAE5D;;;GAGG;AACH,SAAgB,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAE/C,IAAI,CAAC,wBAAS,CAAC,YAAY,CAAC,+BAAiB,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAA;QACtF,yEAAyE;QACzE,wBAAS,CAAC,QAAQ,CAAC,+BAAiB,EAAE,EAAE,QAAQ,EAAE,0CAAkB,EAAE,CAAC,CAAA;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;AAC5D,CAAC"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { ICacheStore } from './cache.types';
|
2
|
+
export declare class CacheService {
|
3
|
+
private readonly store;
|
4
|
+
constructor(store: ICacheStore);
|
5
|
+
get<T>(key: string): Promise<T | undefined>;
|
6
|
+
set(key: string, value: any, ttlInSeconds?: number): Promise<void>;
|
7
|
+
del(key: string): Promise<void>;
|
8
|
+
}
|
9
|
+
//# sourceMappingURL=cache.service.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cache.service.d.ts","sourceRoot":"","sources":["../../src/cache/cache.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAA;AAE9D,qBACa,YAAY;IACmB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,WAAW;IAEtE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI3C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGvC"}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
10
|
+
};
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
exports.CacheService = void 0;
|
16
|
+
// import { Service, Autowired } from '../decorators'
|
17
|
+
const decorators_1 = require("../core/decorators");
|
18
|
+
const cache_types_1 = require("./cache.types");
|
19
|
+
let CacheService = class CacheService {
|
20
|
+
constructor(store) {
|
21
|
+
this.store = store;
|
22
|
+
}
|
23
|
+
get(key) {
|
24
|
+
return this.store.get(key);
|
25
|
+
}
|
26
|
+
set(key, value, ttlInSeconds) {
|
27
|
+
return this.store.set(key, value, ttlInSeconds);
|
28
|
+
}
|
29
|
+
del(key) {
|
30
|
+
return this.store.del(key);
|
31
|
+
}
|
32
|
+
};
|
33
|
+
exports.CacheService = CacheService;
|
34
|
+
exports.CacheService = CacheService = __decorate([
|
35
|
+
(0, decorators_1.Service)() // Eagerly load to ensure it's ready
|
36
|
+
,
|
37
|
+
__param(0, (0, decorators_1.Autowired)(cache_types_1.CACHE_STORE_TOKEN)),
|
38
|
+
__metadata("design:paramtypes", [Object])
|
39
|
+
], CacheService);
|
40
|
+
//# sourceMappingURL=cache.service.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cache.service.js","sourceRoot":"","sources":["../../src/cache/cache.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qDAAqD;AACrD,mDAAuD;AACvD,+CAA8D;AAGvD,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,YAA2D,KAAkB;QAAlB,UAAK,GAAL,KAAK,CAAa;IAAG,CAAC;IAE1E,GAAG,CAAI,GAAW;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,YAAqB;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;IACjD,CAAC;IAEM,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;CACF,CAAA;AAdY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,oBAAO,GAAE,CAAC,oCAAoC;;IAEhC,WAAA,IAAA,sBAAS,EAAC,+BAAiB,CAAC,CAAA;;GAD9B,YAAY,CAcxB"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/**
|
2
|
+
* A unique Symbol to use as the DI token for the cache store.
|
3
|
+
*/
|
4
|
+
export declare const CACHE_STORE_TOKEN: unique symbol;
|
5
|
+
/**
|
6
|
+
* The contract that any cache store must adhere to.
|
7
|
+
* This can be implemented for in-memory, Redis, Memcached, etc.
|
8
|
+
*/
|
9
|
+
export interface ICacheStore {
|
10
|
+
get<T>(key: string): Promise<T | undefined>;
|
11
|
+
set(key: string, value: any, ttlInSeconds?: number): Promise<void>;
|
12
|
+
del(key: string): Promise<void>;
|
13
|
+
}
|
14
|
+
//# sourceMappingURL=cache.types.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cache.types.d.ts","sourceRoot":"","sources":["../../src/cache/cache.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAA2B,CAAA;AAEzD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.CACHE_STORE_TOKEN = void 0;
|
4
|
+
/**
|
5
|
+
* A unique Symbol to use as the DI token for the cache store.
|
6
|
+
*/
|
7
|
+
exports.CACHE_STORE_TOKEN = Symbol.for('CacheStore');
|
8
|
+
//# sourceMappingURL=cache.types.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cache.types.js","sourceRoot":"","sources":["../../src/cache/cache.types.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
interface CacheableOptions {
|
2
|
+
/** A base key for the cache entry. */
|
3
|
+
key: string;
|
4
|
+
/** Time-to-live in seconds. */
|
5
|
+
ttl?: number;
|
6
|
+
}
|
7
|
+
export declare const Cacheable: (options: CacheableOptions) => MethodDecorator;
|
8
|
+
export declare const CacheEvict: (options: {
|
9
|
+
key: string;
|
10
|
+
}) => MethodDecorator;
|
11
|
+
export {};
|
12
|
+
//# sourceMappingURL=decorators.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/cache/decorators.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAUD,eAAO,MAAM,SAAS,GAAI,SAAS,gBAAgB,KAAG,eA4BrD,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,SAAS;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,KAAG,eAoBrD,CAAA"}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.CacheEvict = exports.Cacheable = void 0;
|
4
|
+
const di_container_1 = require("../core/di-container");
|
5
|
+
const cache_service_1 = require("./cache.service");
|
6
|
+
// Helper to generate a unique key based on method arguments
|
7
|
+
function generateCacheKey(baseKey, args) {
|
8
|
+
// Simple JSON stringify is a decent way to serialize arguments.
|
9
|
+
// For more complex cases, a more robust serialization might be needed.
|
10
|
+
const argsString = args.map((arg) => JSON.stringify(arg)).join(':');
|
11
|
+
return `${baseKey}::${argsString}`;
|
12
|
+
}
|
13
|
+
const Cacheable = (options) => {
|
14
|
+
return (target, propertyKey, descriptor) => {
|
15
|
+
const originalMethod = descriptor.value;
|
16
|
+
descriptor.value = async function (...args) {
|
17
|
+
const cacheService = di_container_1.container.resolve(cache_service_1.CacheService);
|
18
|
+
const cacheKey = generateCacheKey(options.key, args);
|
19
|
+
// 1. Try to get the value from the cache
|
20
|
+
const cachedValue = await cacheService.get(cacheKey);
|
21
|
+
if (cachedValue !== undefined) {
|
22
|
+
console.log(`[Cache] HIT for key: ${cacheKey}`);
|
23
|
+
return cachedValue;
|
24
|
+
}
|
25
|
+
console.log(`[Cache] MISS for key: ${cacheKey}`);
|
26
|
+
// 2. If it's a cache miss, call the original method
|
27
|
+
const result = await originalMethod.apply(this, args);
|
28
|
+
// 3. Store the result in the cache
|
29
|
+
await cacheService.set(cacheKey, result, options.ttl);
|
30
|
+
return result;
|
31
|
+
};
|
32
|
+
return descriptor;
|
33
|
+
};
|
34
|
+
};
|
35
|
+
exports.Cacheable = Cacheable;
|
36
|
+
const CacheEvict = (options) => {
|
37
|
+
return (target, propertyKey, descriptor) => {
|
38
|
+
const originalMethod = descriptor.value;
|
39
|
+
descriptor.value = async function (...args) {
|
40
|
+
// 1. Call the original method first
|
41
|
+
const result = await originalMethod.apply(this, args);
|
42
|
+
// 2. After it succeeds, evict the cache entry
|
43
|
+
const cacheService = di_container_1.container.resolve(cache_service_1.CacheService);
|
44
|
+
const cacheKey = generateCacheKey(options.key, args);
|
45
|
+
console.log(`[Cache] EVICT for key: ${cacheKey}`);
|
46
|
+
await cacheService.del(cacheKey);
|
47
|
+
return result;
|
48
|
+
};
|
49
|
+
return descriptor;
|
50
|
+
};
|
51
|
+
};
|
52
|
+
exports.CacheEvict = CacheEvict;
|
53
|
+
//# sourceMappingURL=decorators.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/cache/decorators.ts"],"names":[],"mappings":";;;AAAA,uDAAgD;AAChD,mDAA8C;AAS9C,4DAA4D;AAC5D,SAAS,gBAAgB,CAAC,OAAe,EAAE,IAAW;IACpD,gEAAgE;IAChE,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnE,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,CAAA;AACpC,CAAC;AAEM,MAAM,SAAS,GAAG,CAAC,OAAyB,EAAmB,EAAE;IACtE,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,UAA8B,EAAE,EAAE;QACnF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAA;QAEvC,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAW;YAC/C,MAAM,YAAY,GAAG,wBAAS,CAAC,OAAO,CAAe,4BAAY,CAAC,CAAA;YAClE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAEpD,yCAAyC;YACzC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACpD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAA;gBAC/C,OAAO,WAAW,CAAA;YACpB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAA;YAEhD,oDAAoD;YACpD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAErD,mCAAmC;YACnC,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;YAErD,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;AACH,CAAC,CAAA;AA5BY,QAAA,SAAS,aA4BrB;AAEM,MAAM,UAAU,GAAG,CAAC,OAAwB,EAAmB,EAAE;IACtE,OAAO,CAAC,MAAW,EAAE,WAA4B,EAAE,UAA8B,EAAE,EAAE;QACnF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAA;QAEvC,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAW;YAC/C,oCAAoC;YACpC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YAErD,8CAA8C;YAC9C,MAAM,YAAY,GAAG,wBAAS,CAAC,OAAO,CAAe,4BAAY,CAAC,CAAA;YAClE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAEpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAEhC,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAA;AACH,CAAC,CAAA;AApBY,QAAA,UAAU,cAoBtB"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { ICacheStore } from './cache.types';
|
2
|
+
export declare class InMemoryCacheStore implements ICacheStore {
|
3
|
+
private readonly cache;
|
4
|
+
get<T>(key: string): Promise<T | undefined>;
|
5
|
+
set(key: string, value: any, ttlInSeconds?: number): Promise<void>;
|
6
|
+
del(key: string): Promise<void>;
|
7
|
+
}
|
8
|
+
//# sourceMappingURL=in-memory-cache.store.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"in-memory-cache.store.d.ts","sourceRoot":"","sources":["../../src/cache/in-memory-cache.store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,qBACa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2D;IAE3E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAa3C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtC"}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
9
|
+
exports.InMemoryCacheStore = void 0;
|
10
|
+
const decorators_1 = require("../core/decorators");
|
11
|
+
// A simple in-memory cache store using a Map.
|
12
|
+
let InMemoryCacheStore = class InMemoryCacheStore {
|
13
|
+
constructor() {
|
14
|
+
this.cache = new Map();
|
15
|
+
}
|
16
|
+
async get(key) {
|
17
|
+
const entry = this.cache.get(key);
|
18
|
+
if (!entry)
|
19
|
+
return undefined;
|
20
|
+
// Check for expiration
|
21
|
+
if (entry.expiry && entry.expiry < Date.now()) {
|
22
|
+
this.cache.delete(key);
|
23
|
+
return undefined;
|
24
|
+
}
|
25
|
+
return entry.value;
|
26
|
+
}
|
27
|
+
async set(key, value, ttlInSeconds) {
|
28
|
+
const expiry = ttlInSeconds ? Date.now() + ttlInSeconds * 1000 : null;
|
29
|
+
this.cache.set(key, { value, expiry });
|
30
|
+
}
|
31
|
+
async del(key) {
|
32
|
+
this.cache.delete(key);
|
33
|
+
}
|
34
|
+
};
|
35
|
+
exports.InMemoryCacheStore = InMemoryCacheStore;
|
36
|
+
exports.InMemoryCacheStore = InMemoryCacheStore = __decorate([
|
37
|
+
(0, decorators_1.Service)()
|
38
|
+
], InMemoryCacheStore);
|
39
|
+
//# sourceMappingURL=in-memory-cache.store.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"in-memory-cache.store.js","sourceRoot":"","sources":["../../src/cache/in-memory-cache.store.ts"],"names":[],"mappings":";;;;;;;;;AAAA,mDAA4C;AAG5C,8CAA8C;AAEvC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAAxB;QACY,UAAK,GAAG,IAAI,GAAG,EAAiD,CAAA;IAuBnF,CAAC;IArBC,KAAK,CAAC,GAAG,CAAI,GAAW;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAE5B,uBAAuB;QACvB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO,KAAK,CAAC,KAAU,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,YAAqB;QACtD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;CACF,CAAA;AAxBY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,oBAAO,GAAE;GACG,kBAAkB,CAwB9B"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
__exportStar(require("./bootstrap"), exports);
|
18
|
+
__exportStar(require("./cache.types"), exports);
|
19
|
+
__exportStar(require("./decorators"), exports);
|
20
|
+
__exportStar(require("./cache.service"), exports);
|
21
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,gDAA6B;AAC7B,+CAA4B;AAC5B,kDAA+B"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { Constructor } from './di-container';
|
2
|
+
/**
|
3
|
+
* A global Set that stores the constructors of all classes
|
4
|
+
* decorated with @Component (or its derivatives).
|
5
|
+
*/
|
6
|
+
export declare const registeredComponents: Set<Constructor>;
|
7
|
+
//# sourceMappingURL=component-registry.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"component-registry.d.ts","sourceRoot":"","sources":["../../src/core/component-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kBAAyB,CAAA"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.registeredComponents = void 0;
|
4
|
+
/**
|
5
|
+
* A global Set that stores the constructors of all classes
|
6
|
+
* decorated with @Component (or its derivatives).
|
7
|
+
*/
|
8
|
+
exports.registeredComponents = new Set();
|
9
|
+
//# sourceMappingURL=component-registry.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"component-registry.js","sourceRoot":"","sources":["../../src/core/component-registry.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,oBAAoB,GAAG,IAAI,GAAG,EAAe,CAAA"}
|