@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.
- package/package.json +1 -2
- package/src/boot/Application.d.ts +1 -1
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +3 -3
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/Server.js +1 -1
- package/src/cli/commands/RoutesCommand.d.ts.map +1 -1
- package/src/cli/commands/RoutesCommand.js +15 -6
- package/src/cli/services/VersionChecker.d.ts +29 -0
- package/src/cli/services/VersionChecker.d.ts.map +1 -1
- package/src/cli/services/VersionChecker.js +111 -29
- package/src/collections/Collection.d.ts.map +1 -1
- package/src/collections/Collection.js +42 -7
- package/src/common/HealthRoutes.d.ts +1 -1
- package/src/common/HealthRoutes.d.ts.map +1 -1
- package/src/common/HealthRoutes.js +1 -1
- package/src/config/notification.js +3 -3
- package/src/http/Kernel.d.ts +1 -1
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +2 -2
- package/src/index.d.ts +4 -4
- package/src/index.d.ts.map +1 -1
- package/src/index.js +5 -5
- package/src/microservices/MicroserviceGenerator.js +1 -1
- package/src/middleware/ErrorHandlerMiddleware.js +1 -1
- package/src/openapi/OpenApiGenerator.d.ts +1 -1
- package/src/openapi/OpenApiGenerator.d.ts.map +1 -1
- package/src/orm/Model.js +3 -3
- package/src/{routing → routes}/CoreRoutes.d.ts +1 -1
- package/src/routes/CoreRoutes.d.ts.map +1 -0
- package/src/{routing → routes}/CoreRoutes.js +3 -1
- package/src/routes/RouteRegistry.d.ts.map +1 -0
- package/src/{routing → routes}/Router.d.ts +1 -1
- package/src/routes/Router.d.ts.map +1 -0
- package/src/routes/common.d.ts.map +1 -0
- package/src/{routing → routes}/doc.d.ts +1 -1
- package/src/routes/doc.d.ts.map +1 -0
- package/src/{routing → routes}/error.d.ts +1 -1
- package/src/routes/error.d.ts.map +1 -0
- package/src/{routing → routes}/errorPages.d.ts +1 -1
- package/src/routes/errorPages.d.ts.map +1 -0
- package/{routes → src/routes}/health.d.ts +1 -1
- package/src/routes/health.d.ts.map +1 -0
- package/{routes → src/routes}/health.js +1 -1
- package/src/routes/metrics.d.ts +8 -1
- package/src/routes/metrics.d.ts.map +1 -1
- package/src/routes/metrics.js +20 -1
- package/{routes → src/routes}/openapi.d.ts +1 -1
- package/src/routes/openapi.d.ts.map +1 -0
- package/{routes → src/routes}/openapi.js +6 -6
- package/src/routes/publicRoot.d.ts.map +1 -0
- package/src/runtime/PluginAutoImports.d.ts.map +1 -1
- package/src/runtime/PluginAutoImports.js +0 -10
- package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +21 -22
- package/src/testing/TestEnvironment.d.ts +1 -1
- package/src/testing/TestEnvironment.d.ts.map +1 -1
- package/src/testing/TestEnvironment.js +1 -1
- package/src/tools/queue/LockProvider.d.ts +0 -3
- package/src/tools/queue/LockProvider.d.ts.map +1 -1
- package/src/tools/queue/LockProvider.js +8 -2
- package/routes/api.d.ts +0 -7
- package/routes/api.d.ts.map +0 -1
- package/routes/api.js +0 -115
- package/routes/broadcast.d.ts +0 -9
- package/routes/broadcast.d.ts.map +0 -1
- package/routes/broadcast.js +0 -27
- package/routes/health.d.ts.map +0 -1
- package/routes/metrics.d.ts +0 -9
- package/routes/metrics.d.ts.map +0 -1
- package/routes/metrics.js +0 -20
- package/routes/openapi.d.ts.map +0 -1
- package/routes/storage.d.ts +0 -4
- package/routes/storage.d.ts.map +0 -1
- package/routes/storage.js +0 -35
- package/src/routes/api.d.ts +0 -2
- package/src/routes/api.d.ts.map +0 -1
- package/src/routes/api.js +0 -1
- package/src/routes/broadcast.d.ts +0 -2
- package/src/routes/broadcast.d.ts.map +0 -1
- package/src/routes/broadcast.js +0 -1
- package/src/routes/storage.d.ts +0 -2
- package/src/routes/storage.d.ts.map +0 -1
- package/src/routes/storage.js +0 -1
- package/src/routing/CoreRoutes.d.ts.map +0 -1
- package/src/routing/RouteRegistry.d.ts.map +0 -1
- package/src/routing/Router.d.ts.map +0 -1
- package/src/routing/common.d.ts.map +0 -1
- package/src/routing/doc.d.ts.map +0 -1
- package/src/routing/error.d.ts.map +0 -1
- package/src/routing/errorPages.d.ts.map +0 -1
- package/src/routing/publicRoot.d.ts.map +0 -1
- package/src/{routing → routes}/RouteRegistry.d.ts +0 -0
- package/src/{routing → routes}/RouteRegistry.js +0 -0
- package/src/{routing → routes}/Router.js +0 -0
- package/src/{routing → routes}/common.d.ts +0 -0
- package/src/{routing → routes}/common.js +0 -0
- package/src/{routing → routes}/doc.js +3 -3
- package/src/{routing → routes}/error.js +2 -2
- package/src/{routing → routes}/errorPages.js +3 -3
- /package/src/{routing → routes}/publicRoot.d.ts +0 -0
- /package/src/{routing → routes}/publicRoot.js +0 -0
package/src/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @zintrust/core v0.1.
|
|
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-
|
|
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-
|
|
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 '
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenApiGenerator.d.ts","sourceRoot":"","sources":["../../../src/openapi/OpenApiGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,
|
|
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
|
}
|
|
@@ -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 {
|
|
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":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEnF,MAAM,MAAM,YAAY,CAAC,cAAc,SAAS,MAAM,GAAG,MAAM,IAAI;IACjE,UAAU,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAE3D,MAAM,MAAM,YAAY,CAAC,cAAc,SAAS,MAAM,GAAG,MAAM,IAAI;IACjE,UAAU,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,CAAC,cAAc,SAAS,MAAM,GAAG,MAAM,IAChE,YAAY,CAAC,cAAc,CAAC,GAAG;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;CACxC,CAAC;AAEJ,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjC,mBAAmB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,OAI9B,CAAC;AAsVH;;;GAGG;AACH,eAAO,MAAM,MAAM;wBA9Va,OAAO;0BAmL7B,OAAO,UACP,MAAM,wBACQ,aAAa,CAAC,MAAM,CAAC,KAC1C,OAAO;YAOK,CAAC,SAAS,MAAM,mBACrB,OAAO,UACP,MAAM,YACJ,kBAAkB,YAClB,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;eA0EW,CAAC,SAAS,MAAM,mBACxB,OAAO,QACT,MAAM,cACA,kBAAkB,YACpB,eAAe,CAAC,CAAC,CAAC,KAC3B,IAAI;UAWM,CAAC,SAAS,MAAM,mBACnB,OAAO,QACT,MAAM,WACH,YAAY,YACX,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;WAIO,CAAC,SAAS,MAAM,mBACpB,OAAO,QACT,MAAM,WACH,YAAY,YACX,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;UAIM,CAAC,SAAS,MAAM,mBACnB,OAAO,QACT,MAAM,WACH,YAAY,YACX,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;YAIQ,CAAC,SAAS,MAAM,mBACrB,OAAO,QACT,MAAM,WACH,YAAY,YACX,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;UAIM,CAAC,SAAS,MAAM,mBACnB,OAAO,QACT,MAAM,WACH,YAAY,YACX,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;UAIM,CAAC,SAAS,MAAM,mBACnB,OAAO,QACT,MAAM,WACH,YAAY,YACX,YAAY,CAAC,CAAC,CAAC,KACxB,IAAI;oBAOgB,OAAO,UAAU,MAAM,QAAQ,MAAM,KAAG,UAAU,GAAG,IAAI;wBAGrD,OAAO,KAAG,KAAK,EAAE;EAmB1C,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -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 '../
|
|
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"}
|
package/src/routes/metrics.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
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,
|
|
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"}
|
package/src/routes/metrics.js
CHANGED
|
@@ -1 +1,20 @@
|
|
|
1
|
-
|
|
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 '
|
|
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 '../
|
|
7
|
-
import { Env } from '../
|
|
8
|
-
import { Router } from '
|
|
9
|
-
import { RouteRegistry } from '
|
|
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',
|
|
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',
|
|
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":"
|
|
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
|
|
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
|
|
145
|
+
const result = await User.query().insert({
|
|
154
146
|
name,
|
|
155
147
|
email,
|
|
156
148
|
password: passwordHash,
|
|
157
149
|
});
|
|
158
150
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
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 '../
|
|
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,
|
|
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 '../
|
|
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;
|
|
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
|
|
234
|
-
const regex =
|
|
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
package/routes/api.d.ts.map
DELETED
|
@@ -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
|
-
}
|