@macss/modular-api 0.1.0 → 0.3.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.
@@ -1,4 +1,5 @@
1
1
  import type { UseCaseFactory, Input, Output } from './usecase';
2
+ import type { ModularLogger } from './logger/logger';
2
3
  export interface TestResponse {
3
4
  statusCode: number;
4
5
  body: Record<string, unknown>;
@@ -21,4 +22,6 @@ export interface TestResponse {
21
22
  * expect(response.body).toEqual({ message: 'Hello, World!' });
22
23
  * ```
23
24
  */
24
- export declare function useCaseTestHandler<I extends Input, O extends Output>(factory: UseCaseFactory<I, O>, input?: Record<string, unknown>): Promise<TestResponse>;
25
+ export declare function useCaseTestHandler<I extends Input, O extends Output>(factory: UseCaseFactory<I, O>, input?: Record<string, unknown>, options?: {
26
+ logger?: ModularLogger;
27
+ }): Promise<TestResponse>;
@@ -25,9 +25,13 @@ const use_case_exception_1 = require("./use_case_exception");
25
25
  * expect(response.body).toEqual({ message: 'Hello, World!' });
26
26
  * ```
27
27
  */
28
- async function useCaseTestHandler(factory, input = {}) {
28
+ async function useCaseTestHandler(factory, input = {}, options) {
29
29
  try {
30
30
  const useCase = factory(input);
31
+ // Inject logger if provided
32
+ if (options?.logger) {
33
+ useCase.logger = options.logger;
34
+ }
31
35
  const validationError = useCase.validate();
32
36
  if (validationError !== null) {
33
37
  return {
package/dist/index.d.ts CHANGED
@@ -9,3 +9,15 @@ export { useCaseTestHandler } from './core/usecase_test_handler';
9
9
  export type { TestResponse } from './core/usecase_test_handler';
10
10
  export { cors } from './middlewares/cors';
11
11
  export type { CorsOptions } from './middlewares/cors';
12
+ export { HealthCheck, HealthCheckResult } from './core/health/health_check';
13
+ export type { HealthStatus } from './core/health/health_check';
14
+ export { HealthService, HealthResponse } from './core/health/health_service';
15
+ export type { HealthServiceOptions } from './core/health/health_service';
16
+ export { healthHandler } from './core/health/health_handler';
17
+ export { MetricRegistry, MetricsRegistrar } from './core/metrics/metric_registry';
18
+ export { metricsMiddleware, metricsHandler } from './core/metrics/metrics_middleware';
19
+ export type { MetricsMiddlewareOptions } from './core/metrics/metrics_middleware';
20
+ export { LogLevel, RequestScopedLogger } from './core/logger/logger';
21
+ export type { ModularLogger } from './core/logger/logger';
22
+ export { loggingMiddleware, LOGGER_LOCALS_KEY } from './core/logger/logging_middleware';
23
+ export type { LoggingMiddlewareOptions } from './core/logger/logging_middleware';
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  // import { ModularApi, UseCase, Input, Output } from 'modular_api'
6
6
  // ============================================================
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.cors = exports.useCaseTestHandler = exports.ModuleBuilder = exports.ModularApi = exports.UseCaseException = exports.UseCase = exports.Output = exports.Input = void 0;
8
+ exports.LOGGER_LOCALS_KEY = exports.loggingMiddleware = exports.RequestScopedLogger = exports.LogLevel = exports.metricsHandler = exports.metricsMiddleware = exports.MetricsRegistrar = exports.MetricRegistry = exports.healthHandler = exports.HealthResponse = exports.HealthService = exports.HealthCheckResult = exports.HealthCheck = exports.cors = exports.useCaseTestHandler = exports.ModuleBuilder = exports.ModularApi = exports.UseCaseException = exports.UseCase = exports.Output = exports.Input = void 0;
9
9
  // Core abstractions
10
10
  var usecase_1 = require("./core/usecase");
11
11
  Object.defineProperty(exports, "Input", { enumerable: true, get: function () { return usecase_1.Input; } });
@@ -26,3 +26,26 @@ Object.defineProperty(exports, "useCaseTestHandler", { enumerable: true, get: fu
26
26
  // Middlewares
27
27
  var cors_1 = require("./middlewares/cors");
28
28
  Object.defineProperty(exports, "cors", { enumerable: true, get: function () { return cors_1.cors; } });
29
+ // Health — IETF Health Check Response Format
30
+ var health_check_1 = require("./core/health/health_check");
31
+ Object.defineProperty(exports, "HealthCheck", { enumerable: true, get: function () { return health_check_1.HealthCheck; } });
32
+ Object.defineProperty(exports, "HealthCheckResult", { enumerable: true, get: function () { return health_check_1.HealthCheckResult; } });
33
+ var health_service_1 = require("./core/health/health_service");
34
+ Object.defineProperty(exports, "HealthService", { enumerable: true, get: function () { return health_service_1.HealthService; } });
35
+ Object.defineProperty(exports, "HealthResponse", { enumerable: true, get: function () { return health_service_1.HealthResponse; } });
36
+ var health_handler_1 = require("./core/health/health_handler");
37
+ Object.defineProperty(exports, "healthHandler", { enumerable: true, get: function () { return health_handler_1.healthHandler; } });
38
+ // Metrics — Prometheus /metrics endpoint
39
+ var metric_registry_1 = require("./core/metrics/metric_registry");
40
+ Object.defineProperty(exports, "MetricRegistry", { enumerable: true, get: function () { return metric_registry_1.MetricRegistry; } });
41
+ Object.defineProperty(exports, "MetricsRegistrar", { enumerable: true, get: function () { return metric_registry_1.MetricsRegistrar; } });
42
+ var metrics_middleware_1 = require("./core/metrics/metrics_middleware");
43
+ Object.defineProperty(exports, "metricsMiddleware", { enumerable: true, get: function () { return metrics_middleware_1.metricsMiddleware; } });
44
+ Object.defineProperty(exports, "metricsHandler", { enumerable: true, get: function () { return metrics_middleware_1.metricsHandler; } });
45
+ // Logger — Structured JSON logging (Loki/Grafana compatible)
46
+ var logger_1 = require("./core/logger/logger");
47
+ Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_1.LogLevel; } });
48
+ Object.defineProperty(exports, "RequestScopedLogger", { enumerable: true, get: function () { return logger_1.RequestScopedLogger; } });
49
+ var logging_middleware_1 = require("./core/logger/logging_middleware");
50
+ Object.defineProperty(exports, "loggingMiddleware", { enumerable: true, get: function () { return logging_middleware_1.loggingMiddleware; } });
51
+ Object.defineProperty(exports, "LOGGER_LOCALS_KEY", { enumerable: true, get: function () { return logging_middleware_1.LOGGER_LOCALS_KEY; } });
@@ -19,9 +19,7 @@ const registry_1 = require("../core/registry");
19
19
  */
20
20
  function buildOpenApiSpec(options) {
21
21
  const { title, port, version = '0.1.0', description = 'Auto-generated by modular-api', servers, } = options;
22
- const defaultServers = [
23
- { url: `http://localhost:${port}`, description: 'Local' },
24
- ];
22
+ const defaultServers = [{ url: `http://localhost:${port}`, description: 'Local' }];
25
23
  const paths = {};
26
24
  for (const route of registry_1.apiRegistry.routes) {
27
25
  const method = route.method.toLowerCase();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@macss/modular-api",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Use-case-centric toolkit for building modular APIs with Express. Define UseCase classes (input → validate → execute → output), connect them to HTTP routes, and expose Swagger/OpenAPI documentation automatically.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -12,7 +12,9 @@
12
12
  "scripts": {
13
13
  "build": "tsc --project tsconfig.build.json",
14
14
  "dev": "ts-node src/index.ts",
15
- "test": "echo \"No tests yet\" && exit 0"
15
+ "test": "vitest run",
16
+ "format": "prettier --write .",
17
+ "format:check": "prettier --check ."
16
18
  },
17
19
  "keywords": [
18
20
  "api",
@@ -25,13 +27,18 @@
25
27
  "license": "MIT",
26
28
  "dependencies": {
27
29
  "express": "^4.22.1",
30
+ "prom-client": "^15.1.3",
28
31
  "swagger-ui-express": "^5.0.1"
29
32
  },
30
33
  "devDependencies": {
31
34
  "@types/express": "^5.0.6",
32
35
  "@types/node": "^22.19.11",
36
+ "@types/supertest": "^6.0.3",
33
37
  "@types/swagger-ui-express": "^4.1.8",
38
+ "prettier": "^3.8.1",
39
+ "supertest": "^7.2.2",
34
40
  "ts-node": "^10.9.2",
35
- "typescript": "^5.9.3"
41
+ "typescript": "^5.9.3",
42
+ "vitest": "^4.0.18"
36
43
  }
37
44
  }