@morojs/moro 1.0.0 → 1.0.2
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/README.md +1 -1
- package/dist/core/config/index.d.ts +5 -5
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +58 -82
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +1 -1
- package/dist/core/config/schema.js +52 -111
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/config/utils.d.ts +2 -2
- package/dist/core/config/utils.js +18 -18
- package/dist/core/config/utils.js.map +1 -1
- package/dist/core/database/adapters/drizzle.d.ts +1 -1
- package/dist/core/database/adapters/drizzle.js +39 -55
- package/dist/core/database/adapters/drizzle.js.map +1 -1
- package/dist/core/database/adapters/index.d.ts +7 -7
- package/dist/core/database/adapters/index.js +11 -11
- package/dist/core/database/adapters/index.js.map +1 -1
- package/dist/core/database/adapters/mongodb.d.ts +1 -1
- package/dist/core/database/adapters/mongodb.js +19 -23
- package/dist/core/database/adapters/mongodb.js.map +1 -1
- package/dist/core/database/adapters/mysql.d.ts +1 -1
- package/dist/core/database/adapters/mysql.js +31 -27
- package/dist/core/database/adapters/mysql.js.map +1 -1
- package/dist/core/database/adapters/postgresql.d.ts +1 -1
- package/dist/core/database/adapters/postgresql.js +27 -35
- package/dist/core/database/adapters/postgresql.js.map +1 -1
- package/dist/core/database/adapters/redis.d.ts +1 -1
- package/dist/core/database/adapters/redis.js +24 -24
- package/dist/core/database/adapters/redis.js.map +1 -1
- package/dist/core/database/adapters/sqlite.d.ts +1 -1
- package/dist/core/database/adapters/sqlite.js +36 -36
- package/dist/core/database/adapters/sqlite.js.map +1 -1
- package/dist/core/database/index.d.ts +2 -2
- package/dist/core/docs/index.d.ts +7 -7
- package/dist/core/docs/index.js +13 -15
- package/dist/core/docs/index.js.map +1 -1
- package/dist/core/docs/openapi-generator.d.ts +5 -5
- package/dist/core/docs/openapi-generator.js +93 -94
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/docs/simple-docs.d.ts +1 -1
- package/dist/core/docs/simple-docs.js +25 -28
- package/dist/core/docs/simple-docs.js.map +1 -1
- package/dist/core/docs/swagger-ui.d.ts +2 -2
- package/dist/core/docs/swagger-ui.js +46 -51
- package/dist/core/docs/swagger-ui.js.map +1 -1
- package/dist/core/docs/zod-to-openapi.d.ts +1 -1
- package/dist/core/docs/zod-to-openapi.js +115 -125
- package/dist/core/docs/zod-to-openapi.js.map +1 -1
- package/dist/core/events/event-bus.d.ts +1 -1
- package/dist/core/events/event-bus.js +15 -21
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/events/index.d.ts +2 -2
- package/dist/core/framework.d.ts +5 -5
- package/dist/core/framework.js +55 -60
- package/dist/core/framework.js.map +1 -1
- package/dist/core/http/http-server.d.ts +2 -2
- package/dist/core/http/http-server.js +228 -261
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/index.d.ts +3 -3
- package/dist/core/http/router.d.ts +1 -1
- package/dist/core/http/router.js +15 -17
- package/dist/core/http/router.js.map +1 -1
- package/dist/core/logger/filters.d.ts +1 -1
- package/dist/core/logger/filters.js +16 -16
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/index.d.ts +3 -3
- package/dist/core/logger/logger.d.ts +1 -1
- package/dist/core/logger/logger.js +48 -59
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.d.ts +4 -4
- package/dist/core/logger/outputs.js +16 -20
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/file.js +19 -19
- package/dist/core/middleware/built-in/adapters/cache/file.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cache/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/memory.js +5 -5
- package/dist/core/middleware/built-in/adapters/cache/memory.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cache/redis.js +18 -18
- package/dist/core/middleware/built-in/adapters/cache/redis.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/azure.js +8 -8
- package/dist/core/middleware/built-in/adapters/cdn/azure.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js +14 -14
- package/dist/core/middleware/built-in/adapters/cdn/cloudflare.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.d.ts +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js +13 -15
- package/dist/core/middleware/built-in/adapters/cdn/cloudfront.js.map +1 -1
- package/dist/core/middleware/built-in/adapters/cdn/index.d.ts +4 -4
- package/dist/core/middleware/built-in/adapters/cdn/index.js +3 -3
- package/dist/core/middleware/built-in/adapters/index.d.ts +4 -4
- package/dist/core/middleware/built-in/auth.d.ts +1 -1
- package/dist/core/middleware/built-in/auth.js +14 -14
- package/dist/core/middleware/built-in/cache.d.ts +2 -2
- package/dist/core/middleware/built-in/cache.js +43 -45
- package/dist/core/middleware/built-in/cache.js.map +1 -1
- package/dist/core/middleware/built-in/cdn.d.ts +2 -2
- package/dist/core/middleware/built-in/cdn.js +27 -29
- package/dist/core/middleware/built-in/cdn.js.map +1 -1
- package/dist/core/middleware/built-in/cookie.d.ts +2 -2
- package/dist/core/middleware/built-in/cookie.js +17 -17
- package/dist/core/middleware/built-in/cookie.js.map +1 -1
- package/dist/core/middleware/built-in/cors.d.ts +1 -1
- package/dist/core/middleware/built-in/cors.js +13 -13
- package/dist/core/middleware/built-in/csp.d.ts +1 -1
- package/dist/core/middleware/built-in/csp.js +22 -25
- package/dist/core/middleware/built-in/csp.js.map +1 -1
- package/dist/core/middleware/built-in/csrf.d.ts +1 -1
- package/dist/core/middleware/built-in/csrf.js +21 -24
- package/dist/core/middleware/built-in/csrf.js.map +1 -1
- package/dist/core/middleware/built-in/error-tracker.js +2 -2
- package/dist/core/middleware/built-in/index.d.ts +14 -14
- package/dist/core/middleware/built-in/performance-monitor.js +2 -2
- package/dist/core/middleware/built-in/rate-limit.d.ts +1 -1
- package/dist/core/middleware/built-in/rate-limit.js +12 -12
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/middleware/built-in/session.d.ts +5 -5
- package/dist/core/middleware/built-in/session.js +35 -38
- package/dist/core/middleware/built-in/session.js.map +1 -1
- package/dist/core/middleware/built-in/sse.d.ts +1 -1
- package/dist/core/middleware/built-in/sse.js +20 -22
- package/dist/core/middleware/built-in/sse.js.map +1 -1
- package/dist/core/middleware/built-in/validation.d.ts +1 -1
- package/dist/core/middleware/built-in/validation.js +13 -13
- package/dist/core/middleware/index.d.ts +5 -5
- package/dist/core/middleware/index.js +16 -16
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +2 -2
- package/dist/core/modules/auto-discovery.js +12 -13
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/index.d.ts +2 -2
- package/dist/core/modules/index.js.map +1 -1
- package/dist/core/modules/modules.d.ts +3 -3
- package/dist/core/modules/modules.js +3 -6
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/index.d.ts +2 -2
- package/dist/core/networking/index.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +2 -2
- package/dist/core/networking/service-discovery.js +27 -27
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/core/networking/websocket-manager.d.ts +3 -3
- package/dist/core/networking/websocket-manager.js +15 -16
- package/dist/core/networking/websocket-manager.js.map +1 -1
- package/dist/core/routing/app-integration.d.ts +2 -2
- package/dist/core/routing/app-integration.js +13 -13
- package/dist/core/routing/app-integration.js.map +1 -1
- package/dist/core/routing/index.d.ts +3 -3
- package/dist/core/routing/index.js +43 -52
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.d.ts +3 -3
- package/dist/core/runtime/aws-lambda-adapter.js +14 -16
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.d.ts +2 -2
- package/dist/core/runtime/base-adapter.js +11 -12
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.d.ts +3 -3
- package/dist/core/runtime/cloudflare-workers-adapter.js +20 -21
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/index.d.ts +9 -9
- package/dist/core/runtime/index.js +4 -4
- package/dist/core/runtime/index.js.map +1 -1
- package/dist/core/runtime/node-adapter.d.ts +5 -5
- package/dist/core/runtime/node-adapter.js +35 -35
- package/dist/core/runtime/node-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.d.ts +3 -3
- package/dist/core/runtime/vercel-edge-adapter.js +12 -15
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/circuit-breaker.js +6 -6
- package/dist/core/utilities/container.d.ts +1 -1
- package/dist/core/utilities/container.js +17 -22
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/utilities/hooks.d.ts +3 -3
- package/dist/core/utilities/hooks.js +11 -11
- package/dist/core/utilities/hooks.js.map +1 -1
- package/dist/core/utilities/index.d.ts +4 -4
- package/dist/core/validation/index.d.ts +3 -3
- package/dist/core/validation/index.js +15 -15
- package/dist/core/validation/index.js.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.js +50 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +14 -14
- package/dist/moro.js +79 -88
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +1 -1
- package/dist/types/core.d.ts +2 -2
- package/dist/types/events.d.ts +19 -19
- package/dist/types/hooks.d.ts +1 -1
- package/dist/types/http.d.ts +2 -2
- package/dist/types/logger.d.ts +3 -3
- package/dist/types/module.d.ts +2 -2
- package/dist/types/runtime.d.ts +2 -2
- package/dist/types/session.d.ts +4 -4
- package/package.json +183 -165
- package/src/core/config/index.ts +7 -9
- package/src/core/config/loader.ts +86 -158
- package/src/core/config/schema.ts +59 -122
- package/src/core/config/utils.ts +27 -45
- package/src/core/database/adapters/drizzle.ts +53 -75
- package/src/core/database/adapters/index.ts +26 -29
- package/src/core/database/adapters/mongodb.ts +31 -54
- package/src/core/database/adapters/mysql.ts +40 -50
- package/src/core/database/adapters/postgresql.ts +32 -42
- package/src/core/database/adapters/redis.ts +31 -36
- package/src/core/database/adapters/sqlite.ts +43 -51
- package/src/core/database/index.ts +2 -2
- package/src/core/docs/index.ts +25 -39
- package/src/core/docs/openapi-generator.ts +104 -117
- package/src/core/docs/simple-docs.ts +29 -39
- package/src/core/docs/swagger-ui.ts +57 -76
- package/src/core/docs/zod-to-openapi.ts +121 -153
- package/src/core/events/event-bus.ts +22 -45
- package/src/core/events/index.ts +2 -2
- package/src/core/framework.ts +119 -197
- package/src/core/http/http-server.ts +260 -360
- package/src/core/http/index.ts +3 -8
- package/src/core/http/router.ts +19 -31
- package/src/core/logger/filters.ts +19 -22
- package/src/core/logger/index.ts +3 -3
- package/src/core/logger/logger.ts +59 -100
- package/src/core/logger/outputs.ts +23 -27
- package/src/core/middleware/built-in/adapters/cache/file.ts +21 -23
- package/src/core/middleware/built-in/adapters/cache/index.ts +11 -14
- package/src/core/middleware/built-in/adapters/cache/memory.ts +7 -7
- package/src/core/middleware/built-in/adapters/cache/redis.ts +21 -24
- package/src/core/middleware/built-in/adapters/cdn/azure.ts +10 -18
- package/src/core/middleware/built-in/adapters/cdn/cloudflare.ts +19 -36
- package/src/core/middleware/built-in/adapters/cdn/cloudfront.ts +17 -26
- package/src/core/middleware/built-in/adapters/cdn/index.ts +10 -10
- package/src/core/middleware/built-in/adapters/index.ts +4 -4
- package/src/core/middleware/built-in/auth.ts +16 -16
- package/src/core/middleware/built-in/cache.ts +50 -67
- package/src/core/middleware/built-in/cdn.ts +34 -61
- package/src/core/middleware/built-in/cookie.ts +23 -28
- package/src/core/middleware/built-in/cors.ts +17 -17
- package/src/core/middleware/built-in/csp.ts +25 -31
- package/src/core/middleware/built-in/csrf.ts +24 -29
- package/src/core/middleware/built-in/error-tracker.ts +3 -3
- package/src/core/middleware/built-in/index.ts +28 -28
- package/src/core/middleware/built-in/performance-monitor.ts +4 -4
- package/src/core/middleware/built-in/rate-limit.ts +15 -15
- package/src/core/middleware/built-in/request-logger.ts +1 -3
- package/src/core/middleware/built-in/session.ts +47 -70
- package/src/core/middleware/built-in/sse.ts +23 -28
- package/src/core/middleware/built-in/validation.ts +15 -15
- package/src/core/middleware/index.ts +26 -37
- package/src/core/modules/auto-discovery.ts +21 -31
- package/src/core/modules/index.ts +2 -5
- package/src/core/modules/modules.ts +11 -20
- package/src/core/networking/index.ts +2 -6
- package/src/core/networking/service-discovery.ts +41 -61
- package/src/core/networking/websocket-manager.ts +27 -36
- package/src/core/routing/app-integration.ts +19 -32
- package/src/core/routing/index.ts +57 -88
- package/src/core/runtime/aws-lambda-adapter.ts +20 -30
- package/src/core/runtime/base-adapter.ts +17 -27
- package/src/core/runtime/cloudflare-workers-adapter.ts +28 -42
- package/src/core/runtime/index.ts +21 -33
- package/src/core/runtime/node-adapter.ts +59 -73
- package/src/core/runtime/vercel-edge-adapter.ts +18 -29
- package/src/core/utilities/circuit-breaker.ts +7 -7
- package/src/core/utilities/container.ts +52 -89
- package/src/core/utilities/hooks.ts +17 -23
- package/src/core/utilities/index.ts +4 -4
- package/src/core/validation/index.ts +25 -51
- package/src/index.ts +104 -60
- package/src/moro.ts +119 -191
- package/src/types/cache.ts +1 -1
- package/src/types/core.ts +2 -2
- package/src/types/database.ts +2 -10
- package/src/types/events.ts +23 -31
- package/src/types/hooks.ts +1 -1
- package/src/types/http.ts +5 -8
- package/src/types/logger.ts +7 -23
- package/src/types/module.ts +2 -2
- package/src/types/runtime.ts +6 -21
- package/src/types/session.ts +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Database SQLite Adapter
|
|
2
|
-
import { DatabaseAdapter, DatabaseTransaction } from
|
|
3
|
-
import { createFrameworkLogger } from
|
|
2
|
+
import { DatabaseAdapter, DatabaseTransaction } from '../../../types/database';
|
|
3
|
+
import { createFrameworkLogger } from '../../logger';
|
|
4
4
|
|
|
5
5
|
interface SQLiteConfig {
|
|
6
6
|
filename?: string;
|
|
@@ -13,39 +13,35 @@ interface SQLiteConfig {
|
|
|
13
13
|
|
|
14
14
|
export class SQLiteAdapter implements DatabaseAdapter {
|
|
15
15
|
private db: any;
|
|
16
|
-
private logger = createFrameworkLogger(
|
|
16
|
+
private logger = createFrameworkLogger('SQLite');
|
|
17
17
|
|
|
18
18
|
constructor(config: SQLiteConfig = {}) {
|
|
19
19
|
try {
|
|
20
|
-
const Database = require(
|
|
21
|
-
const filename = config.memory
|
|
22
|
-
? ":memory:"
|
|
23
|
-
: config.filename || "moro_app.db";
|
|
20
|
+
const Database = require('better-sqlite3');
|
|
21
|
+
const filename = config.memory ? ':memory:' : config.filename || 'moro_app.db';
|
|
24
22
|
this.db = new Database(filename, {
|
|
25
23
|
readonly: config.readonly || false,
|
|
26
24
|
fileMustExist: config.fileMustExist || false,
|
|
27
25
|
timeout: config.timeout || 5000,
|
|
28
|
-
verbose: config.verbose
|
|
29
|
-
? this.logger.debug.bind(this.logger)
|
|
30
|
-
: undefined,
|
|
26
|
+
verbose: config.verbose ? this.logger.debug.bind(this.logger) : undefined,
|
|
31
27
|
});
|
|
32
28
|
|
|
33
29
|
// Enable foreign keys
|
|
34
|
-
this.db.pragma(
|
|
30
|
+
this.db.pragma('foreign_keys = ON');
|
|
35
31
|
|
|
36
|
-
this.logger.info(
|
|
32
|
+
this.logger.info('SQLite connection established', 'Connection', {
|
|
37
33
|
filename,
|
|
38
34
|
});
|
|
39
35
|
} catch (error) {
|
|
40
36
|
throw new Error(
|
|
41
|
-
|
|
37
|
+
'better-sqlite3 package is required for SQLite adapter. Install it with: npm install better-sqlite3'
|
|
42
38
|
);
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
41
|
|
|
46
42
|
async connect(): Promise<void> {
|
|
47
43
|
// SQLite doesn't require explicit connection - it's handled in constructor
|
|
48
|
-
this.logger.info(
|
|
44
|
+
this.logger.info('SQLite adapter ready', 'Connection');
|
|
49
45
|
}
|
|
50
46
|
|
|
51
47
|
async disconnect(): Promise<void> {
|
|
@@ -58,7 +54,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
58
54
|
const results = stmt.all(params || []);
|
|
59
55
|
return results as T[];
|
|
60
56
|
} catch (error) {
|
|
61
|
-
this.logger.error(
|
|
57
|
+
this.logger.error('SQLite query failed', 'Query', {
|
|
62
58
|
sql,
|
|
63
59
|
error: error instanceof Error ? error.message : String(error),
|
|
64
60
|
});
|
|
@@ -72,7 +68,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
72
68
|
const result = stmt.get(params || []);
|
|
73
69
|
return (result as T) || null;
|
|
74
70
|
} catch (error) {
|
|
75
|
-
this.logger.error(
|
|
71
|
+
this.logger.error('SQLite queryOne failed', 'Query', {
|
|
76
72
|
sql,
|
|
77
73
|
error: error instanceof Error ? error.message : String(error),
|
|
78
74
|
});
|
|
@@ -83,23 +79,22 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
83
79
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
84
80
|
const keys = Object.keys(data);
|
|
85
81
|
const values = Object.values(data);
|
|
86
|
-
const placeholders = keys.map(() =>
|
|
82
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
87
83
|
|
|
88
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
84
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;
|
|
89
85
|
|
|
90
86
|
try {
|
|
91
87
|
const stmt = this.db.prepare(sql);
|
|
92
88
|
const info = stmt.run(values);
|
|
93
89
|
|
|
94
90
|
// Return the inserted record
|
|
95
|
-
const insertedRecord = await this.queryOne<T>(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
);
|
|
91
|
+
const insertedRecord = await this.queryOne<T>(`SELECT * FROM ${table} WHERE rowid = ?`, [
|
|
92
|
+
info.lastInsertRowid,
|
|
93
|
+
]);
|
|
99
94
|
|
|
100
95
|
return insertedRecord!;
|
|
101
96
|
} catch (error) {
|
|
102
|
-
this.logger.error(
|
|
97
|
+
this.logger.error('SQLite insert failed', 'Insert', {
|
|
103
98
|
table,
|
|
104
99
|
error: error instanceof Error ? error.message : String(error),
|
|
105
100
|
});
|
|
@@ -110,14 +105,14 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
110
105
|
async update<T = any>(
|
|
111
106
|
table: string,
|
|
112
107
|
data: Record<string, any>,
|
|
113
|
-
where: Record<string, any
|
|
108
|
+
where: Record<string, any>
|
|
114
109
|
): Promise<T> {
|
|
115
110
|
const setClause = Object.keys(data)
|
|
116
|
-
.map(
|
|
117
|
-
.join(
|
|
111
|
+
.map(key => `${key} = ?`)
|
|
112
|
+
.join(', ');
|
|
118
113
|
const whereClause = Object.keys(where)
|
|
119
|
-
.map(
|
|
120
|
-
.join(
|
|
114
|
+
.map(key => `${key} = ?`)
|
|
115
|
+
.join(' AND ');
|
|
121
116
|
|
|
122
117
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause}`;
|
|
123
118
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -129,12 +124,12 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
129
124
|
// Return the updated record
|
|
130
125
|
const updatedRecord = await this.queryOne<T>(
|
|
131
126
|
`SELECT * FROM ${table} WHERE ${whereClause}`,
|
|
132
|
-
Object.values(where)
|
|
127
|
+
Object.values(where)
|
|
133
128
|
);
|
|
134
129
|
|
|
135
130
|
return updatedRecord!;
|
|
136
131
|
} catch (error) {
|
|
137
|
-
this.logger.error(
|
|
132
|
+
this.logger.error('SQLite update failed', 'Update', {
|
|
138
133
|
table,
|
|
139
134
|
error: error instanceof Error ? error.message : String(error),
|
|
140
135
|
});
|
|
@@ -144,8 +139,8 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
144
139
|
|
|
145
140
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
146
141
|
const whereClause = Object.keys(where)
|
|
147
|
-
.map(
|
|
148
|
-
.join(
|
|
142
|
+
.map(key => `${key} = ?`)
|
|
143
|
+
.join(' AND ');
|
|
149
144
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
150
145
|
|
|
151
146
|
try {
|
|
@@ -153,7 +148,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
153
148
|
const info = stmt.run(Object.values(where));
|
|
154
149
|
return info.changes;
|
|
155
150
|
} catch (error) {
|
|
156
|
-
this.logger.error(
|
|
151
|
+
this.logger.error('SQLite delete failed', 'Delete', {
|
|
157
152
|
table,
|
|
158
153
|
error: error instanceof Error ? error.message : String(error),
|
|
159
154
|
});
|
|
@@ -161,9 +156,7 @@ export class SQLiteAdapter implements DatabaseAdapter {
|
|
|
161
156
|
}
|
|
162
157
|
}
|
|
163
158
|
|
|
164
|
-
async transaction<T>(
|
|
165
|
-
callback: (tx: DatabaseTransaction) => Promise<T>,
|
|
166
|
-
): Promise<T> {
|
|
159
|
+
async transaction<T>(callback: (tx: DatabaseTransaction) => Promise<T>): Promise<T> {
|
|
167
160
|
const transaction = this.db.transaction(async () => {
|
|
168
161
|
const tx = new SQLiteTransaction(this.db);
|
|
169
162
|
return await callback(tx);
|
|
@@ -191,16 +184,15 @@ class SQLiteTransaction implements DatabaseTransaction {
|
|
|
191
184
|
async insert<T = any>(table: string, data: Record<string, any>): Promise<T> {
|
|
192
185
|
const keys = Object.keys(data);
|
|
193
186
|
const values = Object.values(data);
|
|
194
|
-
const placeholders = keys.map(() =>
|
|
187
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
195
188
|
|
|
196
|
-
const sql = `INSERT INTO ${table} (${keys.join(
|
|
189
|
+
const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;
|
|
197
190
|
const stmt = this.db.prepare(sql);
|
|
198
191
|
const info = stmt.run(values);
|
|
199
192
|
|
|
200
|
-
const insertedRecord = await this.queryOne<T>(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
);
|
|
193
|
+
const insertedRecord = await this.queryOne<T>(`SELECT * FROM ${table} WHERE rowid = ?`, [
|
|
194
|
+
info.lastInsertRowid,
|
|
195
|
+
]);
|
|
204
196
|
|
|
205
197
|
return insertedRecord!;
|
|
206
198
|
}
|
|
@@ -208,14 +200,14 @@ class SQLiteTransaction implements DatabaseTransaction {
|
|
|
208
200
|
async update<T = any>(
|
|
209
201
|
table: string,
|
|
210
202
|
data: Record<string, any>,
|
|
211
|
-
where: Record<string, any
|
|
203
|
+
where: Record<string, any>
|
|
212
204
|
): Promise<T> {
|
|
213
205
|
const setClause = Object.keys(data)
|
|
214
|
-
.map(
|
|
215
|
-
.join(
|
|
206
|
+
.map(key => `${key} = ?`)
|
|
207
|
+
.join(', ');
|
|
216
208
|
const whereClause = Object.keys(where)
|
|
217
|
-
.map(
|
|
218
|
-
.join(
|
|
209
|
+
.map(key => `${key} = ?`)
|
|
210
|
+
.join(' AND ');
|
|
219
211
|
|
|
220
212
|
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause}`;
|
|
221
213
|
const params = [...Object.values(data), ...Object.values(where)];
|
|
@@ -225,7 +217,7 @@ class SQLiteTransaction implements DatabaseTransaction {
|
|
|
225
217
|
|
|
226
218
|
const updatedRecord = await this.queryOne<T>(
|
|
227
219
|
`SELECT * FROM ${table} WHERE ${whereClause}`,
|
|
228
|
-
Object.values(where)
|
|
220
|
+
Object.values(where)
|
|
229
221
|
);
|
|
230
222
|
|
|
231
223
|
return updatedRecord!;
|
|
@@ -233,8 +225,8 @@ class SQLiteTransaction implements DatabaseTransaction {
|
|
|
233
225
|
|
|
234
226
|
async delete(table: string, where: Record<string, any>): Promise<number> {
|
|
235
227
|
const whereClause = Object.keys(where)
|
|
236
|
-
.map(
|
|
237
|
-
.join(
|
|
228
|
+
.map(key => `${key} = ?`)
|
|
229
|
+
.join(' AND ');
|
|
238
230
|
const sql = `DELETE FROM ${table} WHERE ${whereClause}`;
|
|
239
231
|
|
|
240
232
|
const stmt = this.db.prepare(sql);
|
|
@@ -250,6 +242,6 @@ class SQLiteTransaction implements DatabaseTransaction {
|
|
|
250
242
|
async rollback(): Promise<void> {
|
|
251
243
|
// SQLite transactions are handled automatically by better-sqlite3
|
|
252
244
|
// This is just for interface compatibility
|
|
253
|
-
throw new Error(
|
|
245
|
+
throw new Error('Transaction rollback');
|
|
254
246
|
}
|
|
255
247
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Database Module
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
2
|
+
export * from './adapters';
|
|
3
|
+
export * from '../../types/database';
|
package/src/core/docs/index.ts
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
1
|
// Moro Framework Documentation System
|
|
2
2
|
// Automatic API documentation generation from intelligent routes and Zod schemas
|
|
3
3
|
|
|
4
|
-
import { CompiledRoute } from
|
|
5
|
-
import { IntelligentRoutingManager } from
|
|
4
|
+
import { CompiledRoute } from '../routing';
|
|
5
|
+
import { IntelligentRoutingManager } from '../routing/app-integration';
|
|
6
6
|
import {
|
|
7
7
|
OpenAPIGenerator,
|
|
8
8
|
generateOpenAPIFromRoutes,
|
|
9
9
|
GenerationOptions,
|
|
10
10
|
OpenAPISpec,
|
|
11
11
|
defaultSecuritySchemes,
|
|
12
|
-
} from
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
SwaggerUIOptions,
|
|
16
|
-
createDocsMiddleware,
|
|
17
|
-
} from "./swagger-ui";
|
|
18
|
-
import { createFrameworkLogger } from "../logger";
|
|
12
|
+
} from './openapi-generator';
|
|
13
|
+
import { SwaggerUIMiddleware, SwaggerUIOptions, createDocsMiddleware } from './swagger-ui';
|
|
14
|
+
import { createFrameworkLogger } from '../logger';
|
|
19
15
|
|
|
20
|
-
const logger = createFrameworkLogger(
|
|
16
|
+
const logger = createFrameworkLogger('DocumentationSystem');
|
|
21
17
|
|
|
22
18
|
// Documentation configuration
|
|
23
19
|
export interface DocsConfig {
|
|
@@ -49,7 +45,7 @@ export class DocumentationSystem {
|
|
|
49
45
|
|
|
50
46
|
constructor(config: DocsConfig) {
|
|
51
47
|
this.config = {
|
|
52
|
-
basePath:
|
|
48
|
+
basePath: '/docs',
|
|
53
49
|
includeExamples: true,
|
|
54
50
|
includeSchemas: true,
|
|
55
51
|
enableAuth: true,
|
|
@@ -68,21 +64,16 @@ export class DocumentationSystem {
|
|
|
68
64
|
servers: this.config.servers,
|
|
69
65
|
includeExamples: this.config.includeExamples,
|
|
70
66
|
includeSchemas: this.config.includeSchemas,
|
|
71
|
-
securitySchemes: this.config.enableAuth
|
|
72
|
-
? defaultSecuritySchemes
|
|
73
|
-
: undefined,
|
|
67
|
+
securitySchemes: this.config.enableAuth ? defaultSecuritySchemes : undefined,
|
|
74
68
|
};
|
|
75
69
|
|
|
76
70
|
this.generator = new OpenAPIGenerator(generationOptions);
|
|
77
71
|
|
|
78
72
|
// Initialize with empty spec
|
|
79
73
|
const initialSpec = this.generator.generate();
|
|
80
|
-
this.swaggerUI = new SwaggerUIMiddleware(
|
|
81
|
-
initialSpec,
|
|
82
|
-
this.config.swaggerUI,
|
|
83
|
-
);
|
|
74
|
+
this.swaggerUI = new SwaggerUIMiddleware(initialSpec, this.config.swaggerUI);
|
|
84
75
|
|
|
85
|
-
logger.info(
|
|
76
|
+
logger.info('Documentation system initialized', 'Initialization', {
|
|
86
77
|
title: this.config.title,
|
|
87
78
|
basePath: this.config.basePath,
|
|
88
79
|
includeExamples: this.config.includeExamples,
|
|
@@ -97,7 +88,7 @@ export class DocumentationSystem {
|
|
|
97
88
|
// Update Swagger UI with new spec
|
|
98
89
|
this.swaggerUI.updateSpec(spec);
|
|
99
90
|
|
|
100
|
-
logger.info(
|
|
91
|
+
logger.info('Documentation generated from routes', 'Generation', {
|
|
101
92
|
routeCount: routes.length,
|
|
102
93
|
pathCount: Object.keys(spec.paths).length,
|
|
103
94
|
});
|
|
@@ -128,7 +119,7 @@ export class DocumentationSystem {
|
|
|
128
119
|
// Update configuration
|
|
129
120
|
updateConfig(newConfig: Partial<DocsConfig>): void {
|
|
130
121
|
this.config = { ...this.config, ...newConfig };
|
|
131
|
-
logger.debug(
|
|
122
|
+
logger.debug('Documentation configuration updated', 'ConfigUpdate', {
|
|
132
123
|
title: this.config.title,
|
|
133
124
|
basePath: this.config.basePath,
|
|
134
125
|
});
|
|
@@ -156,10 +147,7 @@ export class AppDocumentationManager {
|
|
|
156
147
|
private routingManager?: IntelligentRoutingManager;
|
|
157
148
|
|
|
158
149
|
// Initialize documentation system
|
|
159
|
-
enableDocs(
|
|
160
|
-
config: DocsConfig,
|
|
161
|
-
routingManager: IntelligentRoutingManager,
|
|
162
|
-
): void {
|
|
150
|
+
enableDocs(config: DocsConfig, routingManager: IntelligentRoutingManager): void {
|
|
163
151
|
this.routingManager = routingManager;
|
|
164
152
|
this.docSystem = new DocumentationSystem(config);
|
|
165
153
|
|
|
@@ -167,7 +155,7 @@ export class AppDocumentationManager {
|
|
|
167
155
|
const routes = routingManager.getIntelligentRoutes();
|
|
168
156
|
this.docSystem.generateFromRoutes(routes);
|
|
169
157
|
|
|
170
|
-
logger.info(
|
|
158
|
+
logger.info('Documentation enabled for app', 'AppIntegration', {
|
|
171
159
|
title: config.title,
|
|
172
160
|
routeCount: routes.length,
|
|
173
161
|
basePath: config.basePath,
|
|
@@ -177,7 +165,7 @@ export class AppDocumentationManager {
|
|
|
177
165
|
// Get documentation middleware
|
|
178
166
|
getDocsMiddleware() {
|
|
179
167
|
if (!this.docSystem) {
|
|
180
|
-
throw new Error(
|
|
168
|
+
throw new Error('Documentation not enabled. Call enableDocs() first.');
|
|
181
169
|
}
|
|
182
170
|
return this.docSystem.createMiddleware();
|
|
183
171
|
}
|
|
@@ -185,13 +173,13 @@ export class AppDocumentationManager {
|
|
|
185
173
|
// Refresh documentation (useful after adding new routes)
|
|
186
174
|
refreshDocs(): void {
|
|
187
175
|
if (!this.docSystem || !this.routingManager) {
|
|
188
|
-
throw new Error(
|
|
176
|
+
throw new Error('Documentation not enabled. Call enableDocs() first.');
|
|
189
177
|
}
|
|
190
178
|
|
|
191
179
|
const routes = this.routingManager.getIntelligentRoutes();
|
|
192
180
|
this.docSystem.generateFromRoutes(routes);
|
|
193
181
|
|
|
194
|
-
logger.debug(
|
|
182
|
+
logger.debug('Documentation refreshed', 'Refresh', {
|
|
195
183
|
routeCount: routes.length,
|
|
196
184
|
});
|
|
197
185
|
}
|
|
@@ -199,7 +187,7 @@ export class AppDocumentationManager {
|
|
|
199
187
|
// Get current OpenAPI spec
|
|
200
188
|
getOpenAPISpec(): OpenAPISpec {
|
|
201
189
|
if (!this.docSystem) {
|
|
202
|
-
throw new Error(
|
|
190
|
+
throw new Error('Documentation not enabled. Call enableDocs() first.');
|
|
203
191
|
}
|
|
204
192
|
return this.docSystem.getSpec();
|
|
205
193
|
}
|
|
@@ -207,7 +195,7 @@ export class AppDocumentationManager {
|
|
|
207
195
|
// Get docs as JSON
|
|
208
196
|
getDocsJSON(): string {
|
|
209
197
|
if (!this.docSystem) {
|
|
210
|
-
throw new Error(
|
|
198
|
+
throw new Error('Documentation not enabled. Call enableDocs() first.');
|
|
211
199
|
}
|
|
212
200
|
return this.docSystem.getOpenAPIJSON();
|
|
213
201
|
}
|
|
@@ -215,22 +203,20 @@ export class AppDocumentationManager {
|
|
|
215
203
|
// Get docs as YAML
|
|
216
204
|
getDocsYAML(): string {
|
|
217
205
|
if (!this.docSystem) {
|
|
218
|
-
throw new Error(
|
|
206
|
+
throw new Error('Documentation not enabled. Call enableDocs() first.');
|
|
219
207
|
}
|
|
220
208
|
return this.docSystem.getOpenAPIYAML();
|
|
221
209
|
}
|
|
222
210
|
}
|
|
223
211
|
|
|
224
212
|
// Convenience functions
|
|
225
|
-
export function createDocumentationSystem(
|
|
226
|
-
config: DocsConfig,
|
|
227
|
-
): DocumentationSystem {
|
|
213
|
+
export function createDocumentationSystem(config: DocsConfig): DocumentationSystem {
|
|
228
214
|
return new DocumentationSystem(config);
|
|
229
215
|
}
|
|
230
216
|
|
|
231
217
|
export function generateDocsFromIntelligentRoutes(
|
|
232
218
|
routes: CompiledRoute[],
|
|
233
|
-
config: DocsConfig
|
|
219
|
+
config: DocsConfig
|
|
234
220
|
): { spec: OpenAPISpec; middleware: any } {
|
|
235
221
|
const docSystem = new DocumentationSystem(config);
|
|
236
222
|
const spec = docSystem.generateFromRoutes(routes);
|
|
@@ -240,6 +226,6 @@ export function generateDocsFromIntelligentRoutes(
|
|
|
240
226
|
}
|
|
241
227
|
|
|
242
228
|
// Export all types and functions
|
|
243
|
-
export * from
|
|
244
|
-
export * from
|
|
245
|
-
export * from
|
|
229
|
+
export * from './openapi-generator';
|
|
230
|
+
export * from './swagger-ui';
|
|
231
|
+
export * from './zod-to-openapi';
|