@weconjs/core 0.1.1 → 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAmEH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAyB,EAAE;IAE3B,MAAM,EACJ,KAAK,GAAG,MAAM,EACd,OAAO,GAAG,OAAO,EACjB,aAAa,GAAG,IAAI,EACpB,UAAU,GAAG,KAAK,EAClB,MAAM,GAAG,MAAM,EACf,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,UAAU,GAAG,KAAK,GACnB,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,sEAAsE;QACtE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAQ,CAAC;QAE/C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC1D,OAAO,CAAC,MAAM,CAAC;QAEjB,gCAAgC;QAChC,8DAA8D;QAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAO,EAAE,EAAE;YACjF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,OAAO,GAAG,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,MAAM,OAAO,MAAM,UAAU,GAAG,OAAO,EAAE,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,MAAM,UAAU,GAAU,EAAE,CAAC;QAE7B,oBAAoB;QACpB,IAAI,aAAa,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CACb,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC7B,gBAAgB,EAAE,IAAI;gBACtB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;aAChE,CAAC,CACH,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,+CAA+C;gBAC/C,MAAM,MAAM,CAAC,2BAAqC,CAAC,CAAC;gBAEpD,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;gBAE3D,mBAAmB;gBACnB,UAAU,CAAC,IAAI,CACb,IAAI,eAAe,CAAC;oBAClB,QAAQ,EAAE,GAAG,MAAM,iBAAiB;oBACpC,WAAW,EAAE,YAAY;oBACzB,aAAa,EAAE,IAAI;oBACnB,OAAO;oBACP,QAAQ;oBACR,KAAK,EAAE,MAAM;iBACd,CAAC,CACH,CAAC;gBAEF,6BAA6B;gBAC7B,UAAU,CAAC,IAAI,CACb,IAAI,eAAe,CAAC;oBAClB,QAAQ,EAAE,GAAG,MAAM,mBAAmB;oBACtC,WAAW,EAAE,YAAY;oBACzB,aAAa,EAAE,IAAI;oBACnB,OAAO;oBACP,QAAQ,EAAE,KAAK,EAAE,yBAAyB;oBAC1C,KAAK,EAAE,OAAO;iBACf,CAAC,CACH,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CACV,yEAAyE,CAC1E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YACzC,KAAK;YACL,MAAM,EAAE,OAAO,CACb,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC5C,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CACnC;YACD,UAAU;YACV,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,+BAA+B;QAC/B,OAAO;YACL,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;YAC5D,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;YAC1D,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;YAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;YAC5D,OAAO,EAAE,aAAa;SACvB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;QACtD,OAAO,CAAC,IAAI,CACV,4DAA4D,CAC7D,CAAC;QACF,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAyB,EAAE;IAC7D,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC;IAEtD,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;IAE7E,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,OAAe,EAAE,IAA8B,EAAE,EAAE;QACrF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,OAAO,GAAG,SAAS,KAAK,GAAG,CAAC,WAAW,EAAE,MAAM,OAAO,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;IAClF,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;YACtB,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;YACtB,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -3,9 +3,54 @@
3
3
  *
4
4
  * Creates and configures the Express application with all framework features.
5
5
  * This is the main entry point for the Wecon framework.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createWecon, loadConfig } from '@weconjs/core';
10
+ *
11
+ * const config = await loadConfig('./wecon.config.ts');
12
+ *
13
+ * const app = await createWecon({
14
+ * config,
15
+ * modules: [authModule, usersModule],
16
+ * database: { enabled: true },
17
+ * plugins: { fieldShield: true },
18
+ * });
19
+ *
20
+ * await app.start();
21
+ * ```
6
22
  */
7
- import type { Application, Request, Response, NextFunction } from "express";
8
- import type { ResolvedConfig, WeconModule } from "../types.js";
23
+ import http from "http";
24
+ import https from "https";
25
+ import type { Application, RequestHandler } from "express";
26
+ import type { ResolvedConfig, WeconModule, WeconContext } from "../types.js";
27
+ import { type DatabaseConnection } from "../database/index.js";
28
+ /**
29
+ * API Error format
30
+ */
31
+ export interface ApiError {
32
+ code: string;
33
+ message: string;
34
+ field?: string;
35
+ params?: Record<string, unknown>;
36
+ }
37
+ /**
38
+ * Standard API Response format
39
+ */
40
+ export interface ApiResponse<T = unknown> {
41
+ success: boolean;
42
+ data: T | null;
43
+ errors: ApiError[] | null;
44
+ meta: Record<string, unknown> | null;
45
+ }
46
+ /**
47
+ * Response options for res.respond()
48
+ */
49
+ export interface RespondOptions<T = unknown> {
50
+ data?: T;
51
+ errors?: ApiError[];
52
+ meta?: Record<string, unknown>;
53
+ }
9
54
  /**
10
55
  * Options for creating a Wecon application
11
56
  */
@@ -19,25 +64,98 @@ export interface CreateWeconOptions {
19
64
  */
20
65
  modules: WeconModule[];
21
66
  /**
22
- * Custom middleware to apply
67
+ * The @weconjs/lib Wecon instance (for route handling)
68
+ * If provided, wecon.handler() is mounted automatically
69
+ */
70
+ wecon?: {
71
+ handler: () => RequestHandler;
72
+ };
73
+ /**
74
+ * Custom middleware to apply before routes
75
+ */
76
+ middleware?: RequestHandler[];
77
+ /**
78
+ * Database options
79
+ */
80
+ database?: {
81
+ /**
82
+ * Enable database connection
83
+ */
84
+ enabled?: boolean;
85
+ /**
86
+ * Direct MongoDB URI (overrides config)
87
+ */
88
+ uri?: string;
89
+ /**
90
+ * Mongoose plugins to register
91
+ */
92
+ plugins?: Array<{
93
+ plugin: (schema: unknown, options?: unknown) => void;
94
+ options?: unknown;
95
+ }>;
96
+ };
97
+ /**
98
+ * Plugin options
23
99
  */
24
- middleware?: Array<(req: Request, res: Response, next: NextFunction) => void>;
100
+ plugins?: {
101
+ /**
102
+ * Enable FieldShield integration
103
+ */
104
+ fieldShield?: boolean | {
105
+ strict?: boolean;
106
+ debug?: boolean;
107
+ };
108
+ };
109
+ /**
110
+ * i18n options
111
+ */
112
+ i18n?: {
113
+ /**
114
+ * Enable i18n middleware
115
+ * @default true if config.features.i18n.enabled
116
+ */
117
+ enabled?: boolean;
118
+ /**
119
+ * Path to modules directory for translation discovery
120
+ */
121
+ modulesDir?: string;
122
+ };
123
+ /**
124
+ * Logger options
125
+ */
126
+ logger?: {
127
+ /**
128
+ * Use Winston logger (requires winston package)
129
+ * @default true
130
+ */
131
+ useWinston?: boolean;
132
+ /**
133
+ * Enable file logging
134
+ * @default false
135
+ */
136
+ enableFile?: boolean;
137
+ /**
138
+ * Log directory
139
+ * @default 'logs'
140
+ */
141
+ logDir?: string;
142
+ };
25
143
  /**
26
144
  * Lifecycle hooks
27
145
  */
28
146
  hooks?: {
29
147
  /**
30
- * Called before server starts
148
+ * Called before server starts (after middleware setup)
31
149
  */
32
- onBoot?: () => Promise<void> | void;
150
+ onBoot?: (ctx: WeconContext) => Promise<void> | void;
33
151
  /**
34
152
  * Called when server is shutting down
35
153
  */
36
- onShutdown?: () => Promise<void> | void;
154
+ onShutdown?: (ctx: WeconContext) => Promise<void> | void;
37
155
  /**
38
156
  * Called after each module is initialized
39
157
  */
40
- onModuleInit?: (module: WeconModule) => Promise<void> | void;
158
+ onModuleInit?: (module: WeconModule, ctx: WeconContext) => Promise<void> | void;
41
159
  };
42
160
  }
43
161
  /**
@@ -48,10 +166,18 @@ export interface WeconApp {
48
166
  * The underlying Express application
49
167
  */
50
168
  app: Application;
169
+ /**
170
+ * The application context
171
+ */
172
+ ctx: WeconContext;
173
+ /**
174
+ * Database connection (if enabled)
175
+ */
176
+ db?: DatabaseConnection;
51
177
  /**
52
178
  * Start the server
53
179
  */
54
- start: (port?: number) => Promise<void>;
180
+ start: (port?: number) => Promise<http.Server | https.Server>;
55
181
  /**
56
182
  * Gracefully shutdown the server
57
183
  */
@@ -64,7 +190,9 @@ export interface WeconApp {
64
190
  * - Database connection
65
191
  * - i18n initialization
66
192
  * - Module loading
67
- * - Error handling
193
+ * - Logging
194
+ * - HTTPS support
195
+ * - Graceful shutdown
68
196
  *
69
197
  * @param options - Configuration options
70
198
  * @returns Wecon application instance
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAe,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,EAAE,cAAc,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,WAAW,EAAE,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC;IAE9E;;OAEG;IACH,KAAK,CAAC,EAAE;QACN;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAEpC;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAExC;;WAEG;QACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAC9D,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,GAAG,EAAE,WAAW,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6FhF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,138 @@
3
3
  *
4
4
  * Creates and configures the Express application with all framework features.
5
5
  * This is the main entry point for the Wecon framework.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createWecon, loadConfig } from '@weconjs/core';
10
+ *
11
+ * const config = await loadConfig('./wecon.config.ts');
12
+ *
13
+ * const app = await createWecon({
14
+ * config,
15
+ * modules: [authModule, usersModule],
16
+ * database: { enabled: true },
17
+ * plugins: { fieldShield: true },
18
+ * });
19
+ *
20
+ * await app.start();
21
+ * ```
22
+ */
23
+ import http from "http";
24
+ import https from "https";
25
+ import fs from "fs";
26
+ import path from "path";
27
+ import { createWinstonLogger, createConsoleLogger } from "../logger/index.js";
28
+ import { createDatabaseConnection, buildUriFromConfig } from "../database/index.js";
29
+ import { initI18n } from "../i18n/index.js";
30
+ import { createContext } from "../context.js";
31
+ /**
32
+ * Install respond helper on Express Response prototype
33
+ */
34
+ function installRespond() {
35
+ // Dynamic import to get express.response
36
+ import("express").then((express) => {
37
+ const response = express.default.response;
38
+ // Only install if response prototype exists (not in mock environments)
39
+ if (response && !response.respond) {
40
+ response.respond = function (options = {}) {
41
+ const { data, errors, meta } = options;
42
+ const hasErrors = errors && errors.length > 0;
43
+ const apiResponse = {
44
+ success: !hasErrors,
45
+ data: hasErrors ? null : (data ?? null),
46
+ errors: hasErrors ? errors : null,
47
+ meta: meta ?? null,
48
+ };
49
+ return this.json(apiResponse);
50
+ };
51
+ }
52
+ }).catch(() => {
53
+ // Express not available yet, will be installed later
54
+ });
55
+ }
56
+ /**
57
+ * Create HTTPS server if SSL certificates are available
58
+ */
59
+ function createHttpsServer(app, config, logger) {
60
+ try {
61
+ const httpsConfig = config.https;
62
+ if (!httpsConfig?.enabled) {
63
+ return null;
64
+ }
65
+ const keyPath = path.resolve(httpsConfig.keyPath ?? "");
66
+ const certPath = path.resolve(httpsConfig.certPath ?? "");
67
+ // Check if certificate files exist
68
+ if (!fs.existsSync(keyPath) || !fs.existsSync(certPath)) {
69
+ logger.warn("SSL certificates not found, falling back to HTTP", {
70
+ keyPath,
71
+ certPath,
72
+ });
73
+ return null;
74
+ }
75
+ const httpsOptions = {
76
+ key: fs.readFileSync(keyPath),
77
+ cert: fs.readFileSync(certPath),
78
+ };
79
+ return https.createServer(httpsOptions, app);
80
+ }
81
+ catch (error) {
82
+ logger.warn("Error creating HTTPS server, falling back to HTTP", {
83
+ error: error.message,
84
+ });
85
+ return null;
86
+ }
87
+ }
88
+ /**
89
+ * Create graceful shutdown handler
6
90
  */
91
+ function createGracefulShutdown(server, ctx, db, onShutdown) {
92
+ let isShuttingDown = false;
93
+ return async (signal) => {
94
+ if (isShuttingDown)
95
+ return;
96
+ isShuttingDown = true;
97
+ ctx.logger.info(`Received ${signal}. Starting graceful shutdown...`);
98
+ // Call shutdown hook
99
+ if (onShutdown) {
100
+ try {
101
+ await onShutdown(ctx);
102
+ }
103
+ catch (err) {
104
+ ctx.logger.error("Error in onShutdown hook", {
105
+ error: err.message,
106
+ });
107
+ }
108
+ }
109
+ // Close database connection
110
+ if (db) {
111
+ try {
112
+ await db.disconnect();
113
+ }
114
+ catch (err) {
115
+ ctx.logger.error("Error closing database", {
116
+ error: err.message,
117
+ });
118
+ }
119
+ }
120
+ // Close server
121
+ server.close((err) => {
122
+ if (err) {
123
+ ctx.logger.error("Error during server shutdown", {
124
+ error: err.message,
125
+ });
126
+ process.exit(1);
127
+ }
128
+ ctx.logger.info("Server closed successfully");
129
+ process.exit(0);
130
+ });
131
+ // Force close after 10 seconds
132
+ setTimeout(() => {
133
+ ctx.logger.error("Forced shutdown after timeout");
134
+ process.exit(1);
135
+ }, 10000);
136
+ };
137
+ }
7
138
  /**
8
139
  * Create a Wecon application
9
140
  *
@@ -11,84 +142,228 @@
11
142
  * - Database connection
12
143
  * - i18n initialization
13
144
  * - Module loading
14
- * - Error handling
145
+ * - Logging
146
+ * - HTTPS support
147
+ * - Graceful shutdown
15
148
  *
16
149
  * @param options - Configuration options
17
150
  * @returns Wecon application instance
18
151
  */
19
152
  export async function createWecon(options) {
20
- // Dynamic import to avoid bundling issues
153
+ const { config, modules, wecon, middleware = [], hooks = {} } = options;
154
+ // Install respond helper (wrapped in try-catch as express may not be available yet)
155
+ try {
156
+ installRespond();
157
+ }
158
+ catch {
159
+ // Will be installed when express is imported
160
+ }
161
+ // Create logger with defensive fallbacks
162
+ let logger;
163
+ const loggerOptions = {
164
+ level: config.logging?.level ?? "info",
165
+ appName: config.app?.name ?? "wecon",
166
+ enableFile: options.logger?.enableFile ?? config.logging?.enableFile ?? false,
167
+ logDir: options.logger?.logDir ?? "logs",
168
+ };
169
+ if (options.logger?.useWinston !== false) {
170
+ try {
171
+ logger = await createWinstonLogger(loggerOptions);
172
+ }
173
+ catch {
174
+ logger = createConsoleLogger(loggerOptions);
175
+ }
176
+ }
177
+ else {
178
+ logger = createConsoleLogger(loggerOptions);
179
+ }
180
+ // Dynamic import Express
21
181
  const express = (await import("express")).default;
22
182
  const app = express();
23
- const { config, modules, middleware = [], hooks = {} } = options;
183
+ // Create context (will update with app/io later)
184
+ const ctx = createContext({
185
+ config,
186
+ app,
187
+ logger,
188
+ });
189
+ // Connect database if enabled
190
+ let db;
191
+ const shouldConnectDb = options.database?.enabled ?? (config.database?.mongoose?.host !== undefined);
192
+ if (shouldConnectDb) {
193
+ try {
194
+ const uri = options.database?.uri ?? buildUriFromConfig(config.database);
195
+ const fieldShieldConfig = options.plugins?.fieldShield;
196
+ db = await createDatabaseConnection({
197
+ uri,
198
+ plugins: options.database?.plugins,
199
+ fieldShield: fieldShieldConfig
200
+ ? {
201
+ enabled: true,
202
+ strict: typeof fieldShieldConfig === "object" ? fieldShieldConfig.strict : true,
203
+ debug: typeof fieldShieldConfig === "object" ? fieldShieldConfig.debug : false,
204
+ }
205
+ : undefined,
206
+ debug: config.database.debug,
207
+ });
208
+ await db.connect();
209
+ }
210
+ catch (err) {
211
+ logger.error("Failed to connect to database", {
212
+ error: err.message,
213
+ });
214
+ throw err;
215
+ }
216
+ }
24
217
  // Apply default middleware
25
218
  app.use(express.json());
26
219
  app.use(express.urlencoded({ extended: true }));
220
+ // Initialize i18n if enabled
221
+ const i18nEnabled = options.i18n?.enabled ?? config.features?.i18n?.enabled;
222
+ if (i18nEnabled) {
223
+ try {
224
+ const modulesDir = options.i18n?.modulesDir ?? "./src/modules";
225
+ const defaultLocale = config.features?.i18n?.defaultLocale ?? "en";
226
+ const i18nMiddleware = await initI18n(modulesDir, defaultLocale);
227
+ app.use(i18nMiddleware);
228
+ logger.debug("i18n initialized");
229
+ }
230
+ catch (err) {
231
+ logger.warn("Failed to initialize i18n", {
232
+ error: err.message,
233
+ });
234
+ }
235
+ }
27
236
  // Apply custom middleware
28
237
  for (const mw of middleware) {
29
238
  app.use(mw);
30
239
  }
31
240
  // Health check endpoint
32
241
  app.get("/health", (_req, res) => {
33
- res.json({
34
- status: "ok",
35
- timestamp: new Date().toISOString(),
36
- environment: config.mode,
37
- app: config.app.name,
38
- version: config.app.version,
39
- });
242
+ const response = res.respond;
243
+ if (response) {
244
+ response.call(res, {
245
+ data: {
246
+ status: "ok",
247
+ timestamp: new Date().toISOString(),
248
+ environment: config.mode,
249
+ app: config.app.name,
250
+ version: config.app.version,
251
+ },
252
+ });
253
+ }
254
+ else {
255
+ res.json({
256
+ success: true,
257
+ data: {
258
+ status: "ok",
259
+ timestamp: new Date().toISOString(),
260
+ environment: config.mode,
261
+ app: config.app.name,
262
+ version: config.app.version,
263
+ },
264
+ });
265
+ }
40
266
  });
267
+ // Mount Wecon router if provided
268
+ if (wecon) {
269
+ app.use(wecon.handler());
270
+ logger.debug("Wecon routes mounted");
271
+ }
41
272
  // Initialize modules
42
273
  for (const mod of modules) {
43
274
  if (mod.onInit) {
44
- await mod.onInit({}); // Context will be passed properly
275
+ await mod.onInit(ctx);
45
276
  }
46
277
  if (hooks.onModuleInit) {
47
- await hooks.onModuleInit(mod);
278
+ await hooks.onModuleInit(mod, ctx);
48
279
  }
280
+ logger.debug(`Module initialized: ${mod.name}`);
49
281
  }
50
282
  // Global error handler
51
283
  app.use((err, _req, res, _next) => {
52
- console.error("[Wecon] Error:", err.message);
53
- res.status(500).json({
54
- success: false,
55
- message: err.message || "Internal Server Error",
284
+ logger.error("Unhandled error", {
285
+ error: err.message,
286
+ stack: err.stack,
56
287
  });
288
+ const response = res.respond;
289
+ if (response) {
290
+ res.status(500);
291
+ response.call(res, {
292
+ errors: [{ code: "INTERNAL_ERROR", message: err.message || "Internal Server Error" }],
293
+ });
294
+ }
295
+ else {
296
+ res.status(500).json({
297
+ success: false,
298
+ errors: [{ code: "INTERNAL_ERROR", message: err.message || "Internal Server Error" }],
299
+ });
300
+ }
57
301
  });
58
302
  let server = null;
59
303
  return {
60
304
  app,
305
+ ctx,
306
+ db,
61
307
  async start(port) {
62
308
  const serverPort = port ?? config.port ?? 3000;
63
309
  // Call onBoot hook
64
310
  if (hooks.onBoot) {
65
- await hooks.onBoot();
311
+ await hooks.onBoot(ctx);
312
+ }
313
+ // Try HTTPS first
314
+ const httpsServer = createHttpsServer(app, config, logger);
315
+ if (httpsServer) {
316
+ server = httpsServer;
317
+ const httpsPort = config.https.port ?? 443;
318
+ return new Promise((resolve) => {
319
+ server.listen(httpsPort, () => {
320
+ logger.info(`${config.app.name} v${config.app.version} running`, {
321
+ protocol: "https",
322
+ port: httpsPort,
323
+ mode: config.mode,
324
+ });
325
+ resolve(server);
326
+ });
327
+ });
66
328
  }
329
+ // Fall back to HTTP
330
+ server = http.createServer(app);
331
+ // Setup graceful shutdown
332
+ const gracefulShutdown = createGracefulShutdown(server, ctx, db, hooks.onShutdown);
333
+ process.on("SIGTERM", () => gracefulShutdown("SIGTERM"));
334
+ process.on("SIGINT", () => gracefulShutdown("SIGINT"));
335
+ process.on("SIGUSR2", () => gracefulShutdown("SIGUSR2"));
67
336
  return new Promise((resolve) => {
68
- server = app.listen(serverPort, () => {
69
- console.log(`\n[Wecon] ${config.app.name} v${config.app.version}`);
70
- console.log(`[Wecon] Running on http://localhost:${serverPort}`);
71
- console.log(`[Wecon] Mode: ${config.mode}\n`);
72
- resolve();
337
+ server.listen(serverPort, () => {
338
+ logger.info(`${config.app.name} v${config.app.version} running`, {
339
+ protocol: "http",
340
+ port: serverPort,
341
+ mode: config.mode,
342
+ });
343
+ resolve(server);
73
344
  });
74
345
  });
75
346
  },
76
347
  async shutdown() {
77
348
  // Call onShutdown hook
78
349
  if (hooks.onShutdown) {
79
- await hooks.onShutdown();
350
+ await hooks.onShutdown(ctx);
351
+ }
352
+ // Close database
353
+ if (db) {
354
+ await db.disconnect();
80
355
  }
81
356
  // Destroy modules
82
357
  for (const mod of modules) {
83
358
  if (mod.onDestroy) {
84
- await mod.onDestroy({});
359
+ await mod.onDestroy(ctx);
85
360
  }
86
361
  }
87
362
  // Close server
88
363
  if (server) {
89
364
  return new Promise((resolve) => {
90
365
  server.close(() => {
91
- console.log("[Wecon] Server shut down gracefully");
366
+ logger.info("Server shut down gracefully");
92
367
  resolve();
93
368
  });
94
369
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}