bootifyjs 0.1.1 → 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.
Files changed (261) hide show
  1. package/dist/api.d.ts +8 -27
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +68 -134
  4. package/dist/api.js.map +1 -1
  5. package/dist/cache/bootstrap.d.ts +6 -0
  6. package/dist/cache/bootstrap.d.ts.map +1 -0
  7. package/dist/cache/bootstrap.js +23 -0
  8. package/dist/cache/bootstrap.js.map +1 -0
  9. package/dist/cache/cache.service.d.ts +9 -0
  10. package/dist/cache/cache.service.d.ts.map +1 -0
  11. package/dist/cache/cache.service.js +40 -0
  12. package/dist/cache/cache.service.js.map +1 -0
  13. package/dist/cache/cache.types.d.ts +14 -0
  14. package/dist/cache/cache.types.d.ts.map +1 -0
  15. package/dist/cache/cache.types.js +8 -0
  16. package/dist/cache/cache.types.js.map +1 -0
  17. package/dist/cache/decorators.d.ts +12 -0
  18. package/dist/cache/decorators.d.ts.map +1 -0
  19. package/dist/cache/decorators.js +53 -0
  20. package/dist/cache/decorators.js.map +1 -0
  21. package/dist/cache/in-memory-cache.store.d.ts +8 -0
  22. package/dist/cache/in-memory-cache.store.d.ts.map +1 -0
  23. package/dist/cache/in-memory-cache.store.js +39 -0
  24. package/dist/cache/in-memory-cache.store.js.map +1 -0
  25. package/dist/cache/index.d.ts +5 -0
  26. package/dist/cache/index.d.ts.map +1 -0
  27. package/dist/cache/index.js +21 -0
  28. package/dist/cache/index.js.map +1 -0
  29. package/dist/core/component-registry.d.ts +7 -0
  30. package/dist/core/component-registry.d.ts.map +1 -0
  31. package/dist/core/component-registry.js +9 -0
  32. package/dist/core/component-registry.js.map +1 -0
  33. package/dist/core/decorators.d.ts +38 -22
  34. package/dist/core/decorators.d.ts.map +1 -0
  35. package/dist/core/decorators.js +155 -174
  36. package/dist/core/decorators.js.map +1 -1
  37. package/dist/core/di-container.d.ts +31 -0
  38. package/dist/core/di-container.d.ts.map +1 -0
  39. package/dist/core/di-container.js +219 -0
  40. package/dist/core/di-container.js.map +1 -0
  41. package/dist/core/index.d.ts +5 -0
  42. package/dist/core/index.d.ts.map +1 -0
  43. package/dist/core/index.js +21 -0
  44. package/dist/core/index.js.map +1 -0
  45. package/dist/core/request-context.service.d.ts +24 -0
  46. package/dist/core/request-context.service.d.ts.map +1 -0
  47. package/dist/core/request-context.service.js +52 -0
  48. package/dist/core/request-context.service.js.map +1 -0
  49. package/dist/core/router.d.ts +4 -32
  50. package/dist/core/router.d.ts.map +1 -0
  51. package/dist/core/router.js +81 -258
  52. package/dist/core/router.js.map +1 -1
  53. package/dist/events/bootstrap.d.ts +8 -0
  54. package/dist/events/bootstrap.d.ts.map +1 -0
  55. package/dist/events/bootstrap.js +37 -0
  56. package/dist/events/bootstrap.js.map +1 -0
  57. package/dist/events/decorators.d.ts +16 -0
  58. package/dist/events/decorators.d.ts.map +1 -0
  59. package/dist/events/decorators.js +37 -0
  60. package/dist/events/decorators.js.map +1 -0
  61. package/dist/events/event-bus.service.d.ts +21 -0
  62. package/dist/events/event-bus.service.d.ts.map +1 -0
  63. package/dist/events/event-bus.service.js +78 -0
  64. package/dist/events/event-bus.service.js.map +1 -0
  65. package/dist/events/event.types.d.ts +17 -0
  66. package/dist/events/event.types.d.ts.map +1 -0
  67. package/dist/events/event.types.js.map +1 -0
  68. package/dist/events/index.d.ts +5 -13
  69. package/dist/events/index.d.ts.map +1 -0
  70. package/dist/events/index.js +4 -54
  71. package/dist/events/index.js.map +1 -1
  72. package/dist/examples/controllers/health.controller.d.ts +7 -0
  73. package/dist/examples/controllers/health.controller.d.ts.map +1 -0
  74. package/dist/{events/examples/system.events.js → examples/controllers/health.controller.js} +16 -15
  75. package/dist/examples/controllers/health.controller.js.map +1 -0
  76. package/dist/examples/controllers/todo.controller.d.ts +31 -0
  77. package/dist/examples/controllers/todo.controller.d.ts.map +1 -0
  78. package/dist/examples/controllers/todo.controller.js +102 -0
  79. package/dist/examples/controllers/todo.controller.js.map +1 -0
  80. package/dist/examples/events/TodoEventHandler.d.ts +2 -0
  81. package/dist/examples/events/TodoEventHandler.d.ts.map +1 -0
  82. package/dist/examples/events/TodoEventHandler.js +31 -0
  83. package/dist/examples/events/TodoEventHandler.js.map +1 -0
  84. package/dist/examples/events/todo.events.d.ts +16 -0
  85. package/dist/examples/events/todo.events.d.ts.map +1 -0
  86. package/dist/examples/events/todo.events.js +13 -0
  87. package/dist/examples/events/todo.events.js.map +1 -0
  88. package/dist/examples/index.d.ts +2 -0
  89. package/dist/examples/index.d.ts.map +1 -0
  90. package/dist/examples/index.js +35 -0
  91. package/dist/examples/index.js.map +1 -0
  92. package/dist/examples/repositories/todo.repository.d.ts +20 -0
  93. package/dist/examples/repositories/todo.repository.d.ts.map +1 -0
  94. package/dist/examples/repositories/todo.repository.js +33 -0
  95. package/dist/examples/repositories/todo.repository.js.map +1 -0
  96. package/dist/examples/services/todo.service.d.ts +33 -0
  97. package/dist/examples/services/todo.service.d.ts.map +1 -0
  98. package/dist/examples/services/todo.service.js +80 -0
  99. package/dist/examples/services/todo.service.js.map +1 -0
  100. package/dist/examples/todos/schema.d.ts +54 -0
  101. package/dist/examples/todos/schema.d.ts.map +1 -0
  102. package/dist/examples/todos/schema.js +20 -0
  103. package/dist/examples/todos/schema.js.map +1 -0
  104. package/dist/index.d.ts +7 -17
  105. package/dist/index.d.ts.map +1 -0
  106. package/dist/index.js +20 -95
  107. package/dist/index.js.map +1 -1
  108. package/dist/logging/config/logging.config.d.ts +31 -3
  109. package/dist/logging/config/logging.config.d.ts.map +1 -0
  110. package/dist/logging/config/logging.config.js +43 -93
  111. package/dist/logging/config/logging.config.js.map +1 -1
  112. package/dist/logging/core/decorators.d.ts +16 -0
  113. package/dist/logging/core/decorators.d.ts.map +1 -0
  114. package/dist/logging/core/decorators.js +74 -0
  115. package/dist/logging/core/decorators.js.map +1 -0
  116. package/dist/logging/core/logger.provider.d.ts +4 -0
  117. package/dist/logging/core/logger.provider.d.ts.map +1 -0
  118. package/dist/logging/core/logger.provider.js +68 -0
  119. package/dist/logging/core/logger.provider.js.map +1 -0
  120. package/dist/logging/core/logger.service.d.ts +9 -27
  121. package/dist/logging/core/logger.service.d.ts.map +1 -0
  122. package/dist/logging/core/logger.service.js +34 -164
  123. package/dist/logging/core/logger.service.js.map +1 -1
  124. package/dist/logging/core/{startup-logger.service.d.ts → startup.logger.d.ts} +4 -6
  125. package/dist/logging/core/startup.logger.d.ts.map +1 -0
  126. package/dist/logging/core/{startup-logger.service.js → startup.logger.js} +36 -42
  127. package/dist/logging/core/startup.logger.js.map +1 -0
  128. package/dist/logging/index.d.ts +7 -14
  129. package/dist/logging/index.d.ts.map +1 -0
  130. package/dist/logging/index.js +17 -28
  131. package/dist/logging/index.js.map +1 -1
  132. package/dist/middleware/auth.middleware.d.ts +3 -0
  133. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  134. package/dist/middleware/auth.middleware.js +18 -0
  135. package/dist/middleware/auth.middleware.js.map +1 -0
  136. package/dist/middleware/context.middleware.d.ts +7 -0
  137. package/dist/middleware/context.middleware.d.ts.map +1 -0
  138. package/dist/middleware/context.middleware.js +25 -0
  139. package/dist/middleware/context.middleware.js.map +1 -0
  140. package/dist/middleware/index.d.ts +4 -0
  141. package/dist/middleware/index.d.ts.map +1 -0
  142. package/dist/middleware/index.js +20 -0
  143. package/dist/middleware/index.js.map +1 -0
  144. package/dist/middleware/request-logger.middleware.d.ts +4 -0
  145. package/dist/middleware/request-logger.middleware.d.ts.map +1 -0
  146. package/dist/middleware/request-logger.middleware.js +18 -0
  147. package/dist/middleware/request-logger.middleware.js.map +1 -0
  148. package/package.json +52 -47
  149. package/LICENSE +0 -21
  150. package/README.md +0 -423
  151. package/dist/config/app.config.d.ts +0 -29
  152. package/dist/config/app.config.js +0 -55
  153. package/dist/config/app.config.js.map +0 -1
  154. package/dist/controllers/config.controller.d.ts +0 -16
  155. package/dist/controllers/config.controller.js +0 -66
  156. package/dist/controllers/config.controller.js.map +0 -1
  157. package/dist/controllers/events.controller.d.ts +0 -66
  158. package/dist/controllers/events.controller.js +0 -145
  159. package/dist/controllers/events.controller.js.map +0 -1
  160. package/dist/controllers/health.controller.d.ts +0 -20
  161. package/dist/controllers/health.controller.js +0 -92
  162. package/dist/controllers/health.controller.js.map +0 -1
  163. package/dist/controllers/user.controller.d.ts +0 -13
  164. package/dist/controllers/user.controller.js +0 -209
  165. package/dist/controllers/user.controller.js.map +0 -1
  166. package/dist/core/application.d.ts +0 -21
  167. package/dist/core/application.js +0 -90
  168. package/dist/core/application.js.map +0 -1
  169. package/dist/core/config.d.ts +0 -3
  170. package/dist/core/config.js +0 -78
  171. package/dist/core/config.js.map +0 -1
  172. package/dist/core/container.d.ts +0 -17
  173. package/dist/core/container.js +0 -92
  174. package/dist/core/container.js.map +0 -1
  175. package/dist/core/errors.d.ts +0 -18
  176. package/dist/core/errors.js +0 -74
  177. package/dist/core/errors.js.map +0 -1
  178. package/dist/core/middleware.d.ts +0 -8
  179. package/dist/core/middleware.js +0 -23
  180. package/dist/core/middleware.js.map +0 -1
  181. package/dist/core/openapi.d.ts +0 -80
  182. package/dist/core/openapi.js +0 -189
  183. package/dist/core/openapi.js.map +0 -1
  184. package/dist/core/utils.d.ts +0 -7
  185. package/dist/core/utils.js +0 -75
  186. package/dist/core/utils.js.map +0 -1
  187. package/dist/core/validation.d.ts +0 -15
  188. package/dist/core/validation.js +0 -161
  189. package/dist/core/validation.js.map +0 -1
  190. package/dist/events/core/event-bus.d.ts +0 -26
  191. package/dist/events/core/event-bus.js +0 -253
  192. package/dist/events/core/event-bus.js.map +0 -1
  193. package/dist/events/core/event-registry.d.ts +0 -31
  194. package/dist/events/core/event-registry.js +0 -170
  195. package/dist/events/core/event-registry.js.map +0 -1
  196. package/dist/events/decorators/event.decorators.d.ts +0 -11
  197. package/dist/events/decorators/event.decorators.js +0 -123
  198. package/dist/events/decorators/event.decorators.js.map +0 -1
  199. package/dist/events/examples/system.events.d.ts +0 -15
  200. package/dist/events/examples/system.events.js.map +0 -1
  201. package/dist/events/examples/user.events.d.ts +0 -68
  202. package/dist/events/examples/user.events.js +0 -73
  203. package/dist/events/examples/user.events.js.map +0 -1
  204. package/dist/events/examples/user.handlers.d.ts +0 -20
  205. package/dist/events/examples/user.handlers.js +0 -157
  206. package/dist/events/examples/user.handlers.js.map +0 -1
  207. package/dist/events/middleware/logging.middleware.d.ts +0 -7
  208. package/dist/events/middleware/logging.middleware.js +0 -44
  209. package/dist/events/middleware/logging.middleware.js.map +0 -1
  210. package/dist/events/middleware/metrics.middleware.d.ts +0 -11
  211. package/dist/events/middleware/metrics.middleware.js +0 -87
  212. package/dist/events/middleware/metrics.middleware.js.map +0 -1
  213. package/dist/events/middleware/validation.middleware.d.ts +0 -8
  214. package/dist/events/middleware/validation.middleware.js +0 -63
  215. package/dist/events/middleware/validation.middleware.js.map +0 -1
  216. package/dist/events/store/memory-event-store.d.ts +0 -21
  217. package/dist/events/store/memory-event-store.js +0 -81
  218. package/dist/events/store/memory-event-store.js.map +0 -1
  219. package/dist/events/types/event.types.d.ts +0 -57
  220. package/dist/events/types/event.types.js.map +0 -1
  221. package/dist/examples/basic-api.d.ts +0 -1
  222. package/dist/examples/basic-api.js +0 -120
  223. package/dist/examples/basic-api.js.map +0 -1
  224. package/dist/logging/core/log-context.service.d.ts +0 -11
  225. package/dist/logging/core/log-context.service.js +0 -40
  226. package/dist/logging/core/log-context.service.js.map +0 -1
  227. package/dist/logging/core/startup-logger.service.js.map +0 -1
  228. package/dist/logging/decorators/log.decorator.d.ts +0 -11
  229. package/dist/logging/decorators/log.decorator.js +0 -80
  230. package/dist/logging/decorators/log.decorator.js.map +0 -1
  231. package/dist/logging/middleware/context.middleware.d.ts +0 -2
  232. package/dist/logging/middleware/context.middleware.js +0 -29
  233. package/dist/logging/middleware/context.middleware.js.map +0 -1
  234. package/dist/logging/middleware/request-logging.middleware.d.ts +0 -3
  235. package/dist/logging/middleware/request-logging.middleware.js +0 -78
  236. package/dist/logging/middleware/request-logging.middleware.js.map +0 -1
  237. package/dist/logging/types/logging.types.d.ts +0 -79
  238. package/dist/logging/types/logging.types.js +0 -3
  239. package/dist/logging/types/logging.types.js.map +0 -1
  240. package/dist/middlewares/auth.middleware.d.ts +0 -2
  241. package/dist/middlewares/auth.middleware.js +0 -20
  242. package/dist/middlewares/auth.middleware.js.map +0 -1
  243. package/dist/middlewares/cors.middleware.d.ts +0 -2
  244. package/dist/middlewares/cors.middleware.js +0 -16
  245. package/dist/middlewares/cors.middleware.js.map +0 -1
  246. package/dist/middlewares/swagger.middleware.d.ts +0 -6
  247. package/dist/middlewares/swagger.middleware.js +0 -84
  248. package/dist/middlewares/swagger.middleware.js.map +0 -1
  249. package/dist/repositories/user.repository.d.ts +0 -16
  250. package/dist/repositories/user.repository.js +0 -110
  251. package/dist/repositories/user.repository.js.map +0 -1
  252. package/dist/schemas/user.schemas.d.ts +0 -214
  253. package/dist/schemas/user.schemas.js +0 -71
  254. package/dist/schemas/user.schemas.js.map +0 -1
  255. package/dist/services/config-demo.service.d.ts +0 -10
  256. package/dist/services/config-demo.service.js +0 -88
  257. package/dist/services/config-demo.service.js.map +0 -1
  258. package/dist/services/user.service.d.ts +0 -21
  259. package/dist/services/user.service.js +0 -201
  260. package/dist/services/user.service.js.map +0 -1
  261. /package/dist/events/{types/event.types.js → event.types.js} +0 -0
package/dist/api.d.ts CHANGED
@@ -1,32 +1,13 @@
1
- import { Application } from './core/application';
2
- import { AppConfig } from './config/app.config';
3
- /**
4
- * Creates and configures a BootifyJS application
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
- swaggerOptions?: {
14
- path?: string;
15
- title?: string;
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 application_1 = require("./core/application");
5
- const user_controller_1 = require("./controllers/user.controller");
6
- const health_controller_1 = require("./controllers/health.controller");
7
- const config_controller_1 = require("./controllers/config.controller");
8
- const events_controller_1 = require("./controllers/events.controller");
9
- const app_config_1 = require("./config/app.config");
10
- const cors_middleware_1 = require("./middlewares/cors.middleware");
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
- // Initialize configuration
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
- // Log environment information
36
- logger.startup('Bootstrap process started', {
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
- // Initialize event system
46
- startupLogger.logComponentStart('Event System');
47
- const eventBus = (0, events_1.configureEventSystem)();
48
- startupLogger.logComponentComplete('Event System', {
49
- metrics: eventBus.getMetrics(),
50
- registryStats: eventBus.getRegistry().getStatistics()
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
- // Use provided controllers or default ones
53
- const controllers = options.controllers || [
54
- user_controller_1.UserController,
55
- health_controller_1.HealthController,
56
- config_controller_1.ConfigController,
57
- events_controller_1.EventsController
58
- ];
59
- // Setup middlewares
60
- const middlewares = [];
61
- // Always add context middleware first
62
- middlewares.push(logging_1.contextMiddleware);
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
- // Add Swagger middleware
102
- middlewares.push((0, swagger_middleware_1.swaggerMiddleware)(openApiSpec, {
103
- path: options.swaggerOptions?.path || '/api-docs',
104
- title: options.swaggerOptions?.title || 'BootifyJS API Documentation'
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('Application');
108
- // Create and configure the application
109
- const app = new application_1.Application({
110
- controllers,
111
- middlewares,
112
- port: appConfig.server.port,
113
- hostname: appConfig.server.host
114
- });
115
- // Return the configured application
116
- return {
117
- app,
118
- config: appConfig,
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":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Checks if a user has provided a custom cache store. If not, it registers
3
+ * the default InMemoryCacheStore. This makes the caching system work out-of-the-box.
4
+ */
5
+ export declare function bootstrapCache(): void;
6
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -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,5 @@
1
+ export * from './bootstrap';
2
+ export * from './cache.types';
3
+ export * from './decorators';
4
+ export * from './cache.service';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}