glasswork 0.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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/dist/bootstrap.d.ts +55 -0
  4. package/dist/bootstrap.d.ts.map +1 -0
  5. package/dist/bootstrap.js +359 -0
  6. package/dist/bootstrap.js.map +1 -0
  7. package/dist/core/bootstrap.d.ts +55 -0
  8. package/dist/core/bootstrap.d.ts.map +1 -0
  9. package/dist/core/bootstrap.js +329 -0
  10. package/dist/core/bootstrap.js.map +1 -0
  11. package/dist/core/module.d.ts +21 -0
  12. package/dist/core/module.d.ts.map +1 -0
  13. package/dist/core/module.js +85 -0
  14. package/dist/core/module.js.map +1 -0
  15. package/dist/core/types.d.ts +273 -0
  16. package/dist/core/types.d.ts.map +1 -0
  17. package/dist/core/types.js +2 -0
  18. package/dist/core/types.js.map +1 -0
  19. package/dist/environment.d.ts +21 -0
  20. package/dist/environment.d.ts.map +1 -0
  21. package/dist/environment.js +29 -0
  22. package/dist/environment.js.map +1 -0
  23. package/dist/error-handler.d.ts +33 -0
  24. package/dist/error-handler.d.ts.map +1 -0
  25. package/dist/error-handler.js +53 -0
  26. package/dist/error-handler.js.map +1 -0
  27. package/dist/errors.d.ts +36 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +65 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/get-client-ip.d.ts +24 -0
  32. package/dist/get-client-ip.d.ts.map +1 -0
  33. package/dist/get-client-ip.js +49 -0
  34. package/dist/get-client-ip.js.map +1 -0
  35. package/dist/http/error-handler.d.ts +33 -0
  36. package/dist/http/error-handler.d.ts.map +1 -0
  37. package/dist/http/error-handler.js +55 -0
  38. package/dist/http/error-handler.js.map +1 -0
  39. package/dist/http/errors.d.ts +36 -0
  40. package/dist/http/errors.d.ts.map +1 -0
  41. package/dist/http/errors.js +65 -0
  42. package/dist/http/errors.js.map +1 -0
  43. package/dist/http/route-helpers.d.ts +172 -0
  44. package/dist/http/route-helpers.d.ts.map +1 -0
  45. package/dist/http/route-helpers.js +249 -0
  46. package/dist/http/route-helpers.js.map +1 -0
  47. package/dist/index.d.ts +33 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +29 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/logger.d.ts +37 -0
  52. package/dist/logger.d.ts.map +1 -0
  53. package/dist/logger.js +52 -0
  54. package/dist/logger.js.map +1 -0
  55. package/dist/middleware/rate-limit.d.ts +7 -0
  56. package/dist/middleware/rate-limit.d.ts.map +1 -0
  57. package/dist/middleware/rate-limit.js +182 -0
  58. package/dist/middleware/rate-limit.js.map +1 -0
  59. package/dist/module.d.ts +21 -0
  60. package/dist/module.d.ts.map +1 -0
  61. package/dist/module.js +85 -0
  62. package/dist/module.js.map +1 -0
  63. package/dist/omit.d.ts +20 -0
  64. package/dist/omit.d.ts.map +1 -0
  65. package/dist/omit.js +28 -0
  66. package/dist/omit.js.map +1 -0
  67. package/dist/openapi/defaults.d.ts +11 -0
  68. package/dist/openapi/defaults.d.ts.map +1 -0
  69. package/dist/openapi/defaults.js +127 -0
  70. package/dist/openapi/defaults.js.map +1 -0
  71. package/dist/openapi/hooks.d.ts +14 -0
  72. package/dist/openapi/hooks.d.ts.map +1 -0
  73. package/dist/openapi/hooks.js +80 -0
  74. package/dist/openapi/hooks.js.map +1 -0
  75. package/dist/openapi/openapi.d.ts +24 -0
  76. package/dist/openapi/openapi.d.ts.map +1 -0
  77. package/dist/openapi/openapi.js +108 -0
  78. package/dist/openapi/openapi.js.map +1 -0
  79. package/dist/openapi-defaults.d.ts +11 -0
  80. package/dist/openapi-defaults.d.ts.map +1 -0
  81. package/dist/openapi-defaults.js +127 -0
  82. package/dist/openapi-defaults.js.map +1 -0
  83. package/dist/openapi-hooks.d.ts +14 -0
  84. package/dist/openapi-hooks.d.ts.map +1 -0
  85. package/dist/openapi-hooks.js +80 -0
  86. package/dist/openapi-hooks.js.map +1 -0
  87. package/dist/openapi.d.ts +24 -0
  88. package/dist/openapi.d.ts.map +1 -0
  89. package/dist/openapi.js +106 -0
  90. package/dist/openapi.js.map +1 -0
  91. package/dist/pagination.d.ts +48 -0
  92. package/dist/pagination.d.ts.map +1 -0
  93. package/dist/pagination.js +43 -0
  94. package/dist/pagination.js.map +1 -0
  95. package/dist/pick.d.ts +20 -0
  96. package/dist/pick.d.ts.map +1 -0
  97. package/dist/pick.js +28 -0
  98. package/dist/pick.js.map +1 -0
  99. package/dist/rate-limit.d.ts +7 -0
  100. package/dist/rate-limit.d.ts.map +1 -0
  101. package/dist/rate-limit.js +180 -0
  102. package/dist/rate-limit.js.map +1 -0
  103. package/dist/route-helpers.d.ts +172 -0
  104. package/dist/route-helpers.d.ts.map +1 -0
  105. package/dist/route-helpers.js +249 -0
  106. package/dist/route-helpers.js.map +1 -0
  107. package/dist/serialize-dates.d.ts +27 -0
  108. package/dist/serialize-dates.d.ts.map +1 -0
  109. package/dist/serialize-dates.js +39 -0
  110. package/dist/serialize-dates.js.map +1 -0
  111. package/dist/testing.d.ts +87 -0
  112. package/dist/testing.d.ts.map +1 -0
  113. package/dist/testing.js +94 -0
  114. package/dist/testing.js.map +1 -0
  115. package/dist/types.d.ts +273 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +2 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/utils/deep-merge.d.ts +5 -0
  120. package/dist/utils/deep-merge.d.ts.map +1 -0
  121. package/dist/utils/deep-merge.js +21 -0
  122. package/dist/utils/deep-merge.js.map +1 -0
  123. package/dist/utils/environment.d.ts +21 -0
  124. package/dist/utils/environment.d.ts.map +1 -0
  125. package/dist/utils/environment.js +29 -0
  126. package/dist/utils/environment.js.map +1 -0
  127. package/dist/utils/get-client-ip.d.ts +24 -0
  128. package/dist/utils/get-client-ip.d.ts.map +1 -0
  129. package/dist/utils/get-client-ip.js +49 -0
  130. package/dist/utils/get-client-ip.js.map +1 -0
  131. package/dist/utils/logger.d.ts +37 -0
  132. package/dist/utils/logger.d.ts.map +1 -0
  133. package/dist/utils/logger.js +52 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. package/dist/utils/omit.d.ts +20 -0
  136. package/dist/utils/omit.d.ts.map +1 -0
  137. package/dist/utils/omit.js +28 -0
  138. package/dist/utils/omit.js.map +1 -0
  139. package/dist/utils/pagination.d.ts +48 -0
  140. package/dist/utils/pagination.d.ts.map +1 -0
  141. package/dist/utils/pagination.js +42 -0
  142. package/dist/utils/pagination.js.map +1 -0
  143. package/dist/utils/pick.d.ts +20 -0
  144. package/dist/utils/pick.d.ts.map +1 -0
  145. package/dist/utils/pick.js +28 -0
  146. package/dist/utils/pick.js.map +1 -0
  147. package/dist/utils/serialize-dates.d.ts +27 -0
  148. package/dist/utils/serialize-dates.d.ts.map +1 -0
  149. package/dist/utils/serialize-dates.js +39 -0
  150. package/dist/utils/serialize-dates.js.map +1 -0
  151. package/dist/utils.d.ts +9 -0
  152. package/dist/utils.d.ts.map +1 -0
  153. package/dist/utils.js +31 -0
  154. package/dist/utils.js.map +1 -0
  155. package/package.json +79 -0
@@ -0,0 +1,55 @@
1
+ import type { AwilixContainer } from 'awilix';
2
+ import type { BootstrapOptions, BootstrapResult, ModuleConfig } from './types.js';
3
+ /**
4
+ * Bootstrap the application with modules.
5
+ *
6
+ * This function:
7
+ * 1. Creates an Awilix container (PROXY mode for Lambda compatibility)
8
+ * 2. Registers all module providers
9
+ * 3. Creates a Hono app
10
+ * 4. Applies rate limiting middleware (if configured)
11
+ * 5. Configures OpenAPI (environment-aware)
12
+ * 6. Mounts module routes
13
+ * 7. Returns both app and container (container remains accessible!)
14
+ *
15
+ * Features:
16
+ * - Automatic environment detection (development/production/test)
17
+ * - OpenAPI generation and serving (environment-aware)
18
+ * - Rate limiting with pluggable storage (memory/DynamoDB)
19
+ * - Module system with dependency injection
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const { app, container } = bootstrap(AppModule, {
24
+ * openapi: {
25
+ * enabled: true,
26
+ * documentation: { ... }
27
+ * },
28
+ * rateLimit: {
29
+ * enabled: true,
30
+ * storage: 'memory'
31
+ * }
32
+ * });
33
+ *
34
+ * // Container is still accessible for advanced use
35
+ * console.log(container.cradle.authService);
36
+ * container.register({ customService: asClass(CustomService) });
37
+ * ```
38
+ */
39
+ export declare function bootstrap(rootModule: ModuleConfig, options?: BootstrapOptions): BootstrapResult;
40
+ /**
41
+ * Collect all modules (flatten imports recursively)
42
+ * @internal - exported for testing utilities
43
+ */
44
+ export declare function collectModules(rootModule: ModuleConfig): ModuleConfig[];
45
+ /**
46
+ * Validate no circular dependencies between modules
47
+ * @internal - exported for testing utilities
48
+ */
49
+ export declare function validateNoCycles(modules: ModuleConfig[]): void;
50
+ /**
51
+ * Register module providers with Awilix container
52
+ * @internal - exported for testing utilities
53
+ */
54
+ export declare function registerModuleProviders(module: ModuleConfig, container: AwilixContainer, logger: import('../utils/logger.js').Logger): void;
55
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAY9C,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAKf,YAAY,EAKb,MAAM,YAAY,CAAC;AAwBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,YAAY,EACxB,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CA0DjB;AAsKD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,GAAG,YAAY,EAAE,CAuBvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CA2C9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,OAAO,oBAAoB,EAAE,MAAM,GAC1C,IAAI,CAQN"}
@@ -0,0 +1,329 @@
1
+ import { asClass, asValue, createContainer, InjectionMode } from 'awilix';
2
+ import { Hono } from 'hono';
3
+ import { cors } from 'hono/cors';
4
+ import { logger as honoLogger } from 'hono/logger';
5
+ import { requestId } from 'hono/request-id';
6
+ import { secureHeaders } from 'hono/secure-headers';
7
+ import { defaultErrorHandler } from '../http/error-handler.js';
8
+ import { createRateLimitMiddleware } from '../middleware/rate-limit.js';
9
+ import { configureOpenAPI } from '../openapi/openapi.js';
10
+ import { isLambda } from '../utils/environment.js';
11
+ import { createLogger, createPlainLogger } from '../utils/logger.js';
12
+ /**
13
+ * Detect environment from NODE_ENV or AWS Lambda context
14
+ */
15
+ function detectEnvironment() {
16
+ const nodeEnv = process.env.NODE_ENV;
17
+ if (nodeEnv === 'production') {
18
+ return 'production';
19
+ }
20
+ if (nodeEnv === 'test') {
21
+ return 'test';
22
+ }
23
+ // Check if running in AWS Lambda
24
+ if (process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.LAMBDA_TASK_ROOT) {
25
+ return 'production';
26
+ }
27
+ return 'development';
28
+ }
29
+ /**
30
+ * Bootstrap the application with modules.
31
+ *
32
+ * This function:
33
+ * 1. Creates an Awilix container (PROXY mode for Lambda compatibility)
34
+ * 2. Registers all module providers
35
+ * 3. Creates a Hono app
36
+ * 4. Applies rate limiting middleware (if configured)
37
+ * 5. Configures OpenAPI (environment-aware)
38
+ * 6. Mounts module routes
39
+ * 7. Returns both app and container (container remains accessible!)
40
+ *
41
+ * Features:
42
+ * - Automatic environment detection (development/production/test)
43
+ * - OpenAPI generation and serving (environment-aware)
44
+ * - Rate limiting with pluggable storage (memory/DynamoDB)
45
+ * - Module system with dependency injection
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const { app, container } = bootstrap(AppModule, {
50
+ * openapi: {
51
+ * enabled: true,
52
+ * documentation: { ... }
53
+ * },
54
+ * rateLimit: {
55
+ * enabled: true,
56
+ * storage: 'memory'
57
+ * }
58
+ * });
59
+ *
60
+ * // Container is still accessible for advanced use
61
+ * console.log(container.cradle.authService);
62
+ * container.register({ customService: asClass(CustomService) });
63
+ * ```
64
+ */
65
+ export function bootstrap(rootModule, options = {}) {
66
+ const { apiBasePath = '/api', debug = false, environment = detectEnvironment(), errorHandler = defaultErrorHandler, openapi, rateLimit, middleware, logger, } = options;
67
+ // Create logger for bootstrap process
68
+ const bootstrapLogger = createLogger('Glasswork', debug);
69
+ // Create Awilix container with PROXY mode (Lambda-compatible)
70
+ const container = createContainer({
71
+ injectionMode: InjectionMode.PROXY,
72
+ strict: true,
73
+ });
74
+ bootstrapLogger.info('Bootstrapping application...');
75
+ // Collect all modules (flatten imports)
76
+ const allModules = collectModules(rootModule);
77
+ bootstrapLogger.info(`Found ${allModules.length} modules: ${allModules.map((m) => m.name).join(', ')}`);
78
+ // Validate no circular dependencies
79
+ validateNoCycles(allModules);
80
+ // Register all providers
81
+ for (const module of allModules) {
82
+ bootstrapLogger.info(`Registering module: ${module.name}`);
83
+ registerModuleProviders(module, container, bootstrapLogger);
84
+ }
85
+ // Create Hono app and apply middleware
86
+ const app = createApp({
87
+ environment,
88
+ errorHandler,
89
+ openapi,
90
+ rateLimit,
91
+ middleware,
92
+ logger,
93
+ bootstrapLogger,
94
+ });
95
+ // Mount module routes
96
+ mountModuleRoutes({ app, modules: allModules, container, apiBasePath, bootstrapLogger });
97
+ bootstrapLogger.info('Bootstrap complete');
98
+ bootstrapLogger.info(`Environment: ${environment}`);
99
+ bootstrapLogger.info(`Registered ${Object.keys(container.cradle).length} services`);
100
+ return { app, container };
101
+ }
102
+ /**
103
+ * Create Hono app and apply middleware
104
+ */
105
+ function createApp(options) {
106
+ const app = new Hono();
107
+ applyErrorHandler(app, options);
108
+ applySecurityMiddleware(app, options);
109
+ applyLoggingMiddleware(app, options);
110
+ applyRateLimiting(app, options);
111
+ applyOpenAPIDocumentation(app, options);
112
+ return app;
113
+ }
114
+ /**
115
+ * Apply error handler to the app
116
+ */
117
+ function applyErrorHandler(app, { errorHandler, bootstrapLogger, }) {
118
+ if (errorHandler === false)
119
+ return;
120
+ bootstrapLogger.info('Applying error handler');
121
+ app.onError(errorHandler);
122
+ }
123
+ /**
124
+ * Apply security-related middleware (secure headers, request ID, CORS)
125
+ */
126
+ function applySecurityMiddleware(app, { environment, middleware, bootstrapLogger, }) {
127
+ // Secure headers (default: true in production)
128
+ if (middleware?.secureHeaders !== false && environment === 'production') {
129
+ bootstrapLogger.info('Applying secure headers');
130
+ app.use(secureHeaders());
131
+ }
132
+ // Request ID (default: true)
133
+ if (middleware?.requestId !== false) {
134
+ bootstrapLogger.info('Applying request ID middleware');
135
+ app.use(requestId());
136
+ }
137
+ // CORS
138
+ if (middleware?.cors) {
139
+ bootstrapLogger.info('Applying CORS middleware');
140
+ app.use(cors(middleware.cors));
141
+ }
142
+ }
143
+ /**
144
+ * Apply logging middleware
145
+ */
146
+ function applyLoggingMiddleware(app, { logger, bootstrapLogger, }) {
147
+ if (logger?.enabled === false)
148
+ return;
149
+ // Auto-detect plain mode based on environment if not specified
150
+ const usePlainLogger = logger?.plain ?? isLambda();
151
+ bootstrapLogger.info(`Applying logger (plain: ${usePlainLogger})`);
152
+ app.use(usePlainLogger ? createPlainLogger() : honoLogger());
153
+ }
154
+ /**
155
+ * Apply rate limiting middleware
156
+ */
157
+ function applyRateLimiting(app, { rateLimit, bootstrapLogger, }) {
158
+ if (!rateLimit?.enabled)
159
+ return;
160
+ bootstrapLogger.info(`Rate limiting enabled (${rateLimit.storage} storage, ${rateLimit.maxRequests || 100} req/${rateLimit.windowMs || 60000}ms)`);
161
+ app.use(createRateLimitMiddleware(rateLimit));
162
+ }
163
+ /**
164
+ * Apply OpenAPI documentation
165
+ */
166
+ function applyOpenAPIDocumentation(app, options) {
167
+ const { environment, openapi, rateLimit, middleware, bootstrapLogger } = options;
168
+ if (!openapi?.enabled)
169
+ return;
170
+ bootstrapLogger.info('Configuring OpenAPI');
171
+ configureOpenAPI({ app, environment, openapi, rateLimit, middleware });
172
+ }
173
+ /**
174
+ * Mount module routes to the app
175
+ */
176
+ function mountModuleRoutes(options) {
177
+ const { app, modules, container, apiBasePath, bootstrapLogger } = options;
178
+ for (const module of modules) {
179
+ if (!module.routes || !module.basePath) {
180
+ continue;
181
+ }
182
+ bootstrapLogger.info(`Mounting routes: ${apiBasePath}/${module.basePath}`);
183
+ const router = new Hono();
184
+ // Call route factory with router and services
185
+ module.routes(router, container.cradle);
186
+ // Mount at base path
187
+ app.route(`${apiBasePath}/${module.basePath}`, router);
188
+ }
189
+ }
190
+ /**
191
+ * Collect all modules (flatten imports recursively)
192
+ * @internal - exported for testing utilities
193
+ */
194
+ export function collectModules(rootModule) {
195
+ const modules = new Map();
196
+ const visited = new Set();
197
+ function collect(module) {
198
+ if (visited.has(module.name)) {
199
+ return;
200
+ }
201
+ visited.add(module.name);
202
+ modules.set(module.name, module);
203
+ // Recursively collect imports
204
+ if (module.imports) {
205
+ for (const importedModule of module.imports) {
206
+ collect(importedModule);
207
+ }
208
+ }
209
+ }
210
+ collect(rootModule);
211
+ return Array.from(modules.values());
212
+ }
213
+ /**
214
+ * Validate no circular dependencies between modules
215
+ * @internal - exported for testing utilities
216
+ */
217
+ export function validateNoCycles(modules) {
218
+ const graph = new Map();
219
+ // Build dependency graph
220
+ for (const module of modules) {
221
+ if (!graph.has(module.name)) {
222
+ graph.set(module.name, new Set());
223
+ }
224
+ if (module.imports) {
225
+ for (const importedModule of module.imports) {
226
+ graph.get(module.name)?.add(importedModule.name);
227
+ }
228
+ }
229
+ }
230
+ // Detect cycles using DFS
231
+ const visiting = new Set();
232
+ const visited = new Set();
233
+ function visit(name, path) {
234
+ if (visiting.has(name)) {
235
+ throw new Error(`Circular dependency detected: ${[...path, name].join(' -> ')}`);
236
+ }
237
+ if (visited.has(name)) {
238
+ return;
239
+ }
240
+ visiting.add(name);
241
+ const dependencies = graph.get(name) || new Set();
242
+ for (const dep of dependencies) {
243
+ visit(dep, [...path, name]);
244
+ }
245
+ visiting.delete(name);
246
+ visited.add(name);
247
+ }
248
+ for (const module of modules) {
249
+ visit(module.name, []);
250
+ }
251
+ }
252
+ /**
253
+ * Register module providers with Awilix container
254
+ * @internal - exported for testing utilities
255
+ */
256
+ export function registerModuleProviders(module, container, logger) {
257
+ if (!module.providers) {
258
+ return;
259
+ }
260
+ for (const provider of module.providers) {
261
+ registerProvider(provider, container, module.name, logger);
262
+ }
263
+ }
264
+ /**
265
+ * Register a single provider with Awilix
266
+ */
267
+ function registerProvider(provider, container, moduleName, logger) {
268
+ if (typeof provider === 'function') {
269
+ registerClassProvider(provider, container, logger);
270
+ return;
271
+ }
272
+ if ('useClass' in provider) {
273
+ registerExplicitClassProvider(provider, container, logger);
274
+ return;
275
+ }
276
+ if ('useValue' in provider) {
277
+ registerValueProvider(provider, container, logger);
278
+ return;
279
+ }
280
+ if ('useFactory' in provider) {
281
+ registerFactoryProvider(provider, container, logger);
282
+ return;
283
+ }
284
+ throw new Error(`Invalid provider configuration in module "${moduleName}"`);
285
+ }
286
+ function registerClassProvider(provider, container, logger) {
287
+ const name = camelCase(provider.name);
288
+ logger.info(` - Registering ${name} (${provider.name})`);
289
+ container.register({
290
+ [name]: asClass(provider).singleton(),
291
+ });
292
+ }
293
+ function registerExplicitClassProvider(provider, container, logger) {
294
+ const name = typeof provider.provide === 'string' ? provider.provide : camelCase(provider.provide.name);
295
+ const scope = provider.scope || 'SINGLETON';
296
+ logger.info(` - Registering ${name} (scope: ${scope})`);
297
+ const registration = asClass(provider.useClass);
298
+ container.register({
299
+ [name]: applyScopeToRegistration(registration, scope),
300
+ });
301
+ }
302
+ function registerValueProvider(provider, container, logger) {
303
+ logger.info(` - Registering ${provider.provide} (value)`);
304
+ container.register({
305
+ [provider.provide]: asValue(provider.useValue),
306
+ });
307
+ }
308
+ function registerFactoryProvider(provider, container, logger) {
309
+ logger.info(` - Registering ${provider.provide} (factory)`);
310
+ container.register({
311
+ [provider.provide]: asValue(provider.useFactory(container)),
312
+ });
313
+ }
314
+ function applyScopeToRegistration(registration, scope) {
315
+ if (scope === 'SCOPED') {
316
+ return registration.scoped();
317
+ }
318
+ if (scope === 'TRANSIENT') {
319
+ return registration.transient();
320
+ }
321
+ return registration.singleton();
322
+ }
323
+ /**
324
+ * Convert PascalCase to camelCase
325
+ */
326
+ function camelCase(str) {
327
+ return str.charAt(0).toLowerCase() + str.slice(1);
328
+ }
329
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/core/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ModuleConfig } from './types.js';
2
+ /**
3
+ * Define a module with providers, imports, and routes.
4
+ *
5
+ * This is a pure metadata function - it just returns the configuration.
6
+ * The actual registration happens in the bootstrap function.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * export const AuthModule = defineModule({
11
+ * name: 'auth',
12
+ * basePath: 'auth',
13
+ * providers: [AuthService, UserService],
14
+ * imports: [CommonModule],
15
+ * exports: [AuthService],
16
+ * routes: AuthRoutes,
17
+ * });
18
+ * ```
19
+ */
20
+ export declare function defineModule(config: ModuleConfig): ModuleConfig;
21
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAkB,MAAM,YAAY,CAAC;AAE5E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAG/D"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Define a module with providers, imports, and routes.
3
+ *
4
+ * This is a pure metadata function - it just returns the configuration.
5
+ * The actual registration happens in the bootstrap function.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * export const AuthModule = defineModule({
10
+ * name: 'auth',
11
+ * basePath: 'auth',
12
+ * providers: [AuthService, UserService],
13
+ * imports: [CommonModule],
14
+ * exports: [AuthService],
15
+ * routes: AuthRoutes,
16
+ * });
17
+ * ```
18
+ */
19
+ export function defineModule(config) {
20
+ validateModuleConfig(config);
21
+ return config;
22
+ }
23
+ function validateModuleConfig(config) {
24
+ validateModuleName(config.name);
25
+ validateProviders(config);
26
+ validateExports(config);
27
+ }
28
+ function validateModuleName(name) {
29
+ if (!name) {
30
+ throw new Error('Module name is required');
31
+ }
32
+ if (name.includes('/') || name.includes(' ')) {
33
+ throw new Error('Module name must not contain "/" or spaces');
34
+ }
35
+ }
36
+ function validateProviders(config) {
37
+ if (!config.providers) {
38
+ return;
39
+ }
40
+ for (const provider of config.providers) {
41
+ if (typeof provider !== 'function' && typeof provider !== 'object') {
42
+ throw new Error(`Invalid provider in module "${config.name}"`);
43
+ }
44
+ }
45
+ }
46
+ function validateExports(config) {
47
+ if (!config.exports || !config.providers) {
48
+ return;
49
+ }
50
+ const providerNames = collectProviderNames(config.providers);
51
+ for (const exp of config.exports) {
52
+ const exportName = getProviderName(exp);
53
+ if (!providerNames.has(exportName)) {
54
+ throw new Error(`Module "${config.name}" exports "${exportName}" but it's not in providers`);
55
+ }
56
+ }
57
+ }
58
+ function collectProviderNames(providers) {
59
+ const names = new Set();
60
+ for (const provider of providers) {
61
+ names.add(getProviderName(provider));
62
+ }
63
+ return names;
64
+ }
65
+ function getProviderName(provider) {
66
+ if (typeof provider === 'string') {
67
+ return provider;
68
+ }
69
+ if (typeof provider === 'function') {
70
+ return camelCase(provider.name);
71
+ }
72
+ if ('provide' in provider) {
73
+ return typeof provider.provide === 'string'
74
+ ? provider.provide
75
+ : camelCase(provider.provide.name);
76
+ }
77
+ return '';
78
+ }
79
+ /**
80
+ * Convert PascalCase to camelCase
81
+ */
82
+ function camelCase(str) {
83
+ return str.charAt(0).toLowerCase() + str.slice(1);
84
+ }
85
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAoB;IAChD,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,eAAe,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE7D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,cAAc,UAAU,6BAA6B,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,SAA2B;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,QAA+C;IACtE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;QAC1B,OAAO,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;YACzC,CAAC,CAAC,QAAQ,CAAC,OAAO;YAClB,CAAC,CAAC,SAAS,CAAE,QAAQ,CAAC,OAAuB,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}