@zintrust/core 0.1.25 → 0.1.27

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 (101) hide show
  1. package/package.json +1 -2
  2. package/src/boot/Application.d.ts +1 -1
  3. package/src/boot/Application.d.ts.map +1 -1
  4. package/src/boot/Application.js +3 -3
  5. package/src/boot/Server.d.ts.map +1 -1
  6. package/src/boot/Server.js +1 -1
  7. package/src/cli/commands/RoutesCommand.d.ts.map +1 -1
  8. package/src/cli/commands/RoutesCommand.js +15 -6
  9. package/src/cli/services/VersionChecker.d.ts +29 -0
  10. package/src/cli/services/VersionChecker.d.ts.map +1 -1
  11. package/src/cli/services/VersionChecker.js +111 -29
  12. package/src/collections/Collection.d.ts.map +1 -1
  13. package/src/collections/Collection.js +42 -7
  14. package/src/common/HealthRoutes.d.ts +1 -1
  15. package/src/common/HealthRoutes.d.ts.map +1 -1
  16. package/src/common/HealthRoutes.js +1 -1
  17. package/src/config/notification.js +3 -3
  18. package/src/http/Kernel.d.ts +1 -1
  19. package/src/http/Kernel.d.ts.map +1 -1
  20. package/src/http/Kernel.js +2 -2
  21. package/src/index.d.ts +4 -4
  22. package/src/index.d.ts.map +1 -1
  23. package/src/index.js +5 -5
  24. package/src/microservices/MicroserviceGenerator.js +1 -1
  25. package/src/middleware/ErrorHandlerMiddleware.js +1 -1
  26. package/src/openapi/OpenApiGenerator.d.ts +1 -1
  27. package/src/openapi/OpenApiGenerator.d.ts.map +1 -1
  28. package/src/orm/Model.js +3 -3
  29. package/src/{routing → routes}/CoreRoutes.d.ts +1 -1
  30. package/src/routes/CoreRoutes.d.ts.map +1 -0
  31. package/src/{routing → routes}/CoreRoutes.js +3 -1
  32. package/src/routes/RouteRegistry.d.ts.map +1 -0
  33. package/src/{routing → routes}/Router.d.ts +1 -1
  34. package/src/routes/Router.d.ts.map +1 -0
  35. package/src/routes/common.d.ts.map +1 -0
  36. package/src/{routing → routes}/doc.d.ts +1 -1
  37. package/src/routes/doc.d.ts.map +1 -0
  38. package/src/{routing → routes}/error.d.ts +1 -1
  39. package/src/routes/error.d.ts.map +1 -0
  40. package/src/{routing → routes}/errorPages.d.ts +1 -1
  41. package/src/routes/errorPages.d.ts.map +1 -0
  42. package/{routes → src/routes}/health.d.ts +1 -1
  43. package/src/routes/health.d.ts.map +1 -0
  44. package/{routes → src/routes}/health.js +1 -1
  45. package/src/routes/metrics.d.ts +8 -1
  46. package/src/routes/metrics.d.ts.map +1 -1
  47. package/src/routes/metrics.js +20 -1
  48. package/{routes → src/routes}/openapi.d.ts +1 -1
  49. package/src/routes/openapi.d.ts.map +1 -0
  50. package/{routes → src/routes}/openapi.js +6 -6
  51. package/src/routes/publicRoot.d.ts.map +1 -0
  52. package/src/runtime/PluginAutoImports.d.ts.map +1 -1
  53. package/src/runtime/PluginAutoImports.js +0 -10
  54. package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +21 -22
  55. package/src/testing/TestEnvironment.d.ts +1 -1
  56. package/src/testing/TestEnvironment.d.ts.map +1 -1
  57. package/src/testing/TestEnvironment.js +1 -1
  58. package/src/tools/queue/LockProvider.d.ts +0 -3
  59. package/src/tools/queue/LockProvider.d.ts.map +1 -1
  60. package/src/tools/queue/LockProvider.js +8 -2
  61. package/routes/api.d.ts +0 -7
  62. package/routes/api.d.ts.map +0 -1
  63. package/routes/api.js +0 -115
  64. package/routes/broadcast.d.ts +0 -9
  65. package/routes/broadcast.d.ts.map +0 -1
  66. package/routes/broadcast.js +0 -27
  67. package/routes/health.d.ts.map +0 -1
  68. package/routes/metrics.d.ts +0 -9
  69. package/routes/metrics.d.ts.map +0 -1
  70. package/routes/metrics.js +0 -20
  71. package/routes/openapi.d.ts.map +0 -1
  72. package/routes/storage.d.ts +0 -4
  73. package/routes/storage.d.ts.map +0 -1
  74. package/routes/storage.js +0 -35
  75. package/src/routes/api.d.ts +0 -2
  76. package/src/routes/api.d.ts.map +0 -1
  77. package/src/routes/api.js +0 -1
  78. package/src/routes/broadcast.d.ts +0 -2
  79. package/src/routes/broadcast.d.ts.map +0 -1
  80. package/src/routes/broadcast.js +0 -1
  81. package/src/routes/storage.d.ts +0 -2
  82. package/src/routes/storage.d.ts.map +0 -1
  83. package/src/routes/storage.js +0 -1
  84. package/src/routing/CoreRoutes.d.ts.map +0 -1
  85. package/src/routing/RouteRegistry.d.ts.map +0 -1
  86. package/src/routing/Router.d.ts.map +0 -1
  87. package/src/routing/common.d.ts.map +0 -1
  88. package/src/routing/doc.d.ts.map +0 -1
  89. package/src/routing/error.d.ts.map +0 -1
  90. package/src/routing/errorPages.d.ts.map +0 -1
  91. package/src/routing/publicRoot.d.ts.map +0 -1
  92. package/src/{routing → routes}/RouteRegistry.d.ts +0 -0
  93. package/src/{routing → routes}/RouteRegistry.js +0 -0
  94. package/src/{routing → routes}/Router.js +0 -0
  95. package/src/{routing → routes}/common.d.ts +0 -0
  96. package/src/{routing → routes}/common.js +0 -0
  97. package/src/{routing → routes}/doc.js +3 -3
  98. package/src/{routing → routes}/error.js +2 -2
  99. package/src/{routing → routes}/errorPages.js +3 -3
  100. /package/src/{routing → routes}/publicRoot.d.ts +0 -0
  101. /package/src/{routing → routes}/publicRoot.js +0 -0
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v0.1.25
2
+ * @zintrust/core v0.1.27
3
3
  *
4
4
  * ZinTrust Framework - Production-Grade TypeScript Backend
5
5
  * Built for performance, type safety, and exceptional developer experience
6
6
  *
7
7
  * Build Information:
8
- * Built: 2026-01-27T17:04:32.521Z
8
+ * Built: 2026-01-28T12:16:36.325Z
9
9
  * Node: >=20.0.0
10
10
  * License: MIT
11
11
  *
@@ -21,7 +21,7 @@
21
21
  * Available at runtime for debugging and health checks
22
22
  */
23
23
  export const ZINTRUST_VERSION = '0.1.23';
24
- export const ZINTRUST_BUILD_DATE = '2026-01-27T17:04:32.494Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-01-28T12:16:36.296Z'; // Replaced during build
25
25
  import { Application } from './boot/Application.js';
26
26
  import { AwsSigV4 } from './common/index.js';
27
27
  import { SignedRequest } from './security/SignedRequest.js';
@@ -67,9 +67,9 @@ export { DateTime } from './time/DateTime.js';
67
67
  export { Schema as MigrationSchema } from './migrations/schema/index.js';
68
68
  // Adapter registry (for external adapter packages)
69
69
  export { OpenApiGenerator } from './openapi/OpenApiGenerator.js';
70
+ export { Router } from './routes/Router.js';
71
+ export { normalizeRouteMeta, RouteRegistry } from './routes/RouteRegistry.js';
70
72
  export { DatabaseAdapterRegistry } from './orm/DatabaseAdapterRegistry.js';
71
- export { Router } from './routing/Router.js';
72
- export { normalizeRouteMeta, RouteRegistry } from './routing/RouteRegistry.js';
73
73
  // Common
74
74
  export { generateSecureJobId, generateUuid, getString, Utilities, } from './common/utility.js';
75
75
  export { delay, ensureDirSafe } from './common/index.js';
@@ -157,7 +157,7 @@ export default ${pascalCase(serviceName)}Kernel.create(Application.create());
157
157
  fs.writeFileSync(path.join(serviceDir, 'src', 'Kernel.ts'), code);
158
158
  };
159
159
  const generateServiceRoutes = async (serviceDir, serviceName) => {
160
- const code = `import { IRouter } from '../routing/Router';
160
+ const code = `import { IRouter } from '@routing/Router';
161
161
 
162
162
  /**
163
163
  * ${serviceName} service routes
@@ -1,6 +1,6 @@
1
- import ErrorRouting from '../routing/error.js';
2
1
  import { Env } from '../config/env.js';
3
2
  import { Logger } from '../config/logger.js';
3
+ import ErrorRouting from '../routes/error.js';
4
4
  import { ErrorResponse } from '../http/ErrorResponse.js';
5
5
  import { RequestContext } from '../http/RequestContext.js';
6
6
  const isWritableEnded = (res) => {
@@ -1,4 +1,4 @@
1
- import type { RouteRegistration } from '../routing/RouteRegistry';
1
+ import type { RouteRegistration } from '../routes/RouteRegistry';
2
2
  type OpenApiSchema = {
3
3
  type?: string;
4
4
  format?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenApiGenerator.d.ts","sourceRoot":"","sources":["../../../src/openapi/OpenApiGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,wBAAwB,CAAC;AAGlF,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE;YACP,kBAAkB,EAAE;gBAClB,MAAM,EAAE,aAAa,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CACf,MAAM,EACN;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE;YACR,kBAAkB,EAAE;gBAClB,MAAM,EAAE,aAAa,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CACF,CAAC;CACH,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAkVF,eAAO,MAAM,gBAAgB;qBACV,iBAAiB,EAAE,WAAW,uBAAuB,GAAG,eAAe;EAyCxF,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"OpenApiGenerator.d.ts","sourceRoot":"","sources":["../../../src/openapi/OpenApiGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,4BAA4B,CAAC;AAGtF,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE;YACP,kBAAkB,EAAE;gBAClB,MAAM,EAAE,aAAa,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CAAC;IACF,SAAS,EAAE,MAAM,CACf,MAAM,EACN;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE;YACR,kBAAkB,EAAE;gBAClB,MAAM,EAAE,aAAa,CAAC;aACvB,CAAC;SACH,CAAC;KACH,CACF,CAAC;CACH,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAkVF,eAAO,MAAM,gBAAgB;qBACV,iBAAiB,EAAE,WAAW,uBAAuB,GAAG,eAAe;EAyCxF,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
package/src/orm/Model.js CHANGED
@@ -347,8 +347,8 @@ const createRelationMapping = (cfg, resolveMethods) => {
347
347
  const hydrateRows = (raw, hydrateModel) => {
348
348
  if (!Array.isArray(raw))
349
349
  return null;
350
- const rows = raw.filter(isRecord);
351
- return rows.map(hydrateModel);
350
+ const rows = raw.filter((element) => isRecord(element));
351
+ return rows.map((element) => hydrateModel(element));
352
352
  };
353
353
  const loadEagerRelations = async (eagerBuilder, models) => {
354
354
  const eagerLoads = typeof eagerBuilder.getEagerLoads === 'function' ? eagerBuilder.getEagerLoads() : undefined;
@@ -476,7 +476,7 @@ const createDefinedModelInternal = (cfg, methodsOrPlan, attach, resolveMethods)
476
476
  if (typeof hydrate !== 'function')
477
477
  continue;
478
478
  if (Array.isArray(data)) {
479
- const relatedModels = data.filter(isRecord).map((d) => hydrate(d));
479
+ const relatedModels = data.filter((element) => isRecord(element)).map((d) => hydrate(d));
480
480
  model.setRelation(name, relatedModels);
481
481
  continue;
482
482
  }
@@ -3,7 +3,7 @@
3
3
  * Health, metrics, and documentation endpoints
4
4
  * Not customizable by developers; provide env-based configuration
5
5
  */
6
- import type { IRouter } from '../routing/Router';
6
+ import type { IRouter } from './Router';
7
7
  /**
8
8
  * Register all core framework routes
9
9
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoreRoutes.d.ts","sourceRoot":"","sources":["../../../src/routes/CoreRoutes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAoBnD;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,OAAO,KAAG,IAOpD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -4,12 +4,13 @@
4
4
  * Not customizable by developers; provide env-based configuration
5
5
  */
6
6
  import { PrometheusMetrics } from '../observability/PrometheusMetrics.js';
7
- import { Router } from '../routing/Router.js';
7
+ import { registerOpenApiRoutes } from '../routes/openapi.js';
8
8
  import { registerHealthRoutes } from '../common/HealthRoutes.js';
9
9
  import { Env } from '../config/env.js';
10
10
  import { registerDocRoutes } from './doc.js';
11
11
  import { registerErrorRoutes } from './error.js';
12
12
  import { registerErrorPagesRoutes } from './errorPages.js';
13
+ import { Router } from './Router.js';
13
14
  /**
14
15
  * Register metrics endpoint
15
16
  */
@@ -33,5 +34,6 @@ export const registerCoreRoutes = (router) => {
33
34
  registerDocRoutes(router);
34
35
  registerErrorPagesRoutes(router);
35
36
  registerErrorRoutes(router);
37
+ registerOpenApiRoutes(router);
36
38
  };
37
39
  export default registerCoreRoutes;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteRegistry.d.ts","sourceRoot":"","sources":["../../../src/routes/RouteRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEjE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,CAAC;AAEpD,MAAM,MAAM,cAAc,GACtB,SAAS,GACT;IACE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEzB,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,gBAAgB,CAAC;QAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;QAC/B,YAAY,CAAC,EAAE,gBAAgB,CAAC;QAChC,aAAa,CAAC,EAAE,gBAAgB,CAAC;KAClC,CAAC;IAEF,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,SAAS,GAAG,SAwCvE,CAAC;AAUF,eAAO,MAAM,aAAa;kBACV,iBAAiB,GAAG,IAAI;YAI9B,SAAS,iBAAiB,EAAE;aAK3B,IAAI;EAGb,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -1,6 +1,6 @@
1
+ import { type RouteMeta, type RouteMetaInput } from './RouteRegistry';
1
2
  import type { IRequest } from '../http/Request';
2
3
  import type { IResponse } from '../http/Response';
3
- import { type RouteMeta, type RouteMetaInput } from './RouteRegistry';
4
4
  /**
5
5
  * Router - HTTP Routing Engine
6
6
  * Matches incoming requests to route handlers
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../src/routes/Router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/routes/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgBjD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,KAAG,MAMrD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,cAAc,MAAM,KAAG,MAAM,GAAG,SAQhF,CAAC"}
@@ -2,8 +2,8 @@
2
2
  * Documentation Routes
3
3
  * Serves static files from /doc/* paths with relaxed CSP headers.
4
4
  */
5
- import type { IResponse } from '../http/Response';
6
5
  import type { IRouter } from './Router';
6
+ import type { IResponse } from '../http/Response';
7
7
  export { MIME_TYPES_MAP } from './common';
8
8
  /**
9
9
  * Find the package root directory
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/routes/doc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,aAAa,EACb,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAiBjC;;GAEG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,SAAS,KAAG,IAWhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,EACf,UAAU,SAAS,KAClB,OAAO,CAAC,OAAO,CAgDjB,CAAC;AASF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,OAAO,KAAG,IAMnD,CAAC;;gCANwC,OAAO,KAAG,IAAI;2CA5EH,SAAS,KAAG,IAAI;2CAiB1D,MAAM,YACL,SAAS,KAClB,OAAO,CAAC,OAAO,CAAC;;AAiEnB,wBAIE"}
@@ -2,10 +2,10 @@
2
2
  * Error Routing
3
3
  * Centralizes 404/500 handling and HTML error page rendering.
4
4
  */
5
+ import type { IRouter } from './Router';
5
6
  import type { IRequest } from '../http/Request';
6
7
  import type { IResponse } from '../http/Response';
7
8
  import type * as http from '../node-singletons/http';
8
- import type { IRouter } from './Router';
9
9
  /**
10
10
  * Debug routes to always render 404/500 responses.
11
11
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/routes/error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAyJnD;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,OAAO,KAAG,IAGrD,CAAC;AAEF,eAAO,MAAM,YAAY;;kCALmB,OAAO,KAAG,IAAI;8BAlGzB,QAAQ,YAAY,SAAS,cAAc,MAAM,KAAG,IAAI;qDAiB9E,QAAQ,YACP,SAAS,SACZ,OAAO,cACF,MAAM,KACjB,IAAI;wCA0DoC,IAAI,CAAC,cAAc,KAAG,IAAI;EA8BnE,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -2,8 +2,8 @@
2
2
  * Error Pages Static Assets
3
3
  * Serves /error-pages/* assets (CSS/JS/SVG/etc) used by HTML error templates.
4
4
  */
5
- import type { IResponse } from '../http/Response';
6
5
  import type { IRouter } from './Router';
6
+ import type { IResponse } from '../http/Response';
7
7
  export declare const serveErrorPagesFile: (urlPath: string, response: IResponse) => boolean;
8
8
  export declare const registerErrorPagesRoutes: (router: IRouter) => void;
9
9
  declare const _default: {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorPages.d.ts","sourceRoot":"","sources":["../../../src/routes/errorPages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAkChD,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,UAAU,SAAS,KAAG,OAsD1E,CAAC;AAeF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,OAAO,KAAG,IAO1D,CAAC;;uCAP+C,OAAO,KAAG,IAAI;mCArElB,MAAM,YAAY,SAAS,KAAG,OAAO;;AA8ElF,wBAAiE"}
@@ -2,5 +2,5 @@
2
2
  * Health Routes - Re-export from shared module
3
3
  * This file maintains backward compatibility while eliminating duplication
4
4
  */
5
- export { registerHealthRoutes } from '../src/common/HealthRoutes';
5
+ export { registerHealthRoutes } from '../common/HealthRoutes';
6
6
  //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/routes/health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -2,4 +2,4 @@
2
2
  * Health Routes - Re-export from shared module
3
3
  * This file maintains backward compatibility while eliminating duplication
4
4
  */
5
- export { registerHealthRoutes } from '../src/common/HealthRoutes.js';
5
+ export { registerHealthRoutes } from '../common/HealthRoutes.js';
@@ -1,2 +1,9 @@
1
- export { registerMetricsRoutes } from '../../routes/metrics';
1
+ /**
2
+ * Metrics Routes
3
+ *
4
+ * Exposes Prometheus metrics when enabled.
5
+ */
6
+ import { type IRouter } from './Router';
7
+ export declare function registerMetricsRoutes(router: IRouter): void;
8
+ export default registerMetricsRoutes;
2
9
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/routes/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/routes/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,qBAAqB,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAW3D;AAED,eAAe,qBAAqB,CAAC"}
@@ -1 +1,20 @@
1
- export { registerMetricsRoutes } from '../../routes/metrics.js';
1
+ /**
2
+ * Metrics Routes
3
+ *
4
+ * Exposes Prometheus metrics when enabled.
5
+ */
6
+ import { PrometheusMetrics } from '../observability/PrometheusMetrics.js';
7
+ import { Env } from '../config/env.js';
8
+ import { Router } from './Router.js';
9
+ export function registerMetricsRoutes(router) {
10
+ if (Env.getBool('METRICS_ENABLED', false) === false)
11
+ return;
12
+ const pathFromEnv = Env.get('METRICS_PATH', '/metrics').trim();
13
+ const path = pathFromEnv === '' ? '/metrics' : pathFromEnv;
14
+ Router.get(router, path, async (_req, res) => {
15
+ const { contentType, body } = await PrometheusMetrics.getMetricsText();
16
+ res.setHeader('Content-Type', contentType);
17
+ res.send(body);
18
+ });
19
+ }
20
+ export default registerMetricsRoutes;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Serves a generated OpenAPI spec from the in-memory RouteRegistry.
5
5
  */
6
- import { type IRouter } from '../src/routing/Router';
6
+ import { type IRouter } from './Router';
7
7
  export declare function registerOpenApiRoutes(router: IRouter): void;
8
8
  export default registerOpenApiRoutes;
9
9
  //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../../src/routes/openapi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,qBAAqB,CAAC;AA2C3D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAuC3D;AAED,eAAe,qBAAqB,CAAC"}
@@ -3,10 +3,10 @@
3
3
  *
4
4
  * Serves a generated OpenAPI spec from the in-memory RouteRegistry.
5
5
  */
6
- import { OpenApiGenerator } from '../src/openapi/OpenApiGenerator.js';
7
- import { Env } from '../src/config/env.js';
8
- import { Router } from '../src/routing/Router.js';
9
- import { RouteRegistry } from '../src/routing/RouteRegistry.js';
6
+ import { OpenApiGenerator } from '../openapi/OpenApiGenerator.js';
7
+ import { Env } from '../config/env.js';
8
+ import { Router } from './Router.js';
9
+ import { RouteRegistry } from './RouteRegistry.js';
10
10
  const getServerUrl = () => {
11
11
  const explicit = Env.BASE_URL;
12
12
  if (explicit.trim() !== '')
@@ -46,7 +46,7 @@ const getDocsHtml = (specUrl) => `<!doctype html>
46
46
  </body>
47
47
  </html>`;
48
48
  export function registerOpenApiRoutes(router) {
49
- Router.get(router, '/openapi.json', async (_req, res) => {
49
+ Router.get(router, '/openapi.json', (_req, res) => {
50
50
  // Convert readonly to mutable array for OpenApiGenerator
51
51
  const routes = Array.from(RouteRegistry.list());
52
52
  const doc = OpenApiGenerator.generate(routes, {
@@ -63,7 +63,7 @@ export function registerOpenApiRoutes(router) {
63
63
  responseStatus: 200,
64
64
  },
65
65
  });
66
- Router.get(router, '/docs', async (_req, res) => {
66
+ Router.get(router, '/docs', (_req, res) => {
67
67
  res.html(getDocsHtml('/openapi.json'));
68
68
  }, {
69
69
  meta: {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicRoot.d.ts","sourceRoot":"","sources":["../../../src/routes/publicRoot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,MAalD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAkB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAO,MAAM,EAIhD,CAAC;AAEF,eAAO,MAAM,4BAA4B,QAAa,OAAO,CAAC,MAAM,EAAE,CAIrE,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAO,MAgBhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,MAAM,CA+BzD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PluginAutoImports.d.ts","sourceRoot":"","sources":["../../../src/runtime/PluginAutoImports.ts"],"names":[],"mappings":"AAOA,KAAK,YAAY,GACb;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAwBN,eAAO,MAAM,iBAAiB;IAC5B;;;;;;OAMG;mCACkC,OAAO,CAAC,YAAY,CAAC;EAgC1D,CAAC"}
1
+ {"version":3,"file":"PluginAutoImports.d.ts","sourceRoot":"","sources":["../../../src/runtime/PluginAutoImports.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GACb;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAwBN,eAAO,MAAM,iBAAiB;IAC5B;;;;;;OAMG;mCACkC,OAAO,CAAC,YAAY,CAAC;EAqB1D,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { pathToFileURL } from '../node-singletons/url.js';
2
2
  import { readEnvString } from '../common/ExternalServiceUtils.js';
3
3
  import { Logger } from '../config/logger.js';
4
- import { ErrorFactory } from '../exceptions/ZintrustError.js';
5
4
  import { existsSync } from '../node-singletons/fs.js';
6
5
  import * as path from '../node-singletons/path.js';
7
6
  const getProjectCwd = () => process.cwd();
@@ -45,15 +44,6 @@ export const PluginAutoImports = Object.freeze({
45
44
  }
46
45
  catch (error) {
47
46
  const errorMessage = error instanceof Error ? error.message : String(error);
48
- Logger.warn('[plugins] Failed to import plugin auto-imports', {
49
- candidate,
50
- errorMessage,
51
- });
52
- // Keep error creation for consistent structure (but do not throw).
53
- ErrorFactory.createTryCatchError('Failed to import project plugin auto-imports', {
54
- candidate,
55
- error,
56
- });
57
47
  return { ok: false, loadedPath: candidate, reason: 'import-failed', errorMessage };
58
48
  }
59
49
  }
@@ -3,20 +3,17 @@
3
3
  * Minimal, real auth endpoints backing the example API routes.
4
4
  */
5
5
 
6
+ import { User } from '@app/Models/User';
7
+ import type { AuthControllerApi, JsonRecord, UserRow } from '@app/Types/controller';
8
+ import type { IRequest, IResponse } from '@zintrust/core';
6
9
  import {
7
- getString,
8
10
  Auth,
11
+ JwtManager,
9
12
  Logger,
13
+ TokenRevocation,
14
+ getString,
10
15
  getValidatedBody,
11
- useDatabase,
12
- QueryBuilder,
13
- JwtManager,
14
- TokenRevocation
15
16
  } from '@zintrust/core';
16
- import type { AuthControllerApi, JsonRecord, UserRow } from '@app/Types/controller';
17
- import type { IRequest, IResponse } from '@zintrust/core';
18
- import User from '@app/Models/User';
19
-
20
17
 
21
18
  const pickPublicUser = (row: UserRow): { id: unknown; name: string; email: string } => {
22
19
  return {
@@ -131,12 +128,7 @@ async function register(req: IRequest, res: IResponse): Promise<void> {
131
128
  const ipAddress = req.getRaw().socket.remoteAddress ?? 'unknown';
132
129
 
133
130
  try {
134
- const db = useDatabase();
135
-
136
- const existing = await QueryBuilder.create('users', db)
137
- .where('email', '=', email)
138
- .limit(1)
139
- .first<UserRow>();
131
+ const existing = await User.where('email', '=', email).limit(1).first<UserRow>();
140
132
 
141
133
  if (existing !== null) {
142
134
  Logger.warn('AuthController.register: duplicate email attempt', {
@@ -150,19 +142,26 @@ async function register(req: IRequest, res: IResponse): Promise<void> {
150
142
 
151
143
  const passwordHash = await Auth.hash(password);
152
144
 
153
- await QueryBuilder.create('users', db).insert({
145
+ const result = await User.query().insert({
154
146
  name,
155
147
  email,
156
148
  password: passwordHash,
157
149
  });
158
150
 
159
- Logger.info('AuthController.register: successful registration', {
160
- email,
161
- ip: ipAddress,
162
- timestamp: new Date().toISOString(),
163
- });
151
+ if (result.id !== null && result.id !== undefined) {
152
+ Logger.info('AuthController.register: successful registration', {
153
+ user_id: result.id,
154
+ email,
155
+ ip: ipAddress,
156
+ timestamp: new Date().toISOString(),
157
+ });
164
158
 
165
- res.setStatus(201).json({ message: 'Registered' });
159
+ res.setStatus(201).json({ message: 'Registered' });
160
+ } else {
161
+ Logger.error('Failed to retrieve inserted user ID');
162
+ res.setStatus(500).json({ error: 'Registration failed' });
163
+ }
164
+ return;
166
165
  } catch (error) {
167
166
  Logger.error('AuthController.register failed', error);
168
167
  res.setStatus(500).json({ error: 'Registration failed' });
@@ -1,6 +1,6 @@
1
1
  import { type IServiceContainer } from '../container/ServiceContainer';
2
2
  import { type IKernel } from '../http/Kernel';
3
- import { type IRouter } from '../routing/Router';
3
+ import { type IRouter } from '../routes/Router';
4
4
  export type TestHeaders = Record<string, string>;
5
5
  export type TestRequestInput = {
6
6
  method: string;
@@ -1 +1 @@
1
- {"version":3,"file":"TestEnvironment.d.ts","sourceRoot":"","sources":["../../../src/testing/TestEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGxD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC;AA2HF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;IACvD,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,eAAe;qBACV,sBAAsB,GAAQ,gBAAgB;EA6C9D,CAAC"}
1
+ {"version":3,"file":"TestEnvironment.d.ts","sourceRoot":"","sources":["../../../src/testing/TestEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC;AA2HF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC;IACvD,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,eAAe;qBACV,sBAAsB,GAAQ,gBAAgB;EA6C9D,CAAC"}
@@ -2,7 +2,7 @@ import { ServiceContainer } from '../container/ServiceContainer.js';
2
2
  import { Kernel } from '../http/Kernel.js';
3
3
  import { Request } from '../http/Request.js';
4
4
  import { Response } from '../http/Response.js';
5
- import { Router } from '../routing/Router.js';
5
+ import { Router } from '../routes/Router.js';
6
6
  const lowerCaseHeaders = (headers) => {
7
7
  if (!headers)
8
8
  return {};
@@ -7,9 +7,6 @@ import type { LockProvider, LockProviderConfig } from '../../types/Queue';
7
7
  * Redis-based Lock Provider Implementation
8
8
  */
9
9
  export declare function createRedisLockProvider(config: LockProviderConfig): LockProvider;
10
- /**
11
- * Memory-based Lock Provider (for testing/sync driver)
12
- */
13
10
  export declare function createMemoryLockProvider(config: LockProviderConfig): LockProvider;
14
11
  export declare function registerLockProvider(name: string, provider: LockProvider): void;
15
12
  export declare function getLockProvider(name: string): LockProvider | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"LockProvider.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/LockProvider.ts"],"names":[],"mappings":"AACA;;;GAGG;AAGH,OAAO,KAAK,EAGV,YAAY,EACZ,kBAAkB,EAEnB,MAAM,eAAe,CAAC;AAwKvB;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAWhF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CA4FjF;AAOD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAG/E;AACD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAS3E"}
1
+ {"version":3,"file":"LockProvider.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/LockProvider.ts"],"names":[],"mappings":"AACA;;;GAGG;AAGH,OAAO,KAAK,EAGV,YAAY,EACZ,kBAAkB,EAEnB,MAAM,eAAe,CAAC;AAwKvB;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAWhF;AAYD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CA4FjF;AAOD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAG/E;AACD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAS3E"}
@@ -165,6 +165,12 @@ export function createRedisLockProvider(config) {
165
165
  /**
166
166
  * Memory-based Lock Provider (for testing/sync driver)
167
167
  */
168
+ function globToRegExp(pattern) {
169
+ // Escape all regex metacharacters, then turn '*' into '.*' as a wildcard
170
+ const escaped = pattern.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
171
+ const regexSource = escaped.replaceAll(String.raw `\*`, '.*');
172
+ return new RegExp(`^${regexSource}$`);
173
+ }
168
174
  export function createMemoryLockProvider(config) {
169
175
  const locks = new Map();
170
176
  const prefix = config.prefix ?? ZintrustLang.MEMORY_LOCKS;
@@ -230,8 +236,8 @@ export function createMemoryLockProvider(config) {
230
236
  };
231
237
  },
232
238
  async list(pattern = '*') {
233
- // Simple regex match for memory provider
234
- const regex = new RegExp(pattern.replace('*', '.*'));
239
+ // Simple glob-style match for memory provider ('*' as wildcard)
240
+ const regex = globToRegExp(pattern);
235
241
  const keys = [];
236
242
  for (const key of locks.keys()) {
237
243
  const strippedKey = key.replace(prefix, '');
package/routes/api.d.ts DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * Example Routes
3
- * Demonstrates routing patterns
4
- */
5
- import { type IRouter } from '../src/routing/Router';
6
- export declare function registerRoutes(router: IRouter): void;
7
- //# sourceMappingURL=api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../routes/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAMpD"}
package/routes/api.js DELETED
@@ -1,115 +0,0 @@
1
- /**
2
- * Example Routes
3
- * Demonstrates routing patterns
4
- */
5
- import { AuthController } from '../app/Controllers/AuthController.js';
6
- import { UserQueryBuilderController } from '../app/Controllers/UserQueryBuilderController.js';
7
- import { Env } from '../src/config/env.js';
8
- import { registerBroadcastRoutes } from './broadcast.js';
9
- import { registerHealthRoutes } from './health.js';
10
- import { registerMetricsRoutes } from './metrics.js';
11
- import { registerOpenApiRoutes } from './openapi.js';
12
- import { registerStorageRoutes } from './storage.js';
13
- import { Router } from '../src/routing/Router.js';
14
- export function registerRoutes(router) {
15
- const authController = AuthController.create();
16
- const userController = UserQueryBuilderController.create();
17
- registerPublicRoutes(router);
18
- registerApiV1Routes(router, authController, userController);
19
- registerAdminRoutes(router);
20
- }
21
- /**
22
- * Register public routes
23
- */
24
- function registerPublicRoutes(router) {
25
- registerRootRoute(router);
26
- registerHealthRoutes(router);
27
- registerMetricsRoutes(router);
28
- registerBroadcastRoutes(router);
29
- registerOpenApiRoutes(router);
30
- registerStorageRoutes(router);
31
- }
32
- function registerRootRoute(router) {
33
- Router.get(router, '/', async (_req, res) => {
34
- res.json({
35
- framework: 'ZinTrust Framework',
36
- app_name: Env.APP_NAME,
37
- version: '0.1.0',
38
- env: Env.NODE_ENV ?? 'development',
39
- database: Env.DB_CONNECTION ?? 'sqlite',
40
- });
41
- });
42
- }
43
- /**
44
- * Register API V1 routes
45
- */
46
- function registerApiV1Routes(router, authController, userController) {
47
- Router.group(router, '/api/v1', (r) => {
48
- // Auth routes
49
- Router.post(r, '/auth/login', authController.login, {
50
- middleware: ['authRateLimit', 'validateLogin'],
51
- });
52
- Router.post(r, '/auth/register', authController.register, {
53
- middleware: ['authRateLimit', 'validateRegister'],
54
- });
55
- Router.post(r, '/auth/logout', authController.logout, {
56
- middleware: ['auth', 'jwt'],
57
- });
58
- Router.post(r, '/auth/refresh', authController.refresh, {
59
- middleware: ['auth', 'jwt'],
60
- });
61
- // Protected routes (Router supports per-route middleware metadata)
62
- const pr = r;
63
- // User resource (REST-ish)
64
- Router.resource(pr, '/users', {
65
- index: userController.index,
66
- store: userController.store,
67
- show: userController.show,
68
- update: userController.update,
69
- destroy: userController.destroy,
70
- }, {
71
- middleware: ['auth', 'jwt'],
72
- store: { middleware: ['auth', 'jwt', 'userMutationRateLimit', 'validateUserStore'] },
73
- update: { middleware: ['auth', 'jwt', 'userMutationRateLimit', 'validateUserUpdate'] },
74
- destroy: { middleware: ['auth', 'jwt', 'userMutationRateLimit'] },
75
- });
76
- Router.post(pr, '/users/fill', userController.fill, {
77
- middleware: ['auth', 'jwt', 'fillRateLimit', 'validateUserFill'],
78
- });
79
- // If the controller exposes create/edit, wire them explicitly.
80
- Router.get(pr, '/users/create', userController.create, {
81
- middleware: ['auth', 'jwt'],
82
- });
83
- Router.get(pr, '/users/:id/edit', userController.edit, {
84
- middleware: ['auth', 'jwt'],
85
- });
86
- // Custom user routes
87
- Router.get(pr, '/profile', async (__req, res) => {
88
- res.json({ message: 'Get user profile' });
89
- }, { middleware: ['auth', 'jwt'] });
90
- Router.put(pr, '/profile', async (__req, res) => {
91
- res.json({ message: 'Update user profile' });
92
- }, { middleware: ['auth', 'jwt'] });
93
- // Posts resource
94
- Router.get(r, '/posts', async (_req, res) => {
95
- res.json({ data: [] });
96
- });
97
- Router.get(r, '/posts/:id', async (req, res) => {
98
- const id = req.getParam('id');
99
- res.json({ data: { id } });
100
- });
101
- });
102
- }
103
- /**
104
- * Register admin routes
105
- */
106
- function registerAdminRoutes(router) {
107
- Router.group(router, '/admin', (r) => {
108
- Router.get(r, '/dashboard', async (__req, res) => {
109
- res.json({ message: 'Admin dashboard' });
110
- });
111
- Router.get(r, '/users', async (__req, res) => {
112
- res.json({ data: [] });
113
- });
114
- });
115
- }