@forgedevstack/harbor 1.0.0 → 1.5.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.
- package/CHANGELOG.md +82 -101
- package/README.md +210 -794
- package/dist/auth/apiKey.d.ts +6 -0
- package/dist/auth/apiKey.d.ts.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +21 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/password.d.ts +6 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/rbac.d.ts +6 -0
- package/dist/auth/rbac.d.ts.map +1 -0
- package/dist/auth/signing.d.ts +5 -0
- package/dist/auth/signing.d.ts.map +1 -0
- package/dist/auth/types/apiKey.types.d.ts +9 -0
- package/dist/auth/types/apiKey.types.d.ts.map +1 -0
- package/dist/auth/types/index.d.ts +5 -0
- package/dist/auth/types/index.d.ts.map +1 -0
- package/dist/auth/types/jwt.types.d.ts +17 -0
- package/dist/auth/types/jwt.types.d.ts.map +1 -0
- package/dist/auth/types/rbac.types.d.ts +8 -0
- package/dist/auth/types/rbac.types.d.ts.map +1 -0
- package/dist/auth/types/signing.types.d.ts +8 -0
- package/dist/auth/types/signing.types.d.ts.map +1 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/manager.d.ts +24 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/stores.d.ts +28 -0
- package/dist/cache/stores.d.ts.map +1 -0
- package/dist/cache/types.d.ts +23 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cli/index.js +21 -22
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/router.d.ts +40 -2
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/database/connection.d.ts +1 -2
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/index.js +2 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/model.d.ts +1 -4
- package/dist/database/model.d.ts.map +1 -1
- package/dist/docker/index.js +1 -1
- package/dist/http.const-BKHG1Lsj.mjs +62 -0
- package/dist/http.const-BKHG1Lsj.mjs.map +1 -0
- package/dist/http.const-Ckcy7OFp.js +2 -0
- package/dist/http.const-Ckcy7OFp.js.map +1 -0
- package/dist/index-Ca4WpLvw.js +2 -0
- package/dist/index-Ca4WpLvw.js.map +1 -0
- package/dist/index-DIVHd6rO.mjs +1054 -0
- package/dist/index-DIVHd6rO.mjs.map +1 -0
- package/dist/index.cjs.js +16 -16
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +676 -1691
- package/dist/index.es.js.map +1 -1
- package/dist/logger-CZn7QxCl.mjs +102 -0
- package/dist/{logger-D7aJSi62.mjs.map → logger-CZn7QxCl.mjs.map} +1 -1
- package/dist/logger-D-lfaRWQ.js +3 -0
- package/dist/{logger-DEnWXtpk.js.map → logger-D-lfaRWQ.js.map} +1 -1
- package/dist/manager-CjcKb4P9.mjs +149 -0
- package/dist/{manager-B6vqJgEn.mjs.map → manager-CjcKb4P9.mjs.map} +1 -1
- package/dist/manager-DrF1vbJg.js +4 -0
- package/dist/{manager-B1UKMjXW.js.map → manager-DrF1vbJg.js.map} +1 -1
- package/dist/middleware/health.d.ts +65 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +5 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/metrics.d.ts +68 -0
- package/dist/middleware/metrics.d.ts.map +1 -0
- package/dist/middleware/rateLimit.d.ts +52 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/upload.d.ts +59 -0
- package/dist/middleware/upload.d.ts.map +1 -0
- package/dist/password-BXBkKbv3.js +2 -0
- package/dist/password-BXBkKbv3.js.map +1 -0
- package/dist/password-y4m307oa.mjs +223 -0
- package/dist/password-y4m307oa.mjs.map +1 -0
- package/dist/scheduler/index.d.ts +3 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +30 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/types.d.ts +25 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/types/server.types.d.ts +7 -0
- package/dist/types/server.types.d.ts.map +1 -1
- package/dist/upload-9lCNnKK_.js +5 -0
- package/dist/upload-9lCNnKK_.js.map +1 -0
- package/dist/upload-DUjQiuq7.mjs +619 -0
- package/dist/upload-DUjQiuq7.mjs.map +1 -0
- package/dist/validation/index.js +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/websocket/index.d.ts +3 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +2 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/manager.d.ts +30 -0
- package/dist/websocket/manager.d.ts.map +1 -0
- package/dist/websocket/types.d.ts +27 -0
- package/dist/websocket/types.d.ts.map +1 -0
- package/package.json +58 -18
- package/templates/default/controllers/user.controller.ts +44 -64
- package/templates/default/package.json +9 -33
- package/templates/default/routes/index.ts +2 -12
- package/templates/default/routes/user.routes.ts +26 -19
- package/templates/default/server.ts +16 -35
- package/dist/logger-D7aJSi62.mjs +0 -102
- package/dist/logger-DEnWXtpk.js +0 -3
- package/dist/manager-B1UKMjXW.js +0 -4
- package/dist/manager-B6vqJgEn.mjs +0 -152
- package/dist/portal.d.ts +0 -13
- package/dist/portal.d.ts.map +0 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/constants/config.const.ts","../src/constants/http.const.ts","../src/constants/defaults.const.ts","../src/core/config.ts","../src/i18n/locales/en.ts","../src/i18n/locales/he.ts","../src/i18n/index.ts","../src/core/router.ts","../src/core/errorHandler.ts","../src/core/server.ts","../src/database/schema.ts","../src/database/connection.ts","../src/database/model.ts","../src/database/index.ts","../src/changelog/manager.ts","../src/portal.ts","../src/utils/object.ts","../src/utils/helpers.ts","../src/utils/httpLogger.ts"],"sourcesContent":["export const CONFIG_FILE_NAME = 'harbor.config.json';\n\nexport const CONFIG_SEARCH_PATHS = [\n './harbor.config.json',\n './config/harbor.config.json',\n './.harbor/config.json',\n] as const;\n\nexport const ENV_PREFIX = 'HARBOR_';\n\nexport const ENV_KEYS = {\n PORT: 'HARBOR_PORT',\n HOST: 'HARBOR_HOST',\n LOG_LEVEL: 'HARBOR_LOG_LEVEL',\n CONFIG_PATH: 'HARBOR_CONFIG_PATH',\n NODE_ENV: 'NODE_ENV',\n} as const;\n\n","export const HTTP_METHODS = {\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n OPTIONS: 'OPTIONS',\n HEAD: 'HEAD',\n} as const;\n\nexport const HTTP_STATUS = {\n OK: 200,\n CREATED: 201,\n NO_CONTENT: 204,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n CONFLICT: 409,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n} as const;\n\nexport const HTTP_STATUS_MESSAGES: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 409: 'Conflict',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n};\n\nexport const CONTENT_TYPES = {\n JSON: 'application/json',\n HTML: 'text/html',\n TEXT: 'text/plain',\n FORM: 'application/x-www-form-urlencoded',\n MULTIPART: 'multipart/form-data',\n} as const;\n\nexport const HEADERS = {\n CONTENT_TYPE: 'Content-Type',\n AUTHORIZATION: 'Authorization',\n ACCEPT: 'Accept',\n CACHE_CONTROL: 'Cache-Control',\n X_REQUEST_ID: 'X-Request-ID',\n X_RESPONSE_TIME: 'X-Response-Time',\n} as const;\n\n","import type { HarborConfig } from '../types';\n\nexport const DEFAULT_PORT = 3000;\nexport const DEFAULT_HOST = 'localhost';\nexport const DEFAULT_TIMEOUT = 30000;\nexport const DEFAULT_BODY_LIMIT = '10mb';\n\nexport const DEFAULT_CONFIG: HarborConfig = {\n server: {\n port: DEFAULT_PORT,\n host: DEFAULT_HOST,\n cors: {\n enabled: true,\n origin: '*',\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n credentials: false,\n },\n bodyParser: {\n json: true,\n urlencoded: true,\n limit: DEFAULT_BODY_LIMIT,\n },\n trustProxy: false,\n },\n routes: {\n prefix: '',\n timeout: DEFAULT_TIMEOUT,\n defaultMiddleware: [],\n },\n validation: {\n adapter: 'mongoose',\n strictMode: true,\n sanitize: true,\n },\n errors: {\n 400: {\n message: 'Bad Request',\n json: true,\n log: false,\n },\n 401: {\n message: 'Unauthorized',\n json: true,\n log: true,\n },\n 403: {\n message: 'Forbidden',\n json: true,\n log: true,\n },\n 404: {\n message: 'Not Found',\n json: true,\n log: false,\n },\n 500: {\n message: 'Internal Server Error',\n json: true,\n log: true,\n },\n default: {\n message: 'An error occurred',\n json: true,\n log: true,\n },\n },\n logger: {\n enabled: true,\n level: 'info',\n format: 'text',\n output: 'console',\n },\n};\n\nexport const GRACEFUL_SHUTDOWN_TIMEOUT = 10000;\n\nexport const HEALTH_CHECK_INTERVAL = 30000;\n\n","import { readFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type { HarborConfig } from '../types';\nimport { CONFIG_SEARCH_PATHS, ENV_KEYS } from '../constants';\nimport { DEFAULT_CONFIG } from '../constants/defaults.const';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('config');\n\nexport function loadConfig(configPath?: string): HarborConfig {\n const path = findConfigPath(configPath);\n \n if (!path) {\n logger.info('No config file found, using defaults');\n return applyEnvOverrides(DEFAULT_CONFIG);\n }\n\n try {\n const fileContent = readFileSync(path, 'utf-8');\n const userConfig = JSON.parse(fileContent) as Partial<HarborConfig>;\n const mergedConfig = deepMerge(\n DEFAULT_CONFIG as unknown as Record<string, unknown>,\n userConfig as unknown as Record<string, unknown>\n ) as unknown as HarborConfig;\n\n logger.info('Config loaded', { path });\n return applyEnvOverrides(mergedConfig);\n } catch (error) {\n logger.error('Failed to load config', error as Error);\n return applyEnvOverrides(DEFAULT_CONFIG);\n }\n}\n\nexport function defineConfig(config: Partial<HarborConfig>): HarborConfig {\n return deepMerge(\n DEFAULT_CONFIG as unknown as Record<string, unknown>,\n config as unknown as Record<string, unknown>\n ) as unknown as HarborConfig;\n}\n\nfunction findConfigPath(customPath?: string): string | null {\n if (customPath) {\n const resolved = resolve(process.cwd(), customPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n return null;\n }\n\n const envPath = process.env[ENV_KEYS.CONFIG_PATH];\n if (envPath) {\n const resolved = resolve(process.cwd(), envPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n for (const searchPath of CONFIG_SEARCH_PATHS) {\n const resolved = resolve(process.cwd(), searchPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n return null;\n}\n\nfunction applyEnvOverrides(config: HarborConfig): HarborConfig {\n const envPort = process.env[ENV_KEYS.PORT];\n const envHost = process.env[ENV_KEYS.HOST];\n const envLogLevel = process.env[ENV_KEYS.LOG_LEVEL];\n\n if (envPort) {\n config.server.port = parseInt(envPort, 10);\n }\n\n if (envHost) {\n config.server.host = envHost;\n }\n\n if (envLogLevel) {\n config.logger.level = envLogLevel as HarborConfig['logger']['level'];\n }\n\n return config;\n}\n\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nexport function getConfigValue<T>(config: HarborConfig, path: string): T | undefined {\n const keys = path.split('.');\n let current: unknown = config;\n\n for (const key of keys) {\n if (current === null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current as T;\n}\n\n","export const en: Record<string, string> = {\n // Server\n 'server.starting': 'Server starting...',\n 'server.started': 'Server started on http://{host}:{port}',\n 'server.stopping': 'Server stopping...',\n 'server.stopped': 'Server stopped',\n 'server.alreadyRunning': 'Server is already running',\n 'server.error': 'Server error',\n 'server.gracefulShutdown': 'Received {signal}, shutting down gracefully',\n\n // Router\n 'router.registered': 'Registered route: {method} {path}',\n 'router.missingRequired': 'Route must have path, method, and handler',\n\n // Validation\n 'validation.failed': 'Validation failed',\n 'validation.required': '{field} is required',\n 'validation.typeMismatch': '{field} must be of type {type}',\n 'validation.minValue': '{field} must be at least {min}',\n 'validation.maxValue': '{field} must be at most {max}',\n 'validation.minLength': '{field} must be at least {min} characters',\n 'validation.maxLength': '{field} must be at most {max} characters',\n 'validation.pattern': '{field} does not match the required pattern',\n 'validation.enum': '{field} must be one of: {values}',\n 'validation.invalidObjectId': '{field} is not a valid ObjectId',\n 'validation.invalidEmail': '{field} is not a valid email address',\n 'validation.invalidUrl': '{field} is not a valid URL',\n 'validation.invalidDate': '{field} is not a valid date',\n 'validation.customFailed': '{field} failed custom validation',\n\n // Errors\n 'errors.badRequest': 'Bad Request',\n 'errors.unauthorized': 'Unauthorized',\n 'errors.forbidden': 'Forbidden',\n 'errors.notFound': 'Not Found',\n 'errors.conflict': 'Conflict',\n 'errors.tooManyRequests': 'Too Many Requests',\n 'errors.internal': 'Internal Server Error',\n 'errors.timeout': 'Request timeout',\n 'errors.default': 'An error occurred',\n\n // Config\n 'config.notFound': 'No config file found, using defaults',\n 'config.loaded': 'Config loaded from {path}',\n 'config.loadFailed': 'Failed to load config',\n\n // Docker\n 'docker.containerStarted': 'Container started: {name}',\n 'docker.containerStopped': 'Container stopped: {name}',\n 'docker.containerRestarted': 'Container restarted: {name}',\n 'docker.containerRemoved': 'Container removed: {name}',\n 'docker.imageBuilt': 'Image built: {name}:{tag}',\n 'docker.imagePushed': 'Image pushed: {name}',\n 'docker.imagePulled': 'Image pulled: {name}:{tag}',\n 'docker.composeUp': 'Docker Compose up completed',\n 'docker.composeDown': 'Docker Compose down completed',\n 'docker.commandFailed': 'Docker command failed: {command}',\n\n // Changelog\n 'changelog.loaded': 'Changelog loaded with {count} entries',\n 'changelog.saved': 'Changelog saved to {path}',\n 'changelog.released': 'Released version {version}',\n 'changelog.notFound': 'No changelog file found, starting fresh',\n\n // Portal\n 'portal.generated': 'Portal generated at {path}',\n 'portal.generating': 'Generating documentation portal...',\n\n // Logger\n 'logger.levelChanged': 'Log level changed to {level}',\n\n // HTTP Logger (Morgan-like)\n 'http.request': '{method} {url} {status} {duration}ms',\n 'http.requestStart': 'Incoming request: {method} {url}',\n 'http.requestEnd': 'Request completed: {method} {url} - {status} in {duration}ms',\n\n // CLI\n 'cli.init.success': 'Harbor project initialized!',\n 'cli.init.configExists': 'harbor.config.json already exists',\n 'cli.init.created': 'Created {file}',\n 'cli.docs.generating': 'Generating API documentation...',\n 'cli.docs.success': 'Documentation generated successfully',\n 'cli.version': 'Harbor v{version}',\n 'cli.unknownCommand': 'Unknown command: {command}',\n\n // Database\n 'database.connected': 'Connected to MongoDB at {uri}',\n 'database.disconnected': 'Disconnected from MongoDB',\n 'database.connecting': 'Connecting to MongoDB...',\n 'database.connectionFailed': 'Failed to connect to MongoDB: {error}',\n 'database.notConnected': 'Not connected to database. Call harbor.connect() first.',\n 'database.modelCreated': 'Model created: {name}',\n 'database.documentSaved': 'Document saved: {id}',\n 'database.documentDeleted': 'Document deleted: {id}',\n 'database.validationFailed': 'Validation failed: {errors}',\n 'database.queryExecuted': 'Query executed: {operation} on {collection}',\n 'database.indexCreated': 'Index created: {name}',\n 'database.transactionStarted': 'Transaction started',\n 'database.transactionCommitted': 'Transaction committed',\n 'database.transactionAborted': 'Transaction aborted',\n};\n\n","export const he: Record<string, string> = {\n // Server\n 'server.starting': 'השרת מופעל...',\n 'server.started': 'השרת פועל בכתובת http://{host}:{port}',\n 'server.stopping': 'השרת נעצר...',\n 'server.stopped': 'השרת נעצר',\n 'server.alreadyRunning': 'השרת כבר פועל',\n 'server.error': 'שגיאת שרת',\n 'server.gracefulShutdown': 'התקבל {signal}, מכבה בצורה מסודרת',\n\n // Router\n 'router.registered': 'נרשם נתיב: {method} {path}',\n 'router.missingRequired': 'נתיב חייב לכלול path, method ו-handler',\n\n // Validation\n 'validation.failed': 'האימות נכשל',\n 'validation.required': '{field} הוא שדה חובה',\n 'validation.typeMismatch': '{field} חייב להיות מסוג {type}',\n 'validation.minValue': '{field} חייב להיות לפחות {min}',\n 'validation.maxValue': '{field} חייב להיות לכל היותר {max}',\n 'validation.minLength': '{field} חייב להכיל לפחות {min} תווים',\n 'validation.maxLength': '{field} חייב להכיל לכל היותר {max} תווים',\n 'validation.pattern': '{field} לא תואם לתבנית הנדרשת',\n 'validation.enum': '{field} חייב להיות אחד מ: {values}',\n 'validation.invalidObjectId': '{field} אינו ObjectId תקין',\n 'validation.invalidEmail': '{field} אינה כתובת אימייל תקינה',\n 'validation.invalidUrl': '{field} אינו URL תקין',\n 'validation.invalidDate': '{field} אינו תאריך תקין',\n 'validation.customFailed': '{field} נכשל באימות מותאם אישית',\n\n // Errors\n 'errors.badRequest': 'בקשה שגויה',\n 'errors.unauthorized': 'לא מורשה',\n 'errors.forbidden': 'גישה נדחתה',\n 'errors.notFound': 'לא נמצא',\n 'errors.conflict': 'התנגשות',\n 'errors.tooManyRequests': 'יותר מדי בקשות',\n 'errors.internal': 'שגיאת שרת פנימית',\n 'errors.timeout': 'הבקשה פגה',\n 'errors.default': 'אירעה שגיאה',\n\n // Config\n 'config.notFound': 'קובץ הגדרות לא נמצא, משתמש בברירת מחדל',\n 'config.loaded': 'הגדרות נטענו מ-{path}',\n 'config.loadFailed': 'נכשל בטעינת הגדרות',\n\n // Docker\n 'docker.containerStarted': 'קונטיינר הופעל: {name}',\n 'docker.containerStopped': 'קונטיינר נעצר: {name}',\n 'docker.containerRestarted': 'קונטיינר הופעל מחדש: {name}',\n 'docker.containerRemoved': 'קונטיינר הוסר: {name}',\n 'docker.imageBuilt': 'תמונה נבנתה: {name}:{tag}',\n 'docker.imagePushed': 'תמונה הועלתה: {name}',\n 'docker.imagePulled': 'תמונה הורדה: {name}:{tag}',\n 'docker.composeUp': 'Docker Compose הופעל בהצלחה',\n 'docker.composeDown': 'Docker Compose נעצר בהצלחה',\n 'docker.commandFailed': 'פקודת Docker נכשלה: {command}',\n\n // Changelog\n 'changelog.loaded': 'יומן שינויים נטען עם {count} רשומות',\n 'changelog.saved': 'יומן שינויים נשמר ב-{path}',\n 'changelog.released': 'שוחררה גרסה {version}',\n 'changelog.notFound': 'קובץ יומן שינויים לא נמצא, מתחיל מחדש',\n\n // Portal\n 'portal.generated': 'פורטל נוצר ב-{path}',\n 'portal.generating': 'מייצר פורטל תיעוד...',\n\n // Logger\n 'logger.levelChanged': 'רמת הלוג שונתה ל-{level}',\n\n // HTTP Logger\n 'http.request': '{method} {url} {status} {duration}ms',\n 'http.requestStart': 'בקשה נכנסת: {method} {url}',\n 'http.requestEnd': 'בקשה הושלמה: {method} {url} - {status} תוך {duration}ms',\n\n // CLI\n 'cli.init.success': 'פרויקט Harbor אותחל בהצלחה!',\n 'cli.init.configExists': 'harbor.config.json כבר קיים',\n 'cli.init.created': 'נוצר {file}',\n 'cli.docs.generating': 'מייצר תיעוד API...',\n 'cli.docs.success': 'התיעוד נוצר בהצלחה',\n 'cli.version': 'Harbor גרסה {version}',\n 'cli.unknownCommand': 'פקודה לא מוכרת: {command}',\n\n // Database\n 'database.connected': 'מחובר ל-MongoDB ב-{uri}',\n 'database.disconnected': 'נותק מ-MongoDB',\n 'database.connecting': 'מתחבר ל-MongoDB...',\n 'database.connectionFailed': 'החיבור ל-MongoDB נכשל: {error}',\n 'database.notConnected': 'לא מחובר למסד נתונים. קרא ל-harbor.connect() קודם.',\n 'database.modelCreated': 'מודל נוצר: {name}',\n 'database.documentSaved': 'מסמך נשמר: {id}',\n 'database.documentDeleted': 'מסמך נמחק: {id}',\n 'database.validationFailed': 'האימות נכשל: {errors}',\n 'database.queryExecuted': 'שאילתה בוצעה: {operation} על {collection}',\n 'database.indexCreated': 'אינדקס נוצר: {name}',\n 'database.transactionStarted': 'טרנזקציה התחילה',\n 'database.transactionCommitted': 'טרנזקציה אושרה',\n 'database.transactionAborted': 'טרנזקציה בוטלה',\n};\n\n","import { en } from './locales/en';\nimport { he } from './locales/he';\n\nexport type Locale = 'en' | 'he';\n\nexport type TranslationKey = keyof typeof en;\n\nexport interface TranslationParams {\n [key: string]: string | number | boolean | undefined;\n}\n\nconst locales: Record<Locale, Record<string, string>> = {\n en,\n he,\n};\n\nlet currentLocale: Locale = 'en';\n\n/**\n * Set the current locale\n */\nexport function setLocale(locale: Locale): void {\n if (!locales[locale]) {\n console.warn(`Locale \"${locale}\" not found, falling back to \"en\"`);\n currentLocale = 'en';\n return;\n }\n currentLocale = locale;\n}\n\n/**\n * Get the current locale\n */\nexport function getLocale(): Locale {\n return currentLocale;\n}\n\n/**\n * Get all available locales\n */\nexport function getAvailableLocales(): Locale[] {\n return Object.keys(locales) as Locale[];\n}\n\n/**\n * Translate a key with optional parameters\n */\nexport function t(key: string, params?: TranslationParams): string {\n const translations = locales[currentLocale] ?? locales.en;\n let text = translations[key] ?? locales.en[key] ?? key;\n\n if (params) {\n for (const [paramKey, value] of Object.entries(params)) {\n text = text.replace(new RegExp(`{${paramKey}}`, 'g'), String(value ?? ''));\n }\n }\n\n return text;\n}\n\n/**\n * Translate a key for a specific locale\n */\nexport function tLocale(locale: Locale, key: string, params?: TranslationParams): string {\n const translations = locales[locale] ?? locales.en;\n let text = translations[key] ?? locales.en[key] ?? key;\n\n if (params) {\n for (const [paramKey, value] of Object.entries(params)) {\n text = text.replace(new RegExp(`{${paramKey}}`, 'g'), String(value ?? ''));\n }\n }\n\n return text;\n}\n\n/**\n * Add or update translations for a locale\n */\nexport function addTranslations(locale: Locale, translations: Record<string, string>): void {\n if (!locales[locale]) {\n locales[locale] = {};\n }\n Object.assign(locales[locale], translations);\n}\n\n/**\n * Register a new locale\n */\nexport function registerLocale(locale: string, translations: Record<string, string>): void {\n locales[locale as Locale] = translations;\n}\n\nexport { en, he };\n\n","import { Router, RequestHandler } from 'express';\nimport type {\n RouteDefinition,\n RouteOptions,\n HarborRequest,\n HarborResponse,\n HttpMethod,\n HarborConfig,\n PreFunction,\n PostFunction,\n RouteHandler,\n ValidationSchema,\n} from '../types';\nimport { validateRequest } from '../validation';\nimport { createLogger } from '../utils/logger';\nimport { HTTP_STATUS } from '../constants';\nimport { t } from '../i18n';\n\nconst logger = createLogger('router');\n\ninterface RouterOptions {\n prefix?: string;\n routes?: RouteDefinition[];\n middleware?: RequestHandler[];\n}\n\nexport function createRouter(options: RouterOptions, config: HarborConfig): Router {\n const router = Router();\n\n if (options.middleware) {\n options.middleware.forEach((mw) => router.use(mw));\n }\n\n if (options.routes) {\n options.routes.forEach((route) => {\n registerRoute(router, route, config);\n });\n }\n\n return router;\n}\n\nfunction registerRoute(router: Router, route: RouteDefinition, config: HarborConfig): void {\n const method = route.method.toLowerCase() as keyof Router;\n const handlers = buildHandlerChain(route, config);\n \n (router[method] as Function)(route.path, ...handlers);\n \n logger.debug(t('router.registered', { method: route.method, path: route.path }));\n}\n\nfunction buildHandlerChain(route: RouteDefinition, config: HarborConfig): RequestHandler[] {\n const handlers: RequestHandler[] = [];\n const options = route.options ?? {};\n\n if (options.pre) {\n options.pre.forEach((preFn) => {\n handlers.push(wrapPreFunction(preFn));\n });\n }\n\n if (options.validation) {\n handlers.push(validationMiddleware(options.validation, config));\n }\n\n if (options.timeout) {\n handlers.push(timeoutMiddleware(options.timeout));\n }\n\n handlers.push(wrapHandler(route.handler, options));\n\n return handlers;\n}\n\nfunction wrapPreFunction(preFn: PreFunction): RequestHandler {\n return async (req, res, next) => {\n try {\n await preFn(req as HarborRequest, res, next);\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction wrapHandler(handler: RouteHandler, options: RouteOptions): RequestHandler {\n return async (req, res, next) => {\n try {\n const result = await handler(req as HarborRequest, res as HarborResponse);\n\n if (options.post && options.post.length > 0) {\n for (const postFn of options.post) {\n await postFn(req as HarborRequest, res, result);\n }\n }\n\n if (!res.headersSent && result !== undefined) {\n res.json({\n success: true,\n data: result,\n });\n }\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction validationMiddleware(\n validation: NonNullable<RouteOptions['validation']>,\n config: HarborConfig\n): RequestHandler {\n return async (req, res, next) => {\n try {\n const validated: HarborRequest['validated'] = {};\n\n if (validation.params) {\n const result = await validateRequest(validation.params, req.params, config.validation);\n if (!result.valid) {\n res.status(HTTP_STATUS.BAD_REQUEST).json({\n success: false,\n error: {\n message: t('validation.failed'),\n details: result.errors,\n },\n });\n return;\n }\n validated.params = result.data as Record<string, unknown>;\n }\n\n if (validation.query) {\n const result = await validateRequest(validation.query, req.query, config.validation);\n if (!result.valid) {\n res.status(HTTP_STATUS.BAD_REQUEST).json({\n success: false,\n error: {\n message: t('validation.failed'),\n details: result.errors,\n },\n });\n return;\n }\n validated.query = result.data as Record<string, unknown>;\n }\n\n if (validation.body) {\n const result = await validateRequest(validation.body, req.body, config.validation);\n if (!result.valid) {\n res.status(HTTP_STATUS.BAD_REQUEST).json({\n success: false,\n error: {\n message: t('validation.failed'),\n details: result.errors,\n },\n });\n return;\n }\n validated.body = result.data as Record<string, unknown>;\n }\n\n (req as HarborRequest).validated = validated;\n next();\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction timeoutMiddleware(timeout: number): RequestHandler {\n return (_req, res, next) => {\n const timer = setTimeout(() => {\n if (!res.headersSent) {\n res.status(HTTP_STATUS.GATEWAY_TIMEOUT).json({\n success: false,\n error: {\n message: t('errors.timeout'),\n },\n });\n }\n }, timeout);\n\n res.on('finish', () => clearTimeout(timer));\n res.on('close', () => clearTimeout(timer));\n\n next();\n };\n}\n\n// ============================================================================\n// SIMPLIFIED ROUTE DEFINITIONS - No .build() needed!\n// ============================================================================\n\nexport type RouteHandlerFn = (req: HarborRequest, res: HarborResponse) => unknown | Promise<unknown>;\n\nexport interface SimpleRouteOptions {\n pre?: PreFunction[];\n post?: PostFunction[];\n validation?: {\n params?: ValidationSchema;\n query?: ValidationSchema;\n body?: ValidationSchema;\n headers?: ValidationSchema;\n };\n timeout?: number;\n}\n\n/**\n * Define a GET route\n */\nexport function GET(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('GET', path, handler, options);\n}\n\n/**\n * Define a POST route\n */\nexport function POST(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('POST', path, handler, options);\n}\n\n/**\n * Define a PUT route\n */\nexport function PUT(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('PUT', path, handler, options);\n}\n\n/**\n * Define a PATCH route\n */\nexport function PATCH(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('PATCH', path, handler, options);\n}\n\n/**\n * Define a DELETE route\n */\nexport function DELETE(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('DELETE', path, handler, options);\n}\n\n/**\n * Create a route definition\n */\nexport function route(\n method: HttpMethod,\n path: string,\n handler: RouteHandlerFn,\n options?: SimpleRouteOptions\n): RouteDefinition {\n return createRoute(method, path, handler, options);\n}\n\nfunction createRoute(\n method: HttpMethod,\n path: string,\n handler: RouteHandlerFn,\n options?: SimpleRouteOptions\n): RouteDefinition {\n return {\n path,\n method,\n handler,\n options: options ? {\n pre: options.pre,\n post: options.post,\n validation: options.validation,\n timeout: options.timeout,\n } : undefined,\n };\n}\n\n// ============================================================================\n// ROUTE BUILDER (Legacy support - still works but optional)\n// ============================================================================\n\nexport class RouteBuilder {\n private _route: Partial<RouteDefinition> = {};\n private _options: RouteOptions = {};\n\n static create(): RouteBuilder {\n return new RouteBuilder();\n }\n\n path(path: string): this {\n this._route.path = path;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._route.method = method;\n return this;\n }\n\n get(path: string): this {\n return this.method('GET').path(path);\n }\n\n post(path: string): this {\n return this.method('POST').path(path);\n }\n\n put(path: string): this {\n return this.method('PUT').path(path);\n }\n\n patch(path: string): this {\n return this.method('PATCH').path(path);\n }\n\n delete(path: string): this {\n return this.method('DELETE').path(path);\n }\n\n handler(handler: RouteHandler): RouteDefinition {\n // Returns directly - no need for .build()!\n this._route.handler = handler;\n \n if (!this._route.path || !this._route.method || !this._route.handler) {\n throw new Error(t('router.missingRequired'));\n }\n\n return {\n path: this._route.path,\n method: this._route.method,\n handler: this._route.handler,\n options: Object.keys(this._options).length > 0 ? this._options : undefined,\n };\n }\n\n pre(...fns: PreFunction[]): this {\n this._options.pre = [...(this._options.pre ?? []), ...fns];\n return this;\n }\n\n postFn(...fns: PostFunction[]): this {\n this._options.post = [...(this._options.post ?? []), ...fns];\n return this;\n }\n\n validate(validation: RouteOptions['validation']): this {\n this._options.validation = validation;\n return this;\n }\n\n timeout(ms: number): this {\n this._options.timeout = ms;\n return this;\n }\n\n rateLimit(config: RouteOptions['rateLimit']): this {\n this._options.rateLimit = config;\n return this;\n }\n\n auth(config: RouteOptions['auth']): this {\n this._options.auth = config;\n return this;\n }\n\n cache(config: RouteOptions['cache']): this {\n this._options.cache = config;\n return this;\n }\n\n // Legacy .build() still works for backwards compatibility\n build(): RouteDefinition {\n if (!this._route.path || !this._route.method || !this._route.handler) {\n throw new Error(t('router.missingRequired'));\n }\n\n return {\n path: this._route.path,\n method: this._route.method,\n handler: this._route.handler,\n options: Object.keys(this._options).length > 0 ? this._options : undefined,\n };\n }\n}\n","import type { ErrorRequestHandler, RequestHandler, Request, Response, NextFunction } from 'express';\nimport type { HarborConfig, ErrorsConfig, ErrorHandler } from '../types';\nimport { HTTP_STATUS, HTTP_STATUS_MESSAGES } from '../constants';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('error');\n\nexport class HarborError extends Error {\n public statusCode: number;\n public code?: string;\n public details?: unknown;\n public isOperational: boolean;\n\n constructor(\n message: string,\n statusCode: number = HTTP_STATUS.INTERNAL_SERVER_ERROR,\n options?: {\n code?: string;\n details?: unknown;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'HarborError';\n this.statusCode = statusCode;\n this.code = options?.code;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n Error.captureStackTrace(this, this.constructor);\n }\n\n static badRequest(message?: string, details?: unknown): HarborError {\n return new HarborError(\n message ?? 'Bad Request',\n HTTP_STATUS.BAD_REQUEST,\n { code: 'BAD_REQUEST', details }\n );\n }\n\n static unauthorized(message?: string): HarborError {\n return new HarborError(\n message ?? 'Unauthorized',\n HTTP_STATUS.UNAUTHORIZED,\n { code: 'UNAUTHORIZED' }\n );\n }\n\n static forbidden(message?: string): HarborError {\n return new HarborError(\n message ?? 'Forbidden',\n HTTP_STATUS.FORBIDDEN,\n { code: 'FORBIDDEN' }\n );\n }\n\n static notFound(message?: string): HarborError {\n return new HarborError(\n message ?? 'Not Found',\n HTTP_STATUS.NOT_FOUND,\n { code: 'NOT_FOUND' }\n );\n }\n\n static conflict(message?: string, details?: unknown): HarborError {\n return new HarborError(\n message ?? 'Conflict',\n HTTP_STATUS.CONFLICT,\n { code: 'CONFLICT', details }\n );\n }\n\n static internal(message?: string): HarborError {\n return new HarborError(\n message ?? 'Internal Server Error',\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n { code: 'INTERNAL_ERROR', isOperational: false }\n );\n }\n\n static tooManyRequests(message?: string): HarborError {\n return new HarborError(\n message ?? 'Too Many Requests',\n HTTP_STATUS.TOO_MANY_REQUESTS,\n { code: 'RATE_LIMIT_EXCEEDED' }\n );\n }\n\n toJSON(): Record<string, unknown> {\n return {\n success: false,\n error: {\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n details: this.details,\n },\n };\n }\n}\n\nexport function createErrorHandler(config: HarborConfig): ErrorRequestHandler {\n const errorsConfig = config.errors;\n\n return (error: Error | HarborError, req: Request, res: Response, _next: NextFunction): void => {\n const statusCode = (error as HarborError).statusCode ?? HTTP_STATUS.INTERNAL_SERVER_ERROR;\n const errorConfig = getErrorConfig(statusCode, errorsConfig);\n\n if (errorConfig?.log !== false && config.logger.enabled) {\n logger.error(`${req.method} ${req.path} - ${error.message}`, error);\n }\n\n if (res.headersSent) {\n return;\n }\n\n if (errorConfig?.redirect) {\n res.redirect(errorConfig.redirect);\n return;\n }\n\n const response = buildErrorResponse(error, statusCode, errorConfig);\n\n if (errorConfig?.json !== false) {\n res.status(statusCode).json(response);\n } else {\n res.status(statusCode).send(response.error.message);\n }\n };\n}\n\nfunction getErrorConfig(statusCode: number, errorsConfig: ErrorsConfig): ErrorHandler | undefined {\n const statusKey = statusCode.toString() as keyof ErrorsConfig;\n return errorsConfig[statusKey] ?? errorsConfig.default;\n}\n\nfunction buildErrorResponse(\n error: Error | HarborError,\n statusCode: number,\n errorConfig?: ErrorHandler\n): { success: false; error: { message: string; code?: string; statusCode: number; details?: unknown } } {\n if (error instanceof HarborError) {\n return error.toJSON() as ReturnType<typeof buildErrorResponse>;\n }\n\n const message = errorConfig?.message ?? error.message ?? HTTP_STATUS_MESSAGES[statusCode] ?? 'An error occurred';\n\n return {\n success: false,\n error: {\n message,\n statusCode,\n },\n };\n}\n\nexport function notFoundHandler(config: HarborConfig): RequestHandler {\n return (req: Request, res: Response, _next: NextFunction): void => {\n const errorConfig = config.errors[404];\n \n if (config.logger.enabled && errorConfig?.log) {\n logger.warn(`404 Not Found: ${req.method} ${req.path}`);\n }\n\n if (errorConfig?.redirect) {\n res.redirect(errorConfig.redirect);\n return;\n }\n\n const message = errorConfig?.message ?? 'Not Found';\n\n if (errorConfig?.json !== false) {\n res.status(HTTP_STATUS.NOT_FOUND).json({\n success: false,\n error: {\n message,\n code: 'NOT_FOUND',\n statusCode: HTTP_STATUS.NOT_FOUND,\n },\n });\n } else {\n res.status(HTTP_STATUS.NOT_FOUND).send(message);\n }\n };\n}\n\n","import express, { Express, RequestHandler } from 'express';\nimport { createServer as createHttpServer, Server as HttpServer } from 'http';\nimport type {\n HarborServer,\n ServerInfo,\n CreateServerOptions,\n ServerStatus,\n HarborConfig,\n RouteDefinition,\n RouteGroup,\n} from '../types';\nimport { loadConfig } from './config';\nimport { createRouter } from './router';\nimport { createErrorHandler } from './errorHandler';\nimport { createLogger } from '../utils/logger';\nimport { GRACEFUL_SHUTDOWN_TIMEOUT } from '../constants/defaults.const';\n\nconst logger = createLogger('server');\n\nexport function createServer(options: CreateServerOptions = {}): HarborServer {\n const config = loadConfig(options.configPath);\n const app = express();\n let server: HttpServer | null = null;\n let status: ServerStatus = 'stopped';\n let startedAt: Date | null = null;\n const routes: RouteDefinition[] = [];\n\n applyMiddleware(app, config);\n\n const harborServer: HarborServer = {\n app,\n server,\n config,\n\n async start(): Promise<ServerInfo> {\n if (status === 'running') {\n logger.warn('Server is already running');\n return harborServer.getInfo();\n }\n\n status = 'starting';\n const port = options.port ?? config.server.port;\n const host = options.host ?? config.server.host ?? 'localhost';\n\n return new Promise((resolve, reject) => {\n try {\n server = createHttpServer(app);\n harborServer.server = server;\n\n server.listen(port, host, () => {\n status = 'running';\n startedAt = new Date();\n \n const info = harborServer.getInfo();\n logger.info(`Server started on http://${host}:${port}`);\n \n options.onReady?.(info);\n resolve(info);\n });\n\n server.on('error', (error) => {\n status = 'error';\n logger.error('Server error', error);\n options.onError?.(error);\n reject(error);\n });\n\n setupGracefulShutdown(harborServer);\n } catch (error) {\n status = 'error';\n reject(error);\n }\n });\n },\n\n async stop(): Promise<void> {\n if (!server || status === 'stopped') {\n return;\n }\n\n status = 'stopping';\n \n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n server?.close();\n resolve();\n }, GRACEFUL_SHUTDOWN_TIMEOUT);\n\n server!.close((error) => {\n clearTimeout(timeout);\n if (error) {\n logger.error('Error stopping server', error);\n reject(error);\n } else {\n status = 'stopped';\n startedAt = null;\n logger.info('Server stopped');\n resolve();\n }\n });\n });\n },\n\n async restart(): Promise<ServerInfo> {\n await harborServer.stop();\n return harborServer.start();\n },\n\n addRoute(route: RouteDefinition): void {\n routes.push(route);\n const router = createRouter({ routes: [route] }, config);\n app.use(router);\n },\n\n addRouteGroup(group: RouteGroup): void {\n routes.push(...group.routes);\n const router = createRouter({ \n prefix: group.prefix, \n routes: group.routes,\n middleware: group.middleware,\n }, config);\n app.use(group.prefix, router);\n },\n\n addMiddleware(middleware: RequestHandler): void {\n app.use(middleware);\n },\n\n getInfo(): ServerInfo {\n const port = options.port ?? config.server.port;\n const host = options.host ?? config.server.host ?? 'localhost';\n \n return {\n port,\n host,\n uptime: startedAt ? Date.now() - startedAt.getTime() : 0,\n startedAt,\n routes: routes.map((r) => ({\n path: r.path,\n method: r.method,\n middleware: [],\n })),\n status,\n };\n },\n };\n\n if (options.autoStart !== false) {\n harborServer.start().catch((error) => {\n logger.error('Failed to auto-start server', error);\n });\n }\n\n return harborServer;\n}\n\nfunction applyMiddleware(app: Express, config: HarborConfig): void {\n if (config.server.bodyParser?.json) {\n app.use(express.json({ limit: config.server.bodyParser.limit }));\n }\n\n if (config.server.bodyParser?.urlencoded) {\n app.use(express.urlencoded({ \n extended: true, \n limit: config.server.bodyParser.limit \n }));\n }\n\n if (config.server.cors?.enabled) {\n app.use(corsMiddleware(config.server.cors));\n }\n\n app.use(requestEnhancer());\n\n const errorHandler = createErrorHandler(config);\n app.use(errorHandler);\n}\n\nfunction corsMiddleware(corsConfig: NonNullable<HarborConfig['server']['cors']>): RequestHandler {\n return (req, res, next) => {\n const origin = corsConfig.origin;\n \n if (origin === true || origin === '*') {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (Array.isArray(origin)) {\n const requestOrigin = req.headers.origin;\n if (requestOrigin && origin.includes(requestOrigin)) {\n res.setHeader('Access-Control-Allow-Origin', requestOrigin);\n }\n }\n\n res.setHeader(\n 'Access-Control-Allow-Methods',\n corsConfig.methods?.join(', ') ?? 'GET,POST,PUT,PATCH,DELETE,OPTIONS'\n );\n\n if (corsConfig.allowedHeaders) {\n res.setHeader('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));\n } else {\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n\n if (corsConfig.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n };\n}\n\nfunction requestEnhancer(): RequestHandler {\n return (req, res, next) => {\n (req as any).startTime = Date.now();\n (req as any).harborContext = {};\n\n (res as any).success = function <T>(data: T, statusCode = 200) {\n res.status(statusCode).json({\n success: true,\n data,\n });\n };\n\n (res as any).error = function (message: string, statusCode = 500, details?: unknown) {\n res.status(statusCode).json({\n success: false,\n error: {\n message,\n details,\n },\n });\n };\n\n next();\n };\n}\n\nfunction setupGracefulShutdown(server: HarborServer): void {\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\n\n signals.forEach((signal) => {\n process.on(signal, async () => {\n logger.info(`Received ${signal}, shutting down gracefully`);\n await server.stop();\n process.exit(0);\n });\n });\n}\n\n","// Harbor Schema - Mongoose-compatible schema definition\nimport type {\n SchemaDefinition,\n SchemaFieldDefinition,\n SchemaOptions,\n SchemaType,\n MiddlewareFunction,\n VirtualDefinition,\n HookType,\n QueryHookType,\n IndexDefinition,\n IndexOptions,\n} from './types';\n\nexport class Schema<T = unknown> {\n private _definition: SchemaDefinition;\n private _options: SchemaOptions;\n private _paths: Map<string, SchemaFieldDefinition> = new Map();\n private _virtuals: Map<string, VirtualDefinition> = new Map();\n private _methods: Map<string, Function> = new Map();\n private _statics: Map<string, Function> = new Map();\n private _preHooks: Map<string, MiddlewareFunction[]> = new Map();\n private _postHooks: Map<string, MiddlewareFunction[]> = new Map();\n private _indexes: Array<{ fields: IndexDefinition; options?: IndexOptions }> = [];\n private _plugins: Array<{ fn: Function; options?: unknown }> = [];\n\n // Public accessors for methods and statics\n methods: Record<string, Function> = {};\n statics: Record<string, Function> = {};\n virtuals: Record<string, VirtualDefinition> = {};\n\n constructor(definition: SchemaDefinition, options?: SchemaOptions) {\n this._definition = definition;\n this._options = {\n timestamps: false,\n strict: true,\n strictQuery: false,\n _id: true,\n id: true,\n versionKey: '__v',\n autoIndex: true,\n autoCreate: true,\n minimize: true,\n ...options,\n };\n\n // Parse schema definition\n this._parseDefinition(definition);\n\n // Add _id field if enabled\n if (this._options._id) {\n this._paths.set('_id', { type: 'ObjectId', required: false });\n }\n\n // Add timestamp fields if enabled\n if (this._options.timestamps) {\n const createdAtField = typeof this._options.timestamps === 'object' \n ? (this._options.timestamps.createdAt === false ? null : (this._options.timestamps.createdAt || 'createdAt'))\n : 'createdAt';\n const updatedAtField = typeof this._options.timestamps === 'object'\n ? (this._options.timestamps.updatedAt === false ? null : (this._options.timestamps.updatedAt || 'updatedAt'))\n : 'updatedAt';\n\n if (createdAtField) {\n this._paths.set(createdAtField as string, { type: 'Date', required: false });\n }\n if (updatedAtField) {\n this._paths.set(updatedAtField as string, { type: 'Date', required: false });\n }\n }\n\n // Add version key if enabled\n if (this._options.versionKey) {\n const versionField = typeof this._options.versionKey === 'string' ? this._options.versionKey : '__v';\n this._paths.set(versionField, { type: 'Number', default: 0 });\n }\n\n // Proxy for methods\n this.methods = new Proxy({}, {\n set: (_, prop: string, value: Function) => {\n this._methods.set(prop, value);\n return true;\n },\n get: (_, prop: string) => {\n return this._methods.get(prop);\n },\n });\n\n // Proxy for statics\n this.statics = new Proxy({}, {\n set: (_, prop: string, value: Function) => {\n this._statics.set(prop, value);\n return true;\n },\n get: (_, prop: string) => {\n return this._statics.get(prop);\n },\n });\n }\n\n private _parseDefinition(definition: SchemaDefinition, prefix: string = ''): void {\n for (const [key, value] of Object.entries(definition)) {\n const path = prefix ? `${prefix}.${key}` : key;\n \n if (typeof value === 'string') {\n // Shorthand: { name: 'String' }\n this._paths.set(path, { type: value as SchemaType });\n } else if (typeof value === 'object' && value !== null) {\n const fieldDef = value as SchemaFieldDefinition;\n \n if ('type' in fieldDef) {\n // Full definition: { name: { type: 'String', required: true } }\n if (typeof fieldDef.type === 'string') {\n this._paths.set(path, fieldDef);\n } else if (Array.isArray(fieldDef.type)) {\n // Array type: { tags: { type: ['String'] } }\n this._paths.set(path, { ...fieldDef, type: 'Array' });\n } else if (typeof fieldDef.type === 'object') {\n // Nested schema\n this._paths.set(path, { type: 'Object' });\n this._parseDefinition(fieldDef.type as unknown as SchemaDefinition, path);\n }\n } else {\n // Nested object without type: { meta: { votes: Number } }\n this._paths.set(path, { type: 'Object' });\n this._parseDefinition(value as unknown as SchemaDefinition, path);\n }\n }\n }\n }\n\n // Add additional fields to schema\n add(definition: SchemaDefinition, prefix?: string): this {\n this._parseDefinition(definition, prefix);\n return this;\n }\n\n // Get path definition\n path(name: string): SchemaFieldDefinition | undefined {\n return this._paths.get(name);\n }\n\n // Get all paths\n paths(): Map<string, SchemaFieldDefinition> {\n return this._paths;\n }\n\n // Define virtual field\n virtual(name: string): VirtualBuilder {\n return new VirtualBuilder(this, name);\n }\n\n // Define instance method\n method(name: string, fn: Function): this {\n this._methods.set(name, fn);\n return this;\n }\n\n // Define static method\n static(name: string, fn: Function): this {\n this._statics.set(name, fn);\n return this;\n }\n\n // Pre hook\n pre<K extends HookType | QueryHookType>(\n hookName: K | K[],\n fn: MiddlewareFunction<T>\n ): this {\n const hooks = Array.isArray(hookName) ? hookName : [hookName];\n for (const hook of hooks) {\n const existing = this._preHooks.get(hook) || [];\n existing.push(fn as MiddlewareFunction);\n this._preHooks.set(hook, existing);\n }\n return this;\n }\n\n // Post hook\n post<K extends HookType | QueryHookType>(\n hookName: K | K[],\n fn: MiddlewareFunction<T>\n ): this {\n const hooks = Array.isArray(hookName) ? hookName : [hookName];\n for (const hook of hooks) {\n const existing = this._postHooks.get(hook) || [];\n existing.push(fn as MiddlewareFunction);\n this._postHooks.set(hook, existing);\n }\n return this;\n }\n\n // Define index\n index(fields: IndexDefinition, options?: IndexOptions): this {\n this._indexes.push({ fields, options });\n return this;\n }\n\n // Plugin support\n plugin(fn: (schema: Schema<T>, options?: unknown) => void, options?: unknown): this {\n this._plugins.push({ fn, options });\n fn(this, options);\n return this;\n }\n\n // Load class methods as schema methods\n loadClass(cls: new () => unknown): this {\n const proto = cls.prototype;\n \n // Instance methods\n for (const name of Object.getOwnPropertyNames(proto)) {\n if (name === 'constructor') continue;\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n \n if (descriptor?.get) {\n // Getter -> virtual\n this._virtuals.set(name, { get: descriptor.get });\n } else if (descriptor?.set) {\n const existing = this._virtuals.get(name) || {};\n this._virtuals.set(name, { ...existing, set: descriptor.set });\n } else if (typeof descriptor?.value === 'function') {\n // Method\n this._methods.set(name, descriptor.value);\n }\n }\n\n // Static methods\n for (const name of Object.getOwnPropertyNames(cls)) {\n if (['length', 'prototype', 'name'].includes(name)) continue;\n const value = (cls as any)[name];\n if (typeof value === 'function') {\n this._statics.set(name, value);\n }\n }\n\n return this;\n }\n\n // Clone schema\n clone(): Schema<T> {\n const cloned = new Schema<T>({}, this._options);\n cloned._paths = new Map(this._paths);\n cloned._virtuals = new Map(this._virtuals);\n cloned._methods = new Map(this._methods);\n cloned._statics = new Map(this._statics);\n cloned._preHooks = new Map(this._preHooks);\n cloned._postHooks = new Map(this._postHooks);\n cloned._indexes = [...this._indexes];\n return cloned;\n }\n\n // Getters\n get options(): SchemaOptions {\n return this._options;\n }\n\n get definition(): SchemaDefinition {\n return this._definition;\n }\n\n getMethods(): Map<string, Function> {\n return this._methods;\n }\n\n getStatics(): Map<string, Function> {\n return this._statics;\n }\n\n getVirtuals(): Map<string, VirtualDefinition> {\n return this._virtuals;\n }\n\n getPreHooks(): Map<string, MiddlewareFunction[]> {\n return this._preHooks;\n }\n\n getPostHooks(): Map<string, MiddlewareFunction[]> {\n return this._postHooks;\n }\n\n getIndexes(): Array<{ fields: IndexDefinition; options?: IndexOptions }> {\n return this._indexes;\n }\n\n // Validate document against schema\n async validate(doc: Record<string, unknown>): Promise<{ valid: boolean; errors?: Array<{ path: string; message: string }> }> {\n const errors: Array<{ path: string; message: string }> = [];\n\n for (const [path, fieldDef] of this._paths) {\n const value = this._getNestedValue(doc, path);\n const fieldErrors = await this._validateField(path, value, fieldDef);\n errors.push(...fieldErrors);\n }\n\n if (errors.length > 0) {\n return { valid: false, errors };\n }\n\n return { valid: true };\n }\n\n private _getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((current: any, key) => current?.[key], obj);\n }\n\n private async _validateField(\n path: string,\n value: unknown,\n fieldDef: SchemaFieldDefinition\n ): Promise<Array<{ path: string; message: string }>> {\n const errors: Array<{ path: string; message: string }> = [];\n\n // Required check\n if (fieldDef.required && (value === undefined || value === null)) {\n errors.push({ path, message: `${path} is required` });\n return errors;\n }\n\n if (value === undefined || value === null) {\n return errors;\n }\n\n // Type validation\n if (!this._validateType(value, fieldDef.type as SchemaType)) {\n errors.push({ path, message: `${path} must be of type ${fieldDef.type}` });\n return errors;\n }\n\n // String validations\n if (fieldDef.type === 'String' && typeof value === 'string') {\n if (fieldDef.minLength && value.length < fieldDef.minLength) {\n errors.push({ path, message: `${path} must be at least ${fieldDef.minLength} characters` });\n }\n if (fieldDef.maxLength && value.length > fieldDef.maxLength) {\n errors.push({ path, message: `${path} must be at most ${fieldDef.maxLength} characters` });\n }\n if (fieldDef.match && !fieldDef.match.test(value)) {\n errors.push({ path, message: `${path} does not match required pattern` });\n }\n if (fieldDef.enum && !fieldDef.enum.includes(value)) {\n errors.push({ path, message: `${path} must be one of: ${fieldDef.enum.join(', ')}` });\n }\n }\n\n // Number validations\n if (fieldDef.type === 'Number' && typeof value === 'number') {\n if (fieldDef.min !== undefined && value < (fieldDef.min as number)) {\n errors.push({ path, message: `${path} must be at least ${fieldDef.min}` });\n }\n if (fieldDef.max !== undefined && value > (fieldDef.max as number)) {\n errors.push({ path, message: `${path} must be at most ${fieldDef.max}` });\n }\n }\n\n // Custom validator\n if (fieldDef.validate) {\n const isValid = await fieldDef.validate.validator(value);\n if (!isValid) {\n errors.push({ path, message: fieldDef.validate.message || `${path} failed validation` });\n }\n }\n\n return errors;\n }\n\n private _validateType(value: unknown, type: SchemaType): boolean {\n switch (type) {\n case 'String':\n return typeof value === 'string';\n case 'Number':\n return typeof value === 'number' && !isNaN(value);\n case 'Boolean':\n return typeof value === 'boolean';\n case 'Date':\n return value instanceof Date || (typeof value === 'string' && !isNaN(Date.parse(value)));\n case 'ObjectId':\n return typeof value === 'string' && /^[0-9a-fA-F]{24}$/.test(value);\n case 'Array':\n return Array.isArray(value);\n case 'Object':\n case 'Mixed':\n return typeof value === 'object' && value !== null;\n case 'Buffer':\n return Buffer.isBuffer(value);\n default:\n return true;\n }\n }\n\n // Apply transformations (lowercase, uppercase, trim)\n transformValue(path: string, value: unknown): unknown {\n const fieldDef = this._paths.get(path);\n if (!fieldDef || typeof value !== 'string') return value;\n\n let transformed = value;\n if (fieldDef.lowercase) transformed = transformed.toLowerCase();\n if (fieldDef.uppercase) transformed = transformed.toUpperCase();\n if (fieldDef.trim) transformed = transformed.trim();\n \n return transformed;\n }\n\n // Get default value for a field\n getDefault(path: string): unknown {\n const fieldDef = this._paths.get(path);\n if (!fieldDef || fieldDef.default === undefined) return undefined;\n \n return typeof fieldDef.default === 'function' ? fieldDef.default() : fieldDef.default;\n }\n}\n\n// Virtual builder helper\nclass VirtualBuilder {\n private schema: Schema;\n private name: string;\n\n constructor(schema: Schema, name: string) {\n this.schema = schema;\n this.name = name;\n }\n\n get(fn: () => unknown): this {\n const virtuals = this.schema.getVirtuals();\n const existing = virtuals.get(this.name) || {};\n virtuals.set(this.name, { ...existing, get: fn });\n return this;\n }\n\n set(fn: (value: unknown) => void): this {\n const virtuals = this.schema.getVirtuals();\n const existing = virtuals.get(this.name) || {};\n virtuals.set(this.name, { ...existing, set: fn });\n return this;\n }\n}\n\n// Export Schema class\nexport { Schema as default };\n\n","// Harbor Database Connection - Mongoose-compatible connection management\nimport { EventEmitter } from 'events';\nimport type { ConnectionOptions, ConnectionState } from './types';\nimport { t } from '../i18n';\n\ntype EventCallback = (...args: unknown[]) => void;\n\nclass HarborConnection extends EventEmitter {\n private _state: ConnectionState = {\n connected: false,\n readyState: 0,\n };\n private _options: ConnectionOptions = {};\n private _connectionUri: string = '';\n private _mongoClient: unknown = null;\n private _db: unknown = null;\n private _models: Map<string, unknown> = new Map();\n\n get readyState(): number {\n return this._state.readyState;\n }\n\n get host(): string | undefined {\n return this._state.host;\n }\n\n get port(): number | undefined {\n return this._state.port;\n }\n\n get name(): string | undefined {\n return this._state.name;\n }\n\n get db(): unknown {\n return this._db;\n }\n\n get client(): unknown {\n return this._mongoClient;\n }\n\n get models(): Map<string, unknown> {\n return this._models;\n }\n\n get uri(): string {\n return this._connectionUri;\n }\n\n async connect(uri: string, options?: ConnectionOptions): Promise<this> {\n if (this._state.readyState === 1) {\n console.warn('[Harbor] Already connected to MongoDB');\n return this;\n }\n\n this._connectionUri = uri;\n this._options = {\n maxPoolSize: 10,\n minPoolSize: 1,\n serverSelectionTimeoutMS: 30000,\n socketTimeoutMS: 45000,\n retryWrites: true,\n w: 'majority',\n ...options,\n };\n\n this._state.readyState = 2; // connecting\n this.emit('connecting');\n\n try {\n // Dynamic import of mongodb driver\n const { MongoClient } = await import('mongodb');\n \n this._mongoClient = new MongoClient(uri, this._options as any);\n await (this._mongoClient as any).connect();\n \n // Parse URI to get database name\n const urlObj = new URL(uri);\n const dbName = urlObj.pathname.slice(1) || 'test';\n \n this._db = (this._mongoClient as any).db(dbName);\n \n this._state = {\n connected: true,\n readyState: 1,\n host: urlObj.hostname,\n port: parseInt(urlObj.port) || 27017,\n name: dbName,\n };\n\n this.emit('connected');\n this.emit('open');\n \n console.log(`[Harbor] ${t('database.connected', { uri: `${urlObj.hostname}:${urlObj.port}/${dbName}` })}`);\n \n return this;\n } catch (error) {\n this._state.readyState = 0;\n this.emit('error', error);\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this._state.readyState === 0) {\n console.warn('[Harbor] Already disconnected from MongoDB');\n return;\n }\n\n this._state.readyState = 3; // disconnecting\n this.emit('disconnecting');\n\n try {\n if (this._mongoClient) {\n await (this._mongoClient as any).close();\n }\n \n this._state = {\n connected: false,\n readyState: 0,\n };\n \n this._mongoClient = null;\n this._db = null;\n \n this.emit('disconnected');\n this.emit('close');\n \n console.log(`[Harbor] ${t('database.disconnected')}`);\n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n return this.disconnect();\n }\n\n async ping(): Promise<boolean> {\n if (!this._db) {\n return false;\n }\n \n try {\n await (this._db as any).command({ ping: 1 });\n return true;\n } catch {\n return false;\n }\n }\n\n collection(name: string): unknown {\n if (!this._db) {\n throw new Error('[Harbor] Not connected to database');\n }\n return (this._db as any).collection(name);\n }\n\n async createCollection(name: string, options?: Record<string, unknown>): Promise<unknown> {\n if (!this._db) {\n throw new Error('[Harbor] Not connected to database');\n }\n return (this._db as any).createCollection(name, options);\n }\n\n async dropCollection(name: string): Promise<boolean> {\n if (!this._db) {\n throw new Error('[Harbor] Not connected to database');\n }\n return (this._db as any).dropCollection(name);\n }\n\n async listCollections(): Promise<string[]> {\n if (!this._db) {\n throw new Error('[Harbor] Not connected to database');\n }\n const collections = await (this._db as any).listCollections().toArray();\n return collections.map((c: { name: string }) => c.name);\n }\n\n async dropDatabase(): Promise<boolean> {\n if (!this._db) {\n throw new Error('[Harbor] Not connected to database');\n }\n return (this._db as any).dropDatabase();\n }\n\n // Transaction support\n async startSession(): Promise<unknown> {\n if (!this._mongoClient) {\n throw new Error('[Harbor] Not connected to database');\n }\n return (this._mongoClient as any).startSession();\n }\n\n async withTransaction<T>(\n fn: (session: unknown) => Promise<T>,\n options?: Record<string, unknown>\n ): Promise<T> {\n const session = await this.startSession();\n try {\n let result: T;\n await (session as any).withTransaction(async () => {\n result = await fn(session);\n }, options);\n return result!;\n } finally {\n await (session as any).endSession();\n }\n }\n\n // Event handlers with proper typing\n on(event: 'connected' | 'disconnected' | 'error' | 'connecting' | 'disconnecting' | 'open' | 'close', listener: EventCallback): this {\n return super.on(event, listener);\n }\n\n once(event: 'connected' | 'disconnected' | 'error' | 'connecting' | 'disconnecting' | 'open' | 'close', listener: EventCallback): this {\n return super.once(event, listener);\n }\n}\n\n// Singleton connection instance\nexport const connection = new HarborConnection();\n\n// Connect function\nexport async function connect(uri: string, options?: ConnectionOptions): Promise<HarborConnection> {\n return connection.connect(uri, options);\n}\n\n// Disconnect function\nexport async function disconnect(): Promise<void> {\n return connection.disconnect();\n}\n\n// Export types\nexport { HarborConnection };\nexport type { ConnectionOptions, ConnectionState };\n\n","// Harbor Model - Mongoose-compatible model and query builder\nimport { Schema } from './schema';\nimport { connection } from './connection';\nimport type {\n QueryOptions,\n UpdateResult,\n DeleteResult,\n IndexDefinition,\n IndexOptions,\n AggregateOptions,\n PopulateOptions,\n BulkWriteOperation,\n BulkWriteResult,\n} from './types';\nimport { ObjectId } from 'mongodb';\n\n// Query builder class\nexport class Query<T> implements PromiseLike<T> {\n private _model: Model<any>;\n private _operation: 'find' | 'findOne' | 'findOneAndUpdate' | 'findOneAndDelete';\n private _filter: Record<string, unknown> = {};\n private _projection: Record<string, 0 | 1> | null = null;\n private _options: QueryOptions = {};\n private _update: Record<string, unknown> | null = null;\n private _currentPath: string | null = null;\n\n constructor(\n model: Model<any>,\n operation: 'find' | 'findOne' | 'findOneAndUpdate' | 'findOneAndDelete',\n filter?: Record<string, unknown>,\n update?: Record<string, unknown>\n ) {\n this._model = model;\n this._operation = operation;\n this._filter = filter || {};\n this._update = update || null;\n }\n\n select(fields: string | Record<string, 0 | 1>): Query<T> {\n if (typeof fields === 'string') {\n this._projection = {};\n for (const field of fields.split(' ')) {\n if (field.startsWith('-')) {\n (this._projection as any)[field.slice(1)] = 0;\n } else if (field) {\n (this._projection as any)[field] = 1;\n }\n }\n } else {\n this._projection = fields;\n }\n return this;\n }\n\n sort(fields: string | Record<string, 1 | -1>): Query<T> {\n if (typeof fields === 'string') {\n const sortObj: Record<string, 1 | -1> = {};\n for (const field of fields.split(' ')) {\n if (field.startsWith('-')) {\n sortObj[field.slice(1)] = -1;\n } else if (field) {\n sortObj[field] = 1;\n }\n }\n this._options.sort = sortObj;\n } else {\n this._options.sort = fields;\n }\n return this;\n }\n\n limit(n: number): Query<T> {\n this._options.limit = n;\n return this;\n }\n\n skip(n: number): Query<T> {\n this._options.skip = n;\n return this;\n }\n\n lean(): Query<T> {\n this._options.lean = true;\n return this;\n }\n\n populate(path: string | PopulateOptions | PopulateOptions[]): Query<T> {\n this._options.populate = path;\n return this;\n }\n\n where(path: string, value?: unknown): Query<T> {\n this._currentPath = path;\n if (value !== undefined) {\n this._filter[path] = value;\n }\n return this;\n }\n\n equals(value: unknown): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = value;\n }\n return this;\n }\n\n gt(value: unknown): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { ...this._filter[this._currentPath] as object, $gt: value };\n }\n return this;\n }\n\n gte(value: unknown): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { ...this._filter[this._currentPath] as object, $gte: value };\n }\n return this;\n }\n\n lt(value: unknown): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { ...this._filter[this._currentPath] as object, $lt: value };\n }\n return this;\n }\n\n lte(value: unknown): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { ...this._filter[this._currentPath] as object, $lte: value };\n }\n return this;\n }\n\n in(values: unknown[]): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { $in: values };\n }\n return this;\n }\n\n nin(values: unknown[]): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { $nin: values };\n }\n return this;\n }\n\n ne(value: unknown): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { $ne: value };\n }\n return this;\n }\n\n regex(pattern: RegExp | string): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { $regex: pattern };\n }\n return this;\n }\n\n exists(value: boolean = true): Query<T> {\n if (this._currentPath) {\n this._filter[this._currentPath] = { $exists: value };\n }\n return this;\n }\n\n or(conditions: Record<string, unknown>[]): Query<T> {\n this._filter.$or = conditions;\n return this;\n }\n\n and(conditions: Record<string, unknown>[]): Query<T> {\n this._filter.$and = conditions;\n return this;\n }\n\n nor(conditions: Record<string, unknown>[]): Query<T> {\n this._filter.$nor = conditions;\n return this;\n }\n\n async exec(): Promise<T> {\n const collection = this._model.getCollection();\n \n switch (this._operation) {\n case 'find': {\n let cursor = collection.find(this._filter, { projection: this._projection });\n if (this._options.sort) cursor = cursor.sort(this._options.sort as any);\n if (this._options.skip) cursor = cursor.skip(this._options.skip);\n if (this._options.limit) cursor = cursor.limit(this._options.limit);\n const docs = await cursor.toArray();\n \n if (this._options.lean) {\n return docs as T;\n }\n return docs.map((doc: any) => this._model.hydrate(doc)) as T;\n }\n \n case 'findOne': {\n const doc = await collection.findOne(this._filter, { projection: this._projection });\n if (!doc) return null as T;\n \n if (this._options.lean) {\n return doc as T;\n }\n return this._model.hydrate(doc) as T;\n }\n \n case 'findOneAndUpdate': {\n const result = await collection.findOneAndUpdate(\n this._filter,\n this._update,\n { \n returnDocument: this._options.new ? 'after' : 'before',\n upsert: this._options.upsert,\n projection: this._projection,\n }\n );\n if (!result) return null as T;\n \n if (this._options.lean) {\n return result as T;\n }\n return this._model.hydrate(result) as T;\n }\n \n case 'findOneAndDelete': {\n const result = await collection.findOneAndDelete(this._filter, {\n projection: this._projection,\n });\n if (!result) return null as T;\n \n if (this._options.lean) {\n return result as T;\n }\n return this._model.hydrate(result) as T;\n }\n \n default:\n throw new Error(`Unknown operation: ${this._operation}`);\n }\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.exec().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.exec().finally(onfinally);\n }\n\n [Symbol.toStringTag] = 'Query';\n}\n\n// Document class\nexport class HarborDocument {\n [key: string]: unknown;\n \n _id: string;\n __v?: number;\n isNew: boolean = true;\n\n private _model: Model<any>;\n private _modified: Set<string> = new Set();\n /** Snapshot of document at load time for change tracking */\n private _original: Record<string, unknown> = {};\n\n constructor(model: Model<any>, doc?: Record<string, unknown>) {\n this._model = model;\n this._id = doc?._id?.toString() || new ObjectId().toString();\n \n if (doc) {\n for (const [key, value] of Object.entries(doc)) {\n if (key === '_id') {\n this._id = value?.toString() || this._id;\n } else {\n (this as any)[key] = value;\n }\n }\n this._original = { ...doc };\n this.isNew = false;\n }\n\n // Apply defaults\n const schema = model.schema;\n for (const [path] of schema.paths()) {\n if ((this as any)[path] === undefined) {\n const defaultValue = schema.getDefault(path);\n if (defaultValue !== undefined) {\n (this as any)[path] = defaultValue;\n }\n }\n }\n\n // Apply virtuals\n for (const [name, virtual] of schema.getVirtuals()) {\n Object.defineProperty(this, name, {\n get: virtual.get,\n set: virtual.set,\n enumerable: true,\n });\n }\n\n // Apply instance methods\n for (const [name, method] of schema.getMethods()) {\n (this as any)[name] = method.bind(this);\n }\n }\n\n /** Snapshot of document at load for change tracking */\n get original(): Record<string, unknown> {\n return this._original;\n }\n\n get id(): string {\n return this._id;\n }\n\n isModified(path?: string): boolean {\n if (!path) return this._modified.size > 0;\n return this._modified.has(path);\n }\n\n markModified(path: string): void {\n this._modified.add(path);\n }\n\n async save(): Promise<this> {\n const schema = this._model.schema;\n \n // Run pre save hooks\n await this._model.runPreHooks('save', this);\n\n // Validate\n const validation = await schema.validate(this.toObject());\n if (!validation.valid) {\n const error = new Error(`Validation failed: ${validation.errors?.map(e => e.message).join(', ')}`);\n (error as any).errors = validation.errors;\n throw error;\n }\n\n // Handle timestamps\n const now = new Date();\n if (schema.options.timestamps) {\n const createdAtField = typeof schema.options.timestamps === 'object' \n ? (schema.options.timestamps.createdAt || 'createdAt') \n : 'createdAt';\n const updatedAtField = typeof schema.options.timestamps === 'object'\n ? (schema.options.timestamps.updatedAt || 'updatedAt')\n : 'updatedAt';\n\n if (this.isNew && createdAtField) {\n (this as any)[createdAtField as string] = now;\n }\n if (updatedAtField) {\n (this as any)[updatedAtField as string] = now;\n }\n }\n\n const collection = this._model.getCollection();\n const docData = this.toObject();\n\n if (this.isNew) {\n await collection.insertOne({ _id: new ObjectId(this._id), ...docData });\n this.isNew = false;\n } else {\n // Increment version\n if (schema.options.versionKey) {\n const versionField = typeof schema.options.versionKey === 'string' ? schema.options.versionKey : '__v';\n (this as any)[versionField] = ((this as any)[versionField] || 0) + 1;\n }\n \n await collection.replaceOne({ _id: new ObjectId(this._id) }, docData);\n }\n\n this._original = { ...docData };\n this._modified.clear();\n\n // Run post save hooks\n await this._model.runPostHooks('save', this);\n\n return this;\n }\n\n async remove(): Promise<this> {\n await this._model.runPreHooks('remove', this);\n \n const collection = this._model.getCollection();\n await collection.deleteOne({ _id: new ObjectId(this._id) });\n \n await this._model.runPostHooks('remove', this);\n \n return this;\n }\n\n async deleteOne(): Promise<DeleteResult> {\n await this._model.runPreHooks('deleteOne', this);\n \n const collection = this._model.getCollection();\n const result = await collection.deleteOne({ _id: new ObjectId(this._id) });\n \n await this._model.runPostHooks('deleteOne', this);\n \n return {\n acknowledged: result.acknowledged,\n deletedCount: result.deletedCount,\n };\n }\n\n async updateOne(update: Record<string, unknown>): Promise<UpdateResult> {\n await this._model.runPreHooks('updateOne', this);\n \n const collection = this._model.getCollection();\n const result = await collection.updateOne({ _id: new ObjectId(this._id) }, update);\n \n await this._model.runPostHooks('updateOne', this);\n \n return {\n acknowledged: result.acknowledged,\n modifiedCount: result.modifiedCount,\n matchedCount: result.matchedCount,\n };\n }\n\n async populate(_path: string | PopulateOptions): Promise<this> {\n // Population logic would go here\n // For now, return self\n return this;\n }\n\n toObject(): Record<string, unknown> {\n const obj: Record<string, unknown> = { _id: this._id };\n const schema = this._model.schema;\n\n for (const [path] of schema.paths()) {\n if (path !== '_id' && (this as any)[path] !== undefined) {\n obj[path] = (this as any)[path];\n }\n }\n\n return obj;\n }\n\n toJSON(): Record<string, unknown> {\n return this.toObject();\n }\n}\n\n// Model class\nexport class Model<T extends HarborDocument = HarborDocument> {\n private _name: string;\n private _schema: Schema;\n private _collectionName: string;\n\n static models: Map<string, Model<any>> = new Map();\n\n constructor(name: string, schema: Schema, collectionName?: string) {\n this._name = name;\n this._schema = schema;\n this._collectionName = collectionName || name.toLowerCase() + 's';\n\n // Apply static methods\n for (const [methodName, method] of schema.getStatics()) {\n (this as any)[methodName] = method.bind(this);\n }\n\n Model.models.set(name, this);\n }\n\n get modelName(): string {\n return this._name;\n }\n\n get schema(): Schema {\n return this._schema;\n }\n\n get collection(): { name: string } {\n return { name: this._collectionName };\n }\n\n getCollection(): any {\n if (!connection.db) {\n throw new Error('[Harbor] Not connected to database. Call harbor.connect() first.');\n }\n return (connection.db as any).collection(this._collectionName);\n }\n\n // Create a new document instance\n new(doc?: Partial<T>): T {\n return new HarborDocument(this, doc as Record<string, unknown>) as T;\n }\n\n // Hydrate a plain object into a document\n hydrate(doc: Record<string, unknown>): T {\n const document = new HarborDocument(this, doc);\n document.isNew = false;\n return document as T;\n }\n\n // Query methods\n find(filter?: Record<string, unknown>, projection?: Record<string, 0 | 1>, options?: QueryOptions): Query<T[]> {\n const query = new Query<T[]>(this, 'find', filter);\n if (projection) query.select(projection);\n if (options?.sort) query.sort(options.sort as any);\n if (options?.limit) query.limit(options.limit);\n if (options?.skip) query.skip(options.skip);\n if (options?.lean) query.lean();\n return query;\n }\n\n findOne(filter?: Record<string, unknown>, projection?: Record<string, 0 | 1>, options?: QueryOptions): Query<T | null> {\n const query = new Query<T | null>(this, 'findOne', filter);\n if (projection) query.select(projection);\n if (options?.lean) query.lean();\n return query;\n }\n\n findById(id: string, projection?: Record<string, 0 | 1>, options?: QueryOptions): Query<T | null> {\n return this.findOne({ _id: new ObjectId(id) }, projection, options);\n }\n\n // Create methods\n async create(doc: Partial<T> | Partial<T>[]): Promise<T | T[]> {\n if (Array.isArray(doc)) {\n const results: T[] = [];\n for (const d of doc) {\n const document = this.new(d);\n await document.save();\n results.push(document as T);\n }\n return results;\n }\n\n const document = this.new(doc);\n await document.save();\n return document as T;\n }\n\n async insertMany(docs: Partial<T>[], options?: { ordered?: boolean }): Promise<{ insertedCount: number; insertedIds: string[] }> {\n const collection = this.getCollection();\n const documentsToInsert = docs.map(doc => {\n const id = new ObjectId();\n return { _id: id, ...doc };\n });\n\n const result = await collection.insertMany(documentsToInsert, { ordered: options?.ordered ?? true });\n \n return {\n insertedCount: result.insertedCount,\n insertedIds: Object.values(result.insertedIds).map((id: any) => id.toString()),\n };\n }\n\n // Update methods\n async updateOne(filter: Record<string, unknown>, update: Record<string, unknown>, options?: QueryOptions): Promise<UpdateResult> {\n await this.runPreHooks('updateOne', null);\n \n const collection = this.getCollection();\n const updateDoc = update.$set || update.$unset || update.$inc ? update : { $set: update };\n \n const result = await collection.updateOne(filter, updateDoc, { upsert: options?.upsert });\n \n await this.runPostHooks('updateOne', null);\n \n return {\n acknowledged: result.acknowledged,\n modifiedCount: result.modifiedCount,\n matchedCount: result.matchedCount,\n upsertedCount: result.upsertedCount,\n upsertedId: result.upsertedId?.toString(),\n };\n }\n\n async updateMany(filter: Record<string, unknown>, update: Record<string, unknown>, options?: QueryOptions): Promise<UpdateResult> {\n await this.runPreHooks('updateMany', null);\n \n const collection = this.getCollection();\n const updateDoc = update.$set || update.$unset || update.$inc ? update : { $set: update };\n \n const result = await collection.updateMany(filter, updateDoc, { upsert: options?.upsert });\n \n await this.runPostHooks('updateMany', null);\n \n return {\n acknowledged: result.acknowledged,\n modifiedCount: result.modifiedCount,\n matchedCount: result.matchedCount,\n };\n }\n\n findOneAndUpdate(filter: Record<string, unknown>, update: Record<string, unknown>, options?: QueryOptions): Query<T | null> {\n const query = new Query<T | null>(this, 'findOneAndUpdate', filter, update);\n if (options?.new) (query as any)._options.new = true;\n if (options?.upsert) (query as any)._options.upsert = true;\n if (options?.lean) query.lean();\n return query;\n }\n\n findByIdAndUpdate(id: string, update: Record<string, unknown>, options?: QueryOptions): Query<T | null> {\n return this.findOneAndUpdate({ _id: new ObjectId(id) }, update, options);\n }\n\n async replaceOne(filter: Record<string, unknown>, replacement: Partial<T>, options?: QueryOptions): Promise<UpdateResult> {\n const collection = this.getCollection();\n const result = await collection.replaceOne(filter, replacement, { upsert: options?.upsert });\n \n return {\n acknowledged: result.acknowledged,\n modifiedCount: result.modifiedCount,\n matchedCount: result.matchedCount,\n };\n }\n\n // Delete methods\n async deleteOne(filter: Record<string, unknown>): Promise<DeleteResult> {\n await this.runPreHooks('deleteOne', null);\n \n const collection = this.getCollection();\n const result = await collection.deleteOne(filter);\n \n await this.runPostHooks('deleteOne', null);\n \n return {\n acknowledged: result.acknowledged,\n deletedCount: result.deletedCount,\n };\n }\n\n async deleteMany(filter: Record<string, unknown>): Promise<DeleteResult> {\n await this.runPreHooks('deleteMany', null);\n \n const collection = this.getCollection();\n const result = await collection.deleteMany(filter);\n \n await this.runPostHooks('deleteMany', null);\n \n return {\n acknowledged: result.acknowledged,\n deletedCount: result.deletedCount,\n };\n }\n\n findOneAndDelete(filter: Record<string, unknown>, options?: QueryOptions): Query<T | null> {\n const query = new Query<T | null>(this, 'findOneAndDelete', filter);\n if (options?.lean) query.lean();\n return query;\n }\n\n findByIdAndDelete(id: string, options?: QueryOptions): Query<T | null> {\n return this.findOneAndDelete({ _id: new ObjectId(id) }, options);\n }\n\n // Count methods\n async countDocuments(filter?: Record<string, unknown>): Promise<number> {\n const collection = this.getCollection();\n return collection.countDocuments(filter || {});\n }\n\n async estimatedDocumentCount(): Promise<number> {\n const collection = this.getCollection();\n return collection.estimatedDocumentCount();\n }\n\n // Aggregate\n async aggregate<R = unknown>(pipeline: Record<string, unknown>[], options?: AggregateOptions): Promise<R[]> {\n const collection = this.getCollection();\n return collection.aggregate(pipeline, options).toArray();\n }\n\n // Distinct\n async distinct(field: string, filter?: Record<string, unknown>): Promise<unknown[]> {\n const collection = this.getCollection();\n return collection.distinct(field, filter || {});\n }\n\n // Exists\n async exists(filter: Record<string, unknown>): Promise<{ _id: string } | null> {\n const doc = await this.findOne(filter).select({ _id: 1 }).lean();\n return doc ? { _id: (doc as any)._id.toString() } : null;\n }\n\n // Bulk operations\n async bulkWrite(operations: BulkWriteOperation<T>[]): Promise<BulkWriteResult> {\n const collection = this.getCollection();\n const result = await collection.bulkWrite(operations as any);\n \n return {\n ok: result.ok,\n insertedCount: result.insertedCount,\n matchedCount: result.matchedCount,\n modifiedCount: result.modifiedCount,\n deletedCount: result.deletedCount,\n upsertedCount: result.upsertedCount,\n insertedIds: result.insertedIds || {},\n upsertedIds: result.upsertedIds || {},\n };\n }\n\n // Index methods\n async createIndex(fields: IndexDefinition, options?: IndexOptions): Promise<string> {\n const collection = this.getCollection();\n return collection.createIndex(fields, options);\n }\n\n async createIndexes(indexes: Array<{ fields: IndexDefinition; options?: IndexOptions }>): Promise<string[]> {\n const collection = this.getCollection();\n const indexSpecs = indexes.map(idx => ({ key: idx.fields, ...idx.options }));\n return collection.createIndexes(indexSpecs);\n }\n\n async listIndexes(): Promise<unknown[]> {\n const collection = this.getCollection();\n return collection.listIndexes().toArray();\n }\n\n async dropIndex(indexName: string): Promise<void> {\n const collection = this.getCollection();\n await collection.dropIndex(indexName);\n }\n\n // Populate\n async populate<P extends T>(docs: P | P[], _options: PopulateOptions | PopulateOptions[]): Promise<P | P[]> {\n // Population logic would go here\n return docs;\n }\n\n // Watch (change streams)\n watch(pipeline?: Record<string, unknown>[], options?: { fullDocument?: 'default' | 'updateLookup' }): unknown {\n const collection = this.getCollection();\n return collection.watch(pipeline, options);\n }\n\n // Hook execution\n async runPreHooks(hookName: string, context: unknown): Promise<void> {\n const hooks = this._schema.getPreHooks().get(hookName) || [];\n for (const hook of hooks) {\n await new Promise<void>((resolve, reject) => {\n try {\n const result = hook.call(context, resolve);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n }\n\n async runPostHooks(hookName: string, context: unknown): Promise<void> {\n const hooks = this._schema.getPostHooks().get(hookName) || [];\n for (const hook of hooks) {\n await new Promise<void>((resolve, reject) => {\n try {\n const result = hook.call(context, resolve);\n if (result instanceof Promise) {\n result.then(resolve).catch(reject);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n }\n}\n\n// Model factory function\nexport function model<T extends HarborDocument = HarborDocument>(\n name: string,\n schema: Schema,\n collectionName?: string\n): Model<T> {\n // Check if model already exists\n const existing = Model.models.get(name);\n if (existing) {\n return existing as Model<T>;\n }\n\n return new Model<T>(name, schema, collectionName);\n}\n\n","// Harbor Database - Mongoose-compatible MongoDB ODM\n// Replaces Mongoose with a lightweight, type-safe alternative\n\nexport { Schema } from './schema';\nexport { Model, model, Query, HarborDocument } from './model';\nexport { \n connection, \n connect, \n disconnect, \n HarborConnection,\n} from './connection';\n\n// Re-export types\nexport type {\n SchemaType,\n SchemaFieldDefinition,\n SchemaDefinition,\n SchemaOptions,\n QueryOptions,\n PopulateOptions,\n UpdateResult,\n DeleteResult,\n IndexDefinition,\n IndexOptions,\n AggregateOptions,\n ConnectionOptions,\n ConnectionState,\n Document,\n BulkWriteOperation,\n BulkWriteResult,\n HookType,\n QueryHookType,\n} from './types';\n\n// Import for Types helper (like mongoose.Types.ObjectId)\nimport { ObjectId } from 'mongodb';\n\nexport const Types = {\n ObjectId,\n};\n\n// Default export mimics Mongoose's API\nimport { connection, connect, disconnect } from './connection';\nimport { Schema } from './schema';\nimport { Model, model } from './model';\n\nconst harbor = {\n // Connection\n connection,\n connect,\n disconnect,\n \n // Schema & Model\n Schema,\n Model,\n model,\n \n // Types\n Types,\n \n // Convenience methods\n get models() {\n return Object.fromEntries(Model.models);\n },\n \n // Version\n version: '1.0.0',\n};\n\nexport default harbor;\n\n","import { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type { ChangelogEntry, ChangelogConfig, ChangeItem, ChangeType, ReleaseNotes } from './types';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('changelog');\n\nconst DEFAULT_CONFIG: ChangelogConfig = {\n filePath: './CHANGELOG.md',\n format: 'markdown',\n includeUnreleased: true,\n};\n\nexport function createChangelogManager(config: Partial<ChangelogConfig> = {}) {\n const cfg: ChangelogConfig = { ...DEFAULT_CONFIG, ...config };\n const entries: ChangelogEntry[] = [];\n let unreleasedChanges: ChangeItem[] = [];\n\n function load(): void {\n const filePath = resolve(process.cwd(), cfg.filePath);\n \n if (!existsSync(filePath)) {\n logger.info('No changelog file found, starting fresh');\n return;\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n parseMarkdown(content);\n logger.info('Changelog loaded', { entries: entries.length });\n } catch (error) {\n logger.error('Failed to load changelog', error as Error);\n }\n }\n\n function parseMarkdown(content: string): void {\n const versionRegex = /## \\[(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)\\](?: - (\\d{4}-\\d{2}-\\d{2}))?/g;\n const sections = content.split(versionRegex);\n\n for (let i = 1; i < sections.length; i += 3) {\n const version = sections[i];\n const dateStr = sections[i + 1];\n const changesSection = sections[i + 2];\n\n if (version && changesSection) {\n const entry: ChangelogEntry = {\n version,\n date: dateStr ? new Date(dateStr) : new Date(),\n changes: parseChangesSection(changesSection),\n };\n entries.push(entry);\n }\n }\n }\n\n function parseChangesSection(section: string): ChangeItem[] {\n const items: ChangeItem[] = [];\n const lines = section.split('\\n');\n let currentType: ChangeType | null = null;\n\n for (const line of lines) {\n const typeMatch = line.match(/^### (Added|Changed|Deprecated|Removed|Fixed|Security)/i);\n if (typeMatch) {\n currentType = typeMatch[1].toLowerCase() as ChangeType;\n continue;\n }\n\n const itemMatch = line.match(/^- (.+)/);\n if (itemMatch && currentType) {\n items.push({\n type: currentType,\n description: itemMatch[1].trim(),\n });\n }\n }\n\n return items;\n }\n\n function save(): void {\n const filePath = resolve(process.cwd(), cfg.filePath);\n const content = generateMarkdown();\n \n writeFileSync(filePath, content, 'utf-8');\n logger.info('Changelog saved', { path: filePath });\n }\n\n function generateMarkdown(): string {\n let content = '# Changelog\\n\\n';\n content += 'All notable changes to this project will be documented in this file.\\n\\n';\n content += 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\\n';\n content += 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\\n\\n';\n\n if (cfg.includeUnreleased && unreleasedChanges.length > 0) {\n content += '## [Unreleased]\\n\\n';\n content += formatChanges(unreleasedChanges);\n content += '\\n';\n }\n\n for (const entry of entries) {\n const dateStr = entry.date.toISOString().split('T')[0];\n content += `## [${entry.version}] - ${dateStr}\\n\\n`;\n content += formatChanges(entry.changes);\n \n if (entry.breaking && entry.breaking.length > 0) {\n content += '### BREAKING CHANGES\\n\\n';\n for (const item of entry.breaking) {\n content += `- ${item.description}\\n`;\n }\n content += '\\n';\n }\n \n content += '\\n';\n }\n\n return content;\n }\n\n function formatChanges(changes: ChangeItem[]): string {\n const grouped = groupByType(changes);\n let content = '';\n\n const typeOrder: ChangeType[] = ['added', 'changed', 'deprecated', 'removed', 'fixed', 'security'];\n\n for (const type of typeOrder) {\n const items = grouped[type];\n if (items && items.length > 0) {\n content += `### ${capitalize(type)}\\n\\n`;\n for (const item of items) {\n let line = `- ${item.description}`;\n if (item.scope) line = `- **${item.scope}:** ${item.description}`;\n if (item.issue) line += ` (#${item.issue})`;\n content += line + '\\n';\n }\n content += '\\n';\n }\n }\n\n return content;\n }\n\n function groupByType(changes: ChangeItem[]): Record<ChangeType, ChangeItem[]> {\n const grouped: Record<ChangeType, ChangeItem[]> = {\n added: [],\n changed: [],\n deprecated: [],\n removed: [],\n fixed: [],\n security: [],\n };\n\n for (const change of changes) {\n grouped[change.type].push(change);\n }\n\n return grouped;\n }\n\n function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n return {\n load,\n save,\n\n addChange(type: ChangeType, description: string, options?: { scope?: string; issue?: string }): void {\n unreleasedChanges.push({\n type,\n description,\n scope: options?.scope,\n issue: options?.issue,\n });\n },\n\n release(version: string): ChangelogEntry {\n const entry: ChangelogEntry = {\n version,\n date: new Date(),\n changes: [...unreleasedChanges],\n };\n\n entries.unshift(entry);\n unreleasedChanges = [];\n save();\n\n logger.info(`Released version ${version}`);\n return entry;\n },\n\n getEntries(): ChangelogEntry[] {\n return [...entries];\n },\n\n getUnreleased(): ChangeItem[] {\n return [...unreleasedChanges];\n },\n\n getLatestVersion(): string | null {\n return entries[0]?.version ?? null;\n },\n\n getReleaseNotes(version: string): ReleaseNotes | null {\n const entry = entries.find((e) => e.version === version);\n if (!entry) return null;\n\n const grouped = groupByType(entry.changes);\n\n return {\n version: entry.version,\n date: entry.date,\n added: grouped.added.map((i) => i.description),\n changed: grouped.changed.map((i) => i.description),\n deprecated: grouped.deprecated.map((i) => i.description),\n removed: grouped.removed.map((i) => i.description),\n fixed: grouped.fixed.map((i) => i.description),\n security: grouped.security.map((i) => i.description),\n breaking: entry.breaking?.map((i) => i.description) ?? [],\n };\n },\n };\n}\n\nexport function generateChangelog(entries: ChangelogEntry[], config?: Partial<ChangelogConfig>): string {\n const manager = createChangelogManager(config);\n \n for (const entry of entries.reverse()) {\n for (const change of entry.changes) {\n manager.addChange(change.type, change.description, {\n scope: change.scope,\n issue: change.issue,\n });\n }\n manager.release(entry.version);\n }\n\n return '';\n}\n\nexport class ChangelogManager {\n private manager: ReturnType<typeof createChangelogManager>;\n\n constructor(config?: Partial<ChangelogConfig>) {\n this.manager = createChangelogManager(config);\n }\n\n load = () => this.manager.load();\n save = () => this.manager.save();\n addChange = (...args: Parameters<typeof this.manager.addChange>) => this.manager.addChange(...args);\n release = (version: string) => this.manager.release(version);\n getEntries = () => this.manager.getEntries();\n getUnreleased = () => this.manager.getUnreleased();\n getLatestVersion = () => this.manager.getLatestVersion();\n getReleaseNotes = (version: string) => this.manager.getReleaseNotes(version);\n}\n\n","// Portal - API docs and portal generator (stub for future implementation)\n\nexport interface PortalGeneratorOptions {\n outDir?: string;\n title?: string;\n}\n\nexport class PortalGenerator {\n constructor(private options: PortalGeneratorOptions = {}) {}\n\n get config(): PortalGeneratorOptions {\n return this.options;\n }\n\n generate(): void {\n console.log('[Harbor] Portal generation is coming soon.');\n }\n}\n\nexport function createPortal(_options?: PortalGeneratorOptions): PortalGenerator {\n return new PortalGenerator(_options);\n}\n\nexport function generateDocs(): void {\n console.log('[Harbor] API documentation generation is coming soon.');\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n \n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n\n return result;\n}\n\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n \n for (const key of keys) {\n delete result[key];\n }\n\n return result as Omit<T, K>;\n}\n\nexport function flatten(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (isObject(value)) {\n Object.assign(result, flatten(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\n }\n\n return result;\n}\n\n","export function generateId(length = 16): string {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n \n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n \n return result;\n}\n\nexport function formatDate(date: Date, format = 'ISO'): string {\n if (format === 'ISO') {\n return date.toISOString();\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n switch (format) {\n case 'DATE':\n return `${year}-${month}-${day}`;\n case 'TIME':\n return `${hours}:${minutes}:${seconds}`;\n case 'DATETIME':\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n default:\n return date.toISOString();\n }\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout;\n \n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle = false;\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n fn(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n\nexport function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number,\n delay: number\n): Promise<T> {\n return new Promise((resolve, reject) => {\n let attempts = 0;\n\n const attempt = async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n attempts++;\n if (attempts >= maxRetries) {\n reject(error);\n } else {\n setTimeout(attempt, delay);\n }\n }\n };\n\n attempt();\n });\n}\n\n","import type { RequestHandler, Request, Response, NextFunction } from 'express';\nimport { createLogger } from './logger';\nimport { t } from '../i18n';\n\nconst logger = createLogger('http');\n\nexport type HttpLogFormat = 'tiny' | 'short' | 'dev' | 'combined' | 'common' | 'custom';\n\nexport interface HttpLoggerOptions {\n format?: HttpLogFormat;\n skip?: (req: Request, res: Response) => boolean;\n immediate?: boolean;\n customFormat?: (tokens: HttpLogTokens) => string;\n colorize?: boolean;\n}\n\nexport interface HttpLogTokens {\n method: string;\n url: string;\n status: number;\n statusColor: string;\n responseTime: number;\n contentLength: string;\n remoteAddr: string;\n date: string;\n httpVersion: string;\n userAgent: string;\n referrer: string;\n}\n\nconst STATUS_COLORS = {\n info: '\\x1b[36m', // Cyan for 1xx\n success: '\\x1b[32m', // Green for 2xx\n redirect: '\\x1b[36m',// Cyan for 3xx\n clientError: '\\x1b[33m', // Yellow for 4xx\n serverError: '\\x1b[31m', // Red for 5xx\n reset: '\\x1b[0m',\n};\n\nfunction getStatusColor(status: number): string {\n if (status >= 500) return STATUS_COLORS.serverError;\n if (status >= 400) return STATUS_COLORS.clientError;\n if (status >= 300) return STATUS_COLORS.redirect;\n if (status >= 200) return STATUS_COLORS.success;\n return STATUS_COLORS.info;\n}\n\nfunction getMethodColor(method: string): string {\n const colors: Record<string, string> = {\n GET: '\\x1b[32m', // Green\n POST: '\\x1b[34m', // Blue\n PUT: '\\x1b[33m', // Yellow\n PATCH: '\\x1b[35m', // Magenta\n DELETE: '\\x1b[31m', // Red\n OPTIONS: '\\x1b[36m',// Cyan\n HEAD: '\\x1b[36m', // Cyan\n };\n return colors[method] ?? '\\x1b[0m';\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '-';\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction getTokens(req: Request, res: Response, startTime: number): HttpLogTokens {\n const responseTime = Date.now() - startTime;\n const status = res.statusCode;\n const contentLength = res.get('content-length') ?? '0';\n\n return {\n method: req.method,\n url: req.originalUrl || req.url,\n status,\n statusColor: getStatusColor(status),\n responseTime,\n contentLength: formatBytes(parseInt(contentLength, 10) || 0),\n remoteAddr: req.ip || req.socket.remoteAddress || '-',\n date: new Date().toISOString(),\n httpVersion: `HTTP/${req.httpVersionMajor}.${req.httpVersionMinor}`,\n userAgent: req.get('user-agent') ?? '-',\n referrer: req.get('referrer') ?? '-',\n };\n}\n\n// Format presets (like Morgan)\nconst FORMATS: Record<HttpLogFormat, (tokens: HttpLogTokens, colorize: boolean) => string> = {\n tiny: (t, c) => {\n const method = c ? `${getMethodColor(t.method)}${t.method}${STATUS_COLORS.reset}` : t.method;\n const status = c ? `${t.statusColor}${t.status}${STATUS_COLORS.reset}` : String(t.status);\n return `${method} ${t.url} ${status} ${t.responseTime}ms`;\n },\n\n short: (t, c) => {\n const method = c ? `${getMethodColor(t.method)}${t.method}${STATUS_COLORS.reset}` : t.method;\n const status = c ? `${t.statusColor}${t.status}${STATUS_COLORS.reset}` : String(t.status);\n return `${t.remoteAddr} ${method} ${t.url} ${status} ${t.responseTime}ms - ${t.contentLength}`;\n },\n\n dev: (t, c) => {\n const method = c ? `${getMethodColor(t.method)}${t.method.padEnd(7)}${STATUS_COLORS.reset}` : t.method.padEnd(7);\n const status = c ? `${t.statusColor}${t.status}${STATUS_COLORS.reset}` : String(t.status);\n const time = t.responseTime < 100 \n ? `${t.responseTime}ms` \n : t.responseTime < 1000 \n ? `\\x1b[33m${t.responseTime}ms${STATUS_COLORS.reset}`\n : `\\x1b[31m${t.responseTime}ms${STATUS_COLORS.reset}`;\n return `${method} ${t.url} ${status} ${c ? time : `${t.responseTime}ms`} - ${t.contentLength}`;\n },\n\n combined: (t) => {\n return `${t.remoteAddr} - - [${t.date}] \"${t.method} ${t.url} ${t.httpVersion}\" ${t.status} ${t.contentLength} \"${t.referrer}\" \"${t.userAgent}\"`;\n },\n\n common: (t) => {\n return `${t.remoteAddr} - - [${t.date}] \"${t.method} ${t.url} ${t.httpVersion}\" ${t.status} ${t.contentLength}`;\n },\n\n custom: () => '', // Handled separately\n};\n\n/**\n * Create an HTTP request logger middleware (Morgan-like)\n */\nexport function httpLogger(options: HttpLoggerOptions = {}): RequestHandler {\n const {\n format = 'dev',\n skip,\n immediate = false,\n customFormat,\n colorize = true,\n } = options;\n\n return (req: Request, res: Response, next: NextFunction): void => {\n const startTime = Date.now();\n\n // Log immediately if configured\n if (immediate) {\n logger.info(t('http.requestStart', { method: req.method, url: req.url }));\n }\n\n // Store original end function\n const originalEnd = res.end;\n\n // Override end to log after response\n res.end = function(chunk?: any, encoding?: any, callback?: any): Response {\n res.end = originalEnd;\n const result = res.end(chunk, encoding, callback);\n\n // Skip logging if skip function returns true\n if (skip && skip(req, res)) {\n return result;\n }\n\n // Get tokens\n const tokens = getTokens(req, res, startTime);\n\n // Format log message\n let message: string;\n if (format === 'custom' && customFormat) {\n message = customFormat(tokens);\n } else {\n message = FORMATS[format](tokens, colorize);\n }\n\n // Log based on status code\n if (tokens.status >= 500) {\n logger.error(message);\n } else if (tokens.status >= 400) {\n logger.warn(message);\n } else {\n logger.info(message);\n }\n\n return result;\n };\n\n next();\n };\n}\n\n/**\n * Predefined skip functions\n */\nexport const skipFunctions = {\n /** Skip successful responses */\n successOnly: (_req: Request, res: Response): boolean => res.statusCode < 400,\n \n /** Skip health check endpoints */\n healthChecks: (req: Request): boolean => \n req.url === '/health' || req.url === '/healthz' || req.url === '/ready',\n \n /** Skip static files */\n staticFiles: (req: Request): boolean => \n /\\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$/i.test(req.url),\n \n /** Skip based on custom paths */\n paths: (paths: string[]) => (req: Request): boolean => \n paths.some(p => req.url.startsWith(p)),\n};\n\n/**\n * Create a custom format function\n */\nexport function createCustomFormat(\n formatFn: (tokens: HttpLogTokens) => string\n): (tokens: HttpLogTokens) => string {\n return formatFn;\n}\n\n// Export default formats for reference\nexport const formats = {\n tiny: ':method :url :status :response-time ms',\n short: ':remote-addr :method :url :status :response-time ms - :content-length',\n dev: ':method :url :status :response-time ms - :content-length',\n combined: ':remote-addr - :remote-user [:date] \":method :url HTTP/:http-version\" :status :content-length \":referrer\" \":user-agent\"',\n common: ':remote-addr - :remote-user [:date] \":method :url HTTP/:http-version\" :status :content-length',\n};\n\n"],"names":["CONFIG_SEARCH_PATHS","ENV_KEYS","HTTP_METHODS","HTTP_STATUS","HTTP_STATUS_MESSAGES","CONTENT_TYPES","HEADERS","DEFAULT_PORT","DEFAULT_HOST","DEFAULT_TIMEOUT","DEFAULT_BODY_LIMIT","DEFAULT_CONFIG","GRACEFUL_SHUTDOWN_TIMEOUT","logger","createLogger","loadConfig","configPath","path","findConfigPath","applyEnvOverrides","fileContent","readFileSync","userConfig","mergedConfig","deepMerge","error","defineConfig","config","customPath","resolved","resolve","existsSync","envPath","searchPath","envPort","envHost","envLogLevel","target","source","result","key","sourceValue","targetValue","en","he","locales","currentLocale","setLocale","locale","getLocale","getAvailableLocales","t","params","text","paramKey","value","addTranslations","translations","registerLocale","createRouter","options","router","Router","mw","route","registerRoute","method","handlers","buildHandlerChain","preFn","wrapPreFunction","validationMiddleware","timeoutMiddleware","wrapHandler","req","res","next","handler","postFn","validation","validated","validateRequest","timeout","_req","timer","GET","createRoute","POST","PUT","PATCH","DELETE","RouteBuilder","__publicField","fns","ms","HarborError","message","statusCode","details","createErrorHandler","errorsConfig","_next","errorConfig","getErrorConfig","response","buildErrorResponse","statusKey","createServer","app","express","server","status","startedAt","routes","applyMiddleware","harborServer","port","host","reject","createHttpServer","info","_a","setupGracefulShutdown","group","middleware","r","_b","_c","corsMiddleware","requestEnhancer","errorHandler","corsConfig","origin","requestOrigin","data","signal","Schema","definition","createdAtField","updatedAtField","versionField","_","prop","prefix","fieldDef","name","VirtualBuilder","fn","hookName","hooks","hook","existing","fields","cls","proto","descriptor","cloned","doc","errors","fieldErrors","obj","current","type","transformed","schema","virtuals","HarborConnection","EventEmitter","uri","MongoClient","urlObj","dbName","c","session","event","listener","connection","connect","disconnect","Query","model","operation","filter","update","field","sortObj","n","values","pattern","conditions","collection","cursor","docs","onfulfilled","onrejected","onfinally","HarborDocument","ObjectId","defaultValue","virtual","e","now","docData","_path","_Model","collectionName","methodName","document","projection","query","id","results","d","documentsToInsert","updateDoc","replacement","pipeline","operations","indexes","indexSpecs","idx","indexName","_options","context","Model","Types","createChangelogManager","cfg","entries","unreleasedChanges","load","filePath","content","parseMarkdown","versionRegex","sections","i","version","dateStr","changesSection","entry","parseChangesSection","section","items","lines","currentType","line","typeMatch","itemMatch","save","generateMarkdown","writeFileSync","formatChanges","item","changes","grouped","groupByType","typeOrder","capitalize","change","str","description","ChangelogManager","args","PortalGenerator","createPortal","generateDocs","isObject","pick","keys","omit","generateId","length","chars","formatDate","date","format","year","month","day","hours","minutes","seconds","sleep","STATUS_COLORS","getStatusColor","getMethodColor","formatBytes","bytes","getTokens","startTime","responseTime","contentLength","FORMATS","time","httpLogger","skip","immediate","customFormat","colorize","originalEnd","chunk","encoding","callback","tokens","skipFunctions","paths","p","createCustomFormat","formatFn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/constants/config.const.ts","../src/constants/defaults.const.ts","../src/core/config.ts","../src/core/router.ts","../src/core/errorHandler.ts","../src/core/server.ts","../src/changelog/manager.ts","../src/utils/object.ts","../src/utils/helpers.ts","../src/utils/httpLogger.ts"],"sourcesContent":["export const CONFIG_FILE_NAME = 'harbor.config.json';\n\nexport const CONFIG_SEARCH_PATHS = [\n './harbor.config.json',\n './config/harbor.config.json',\n './.harbor/config.json',\n] as const;\n\nexport const ENV_PREFIX = 'HARBOR_';\n\nexport const ENV_KEYS = {\n PORT: 'HARBOR_PORT',\n HOST: 'HARBOR_HOST',\n LOG_LEVEL: 'HARBOR_LOG_LEVEL',\n CONFIG_PATH: 'HARBOR_CONFIG_PATH',\n NODE_ENV: 'NODE_ENV',\n} as const;\n\n","import type { HarborConfig } from '../types';\n\nexport const DEFAULT_PORT = 3000;\nexport const DEFAULT_HOST = 'localhost';\nexport const DEFAULT_TIMEOUT = 30000;\nexport const DEFAULT_BODY_LIMIT = '10mb';\n\nexport const DEFAULT_CONFIG: HarborConfig = {\n server: {\n port: DEFAULT_PORT,\n host: DEFAULT_HOST,\n cors: {\n enabled: true,\n origin: '*',\n methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\n credentials: false,\n },\n bodyParser: {\n json: true,\n urlencoded: true,\n limit: DEFAULT_BODY_LIMIT,\n },\n trustProxy: false,\n },\n routes: {\n prefix: '',\n timeout: DEFAULT_TIMEOUT,\n defaultMiddleware: [],\n },\n validation: {\n adapter: 'mongoose',\n strictMode: true,\n sanitize: true,\n },\n errors: {\n 400: {\n message: 'Bad Request',\n json: true,\n log: false,\n },\n 401: {\n message: 'Unauthorized',\n json: true,\n log: true,\n },\n 403: {\n message: 'Forbidden',\n json: true,\n log: true,\n },\n 404: {\n message: 'Not Found',\n json: true,\n log: false,\n },\n 500: {\n message: 'Internal Server Error',\n json: true,\n log: true,\n },\n default: {\n message: 'An error occurred',\n json: true,\n log: true,\n },\n },\n logger: {\n enabled: true,\n level: 'info',\n format: 'text',\n output: 'console',\n },\n};\n\nexport const GRACEFUL_SHUTDOWN_TIMEOUT = 10000;\n\nexport const HEALTH_CHECK_INTERVAL = 30000;\n\n","import { readFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type { HarborConfig } from '../types';\nimport { CONFIG_SEARCH_PATHS, ENV_KEYS } from '../constants';\nimport { DEFAULT_CONFIG } from '../constants/defaults.const';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('config');\n\nexport function loadConfig(configPath?: string): HarborConfig {\n const path = findConfigPath(configPath);\n \n if (!path) {\n logger.info('No config file found, using defaults');\n return applyEnvOverrides(DEFAULT_CONFIG);\n }\n\n try {\n const fileContent = readFileSync(path, 'utf-8');\n const userConfig = JSON.parse(fileContent) as Partial<HarborConfig>;\n const mergedConfig = deepMerge(DEFAULT_CONFIG, userConfig);\n \n logger.info('Config loaded', { path });\n return applyEnvOverrides(mergedConfig);\n } catch (error) {\n logger.error('Failed to load config', error as Error);\n return applyEnvOverrides(DEFAULT_CONFIG);\n }\n}\n\nexport function defineConfig(config: Partial<HarborConfig>): HarborConfig {\n return deepMerge(DEFAULT_CONFIG, config);\n}\n\nfunction findConfigPath(customPath?: string): string | null {\n if (customPath) {\n const resolved = resolve(process.cwd(), customPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n return null;\n }\n\n const envPath = process.env[ENV_KEYS.CONFIG_PATH];\n if (envPath) {\n const resolved = resolve(process.cwd(), envPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n for (const searchPath of CONFIG_SEARCH_PATHS) {\n const resolved = resolve(process.cwd(), searchPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n }\n\n return null;\n}\n\nfunction applyEnvOverrides(config: HarborConfig): HarborConfig {\n const envPort = process.env[ENV_KEYS.PORT];\n const envHost = process.env[ENV_KEYS.HOST];\n const envLogLevel = process.env[ENV_KEYS.LOG_LEVEL];\n\n if (envPort) {\n config.server.port = parseInt(envPort, 10);\n }\n\n if (envHost) {\n config.server.host = envHost;\n }\n\n if (envLogLevel) {\n config.logger.level = envLogLevel as HarborConfig['logger']['level'];\n }\n\n return config;\n}\n\nfunction deepMerge<T>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nexport function getConfigValue<T>(config: HarborConfig, path: string): T | undefined {\n const keys = path.split('.');\n let current: unknown = config;\n\n for (const key of keys) {\n if (current === null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return current as T;\n}\n\n","import { Router, RequestHandler } from 'express';\nimport type {\n RouteDefinition,\n RouteOptions,\n HarborRequest,\n HarborResponse,\n HttpMethod,\n HarborConfig,\n PreFunction,\n PostFunction,\n RouteHandler,\n ValidationSchema,\n} from '../types';\nimport { validateRequest } from '../validation';\nimport { createLogger } from '../utils/logger';\nimport { HTTP_STATUS } from '../constants';\nimport { t } from '../i18n';\n\nconst logger = createLogger('router');\n\ninterface RouterOptions {\n prefix?: string;\n routes?: RouteDefinition[];\n middleware?: RequestHandler[];\n}\n\nexport function createRouter(options: RouterOptions, config: HarborConfig): Router {\n const expressRouter = Router();\n\n if (options.middleware) {\n options.middleware.forEach((mw) => expressRouter.use(mw));\n }\n\n if (options.routes) {\n options.routes.forEach((routeDef) => {\n registerRoute(expressRouter, routeDef, config);\n });\n }\n\n return expressRouter;\n}\n\nfunction registerRoute(expressRouter: Router, routeDef: RouteDefinition, config: HarborConfig): void {\n const method = routeDef.method.toLowerCase() as keyof Router;\n const handlers = buildHandlerChain(routeDef, config);\n \n (expressRouter[method] as Function)(routeDef.path, ...handlers);\n \n logger.debug(t('router.registered', { method: routeDef.method, path: routeDef.path }));\n}\n\nfunction buildHandlerChain(routeDef: RouteDefinition, config: HarborConfig): RequestHandler[] {\n const handlers: RequestHandler[] = [];\n const options = routeDef.options ?? {};\n\n if (options.pre) {\n options.pre.forEach((preFn) => {\n handlers.push(wrapPreFunction(preFn));\n });\n }\n\n if (options.validation) {\n handlers.push(validationMiddleware(options.validation, config));\n }\n\n if (options.timeout) {\n handlers.push(timeoutMiddleware(options.timeout));\n }\n\n handlers.push(wrapHandler(routeDef.handler, options));\n\n return handlers;\n}\n\nfunction wrapPreFunction(preFn: PreFunction): RequestHandler {\n return async (req, res, next) => {\n try {\n await preFn(req as HarborRequest, res, next);\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction wrapHandler(handler: RouteHandler, options: RouteOptions): RequestHandler {\n return async (req, res, next) => {\n try {\n const result = await handler(req as HarborRequest, res as HarborResponse);\n\n if (options.post && options.post.length > 0) {\n for (const postFn of options.post) {\n await postFn(req as HarborRequest, res, result);\n }\n }\n\n if (!res.headersSent && result !== undefined) {\n res.json({\n success: true,\n data: result,\n });\n }\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction validationMiddleware(\n validation: NonNullable<RouteOptions['validation']>,\n config: HarborConfig\n): RequestHandler {\n return async (req, res, next) => {\n try {\n const validated: HarborRequest['validated'] = {};\n\n if (validation.params) {\n const result = await validateRequest(validation.params, req.params, config.validation);\n if (!result.valid) {\n res.status(HTTP_STATUS.BAD_REQUEST).json({\n success: false,\n error: {\n message: t('validation.failed'),\n details: result.errors,\n },\n });\n return;\n }\n validated.params = result.data as Record<string, unknown>;\n }\n\n if (validation.query) {\n const result = await validateRequest(validation.query, req.query, config.validation);\n if (!result.valid) {\n res.status(HTTP_STATUS.BAD_REQUEST).json({\n success: false,\n error: {\n message: t('validation.failed'),\n details: result.errors,\n },\n });\n return;\n }\n validated.query = result.data as Record<string, unknown>;\n }\n\n if (validation.body) {\n const result = await validateRequest(validation.body, req.body, config.validation);\n if (!result.valid) {\n res.status(HTTP_STATUS.BAD_REQUEST).json({\n success: false,\n error: {\n message: t('validation.failed'),\n details: result.errors,\n },\n });\n return;\n }\n validated.body = result.data as Record<string, unknown>;\n }\n\n (req as HarborRequest).validated = validated;\n next();\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction timeoutMiddleware(timeout: number): RequestHandler {\n return (_req, res, next) => {\n const timer = setTimeout(() => {\n if (!res.headersSent) {\n res.status(HTTP_STATUS.GATEWAY_TIMEOUT).json({\n success: false,\n error: {\n message: t('errors.timeout'),\n },\n });\n }\n }, timeout);\n\n res.on('finish', () => clearTimeout(timer));\n res.on('close', () => clearTimeout(timer));\n\n next();\n };\n}\n\nexport type RouteHandlerFn = (req: HarborRequest, res: HarborResponse) => unknown | Promise<unknown>;\n\nexport interface SimpleRouteOptions {\n pre?: PreFunction[];\n post?: PostFunction[];\n validation?: {\n params?: ValidationSchema;\n query?: ValidationSchema;\n body?: ValidationSchema;\n headers?: ValidationSchema;\n };\n timeout?: number;\n}\n\n/**\n * Create a router with routes - no express import needed!\n * \n * @example\n * // Style 1: Using GET, POST helpers\n * const userRoutes = router('/api/users', [\n * GET('/', async () => ({ users: [] })),\n * GET('/:id', async (req) => ({ user: req.params.id })),\n * POST('/', async (req) => ({ id: '123', ...req.body })),\n * ]);\n * \n * // Style 2: Using route.get, route.post\n * const userRoutes = router('/api/users', [\n * route.get('/', async () => ({ users: [] })),\n * route.post('/', async (req) => ({ ...req.body })),\n * ]);\n * \n * server.use(userRoutes);\n */\nexport function router(basePath: string, routes: RouteDefinition[], options?: { middleware?: RequestHandler[] }): Router {\n const expressRouter = Router();\n\n if (options?.middleware) {\n options.middleware.forEach((mw) => expressRouter.use(mw));\n }\n\n routes.forEach((routeDef) => {\n const fullPath = routeDef.path === '/' ? '' : routeDef.path;\n const method = routeDef.method.toLowerCase() as keyof Router;\n \n const handlers = buildSimpleHandlerChain(routeDef);\n \n (expressRouter[method] as Function)(fullPath, ...handlers);\n \n logger.debug(t('router.registered', { method: routeDef.method, path: `${basePath}${fullPath}` }));\n });\n\n const parentRouter = Router();\n parentRouter.use(basePath, expressRouter);\n\n return parentRouter;\n}\n\nfunction buildSimpleHandlerChain(routeDef: RouteDefinition): RequestHandler[] {\n const handlers: RequestHandler[] = [];\n const options = routeDef.options ?? {};\n\n if (options.pre) {\n options.pre.forEach((preFn) => {\n handlers.push(wrapPreFunction(preFn));\n });\n }\n\n handlers.push(wrapSimpleHandler(routeDef.handler, options));\n\n return handlers;\n}\n\nfunction wrapSimpleHandler(handler: RouteHandler, options: RouteOptions): RequestHandler {\n return async (req, res, next) => {\n try {\n const result = await handler(req as HarborRequest, res as HarborResponse);\n\n if (options.post && options.post.length > 0) {\n for (const postFn of options.post) {\n await postFn(req as HarborRequest, res, result);\n }\n }\n\n if (!res.headersSent && result !== undefined) {\n res.json({\n success: true,\n data: result,\n });\n }\n } catch (error) {\n next(error);\n }\n };\n}\n\nfunction createRoute(\n method: HttpMethod,\n path: string,\n handler: RouteHandlerFn,\n options?: SimpleRouteOptions\n): RouteDefinition {\n return {\n path,\n method,\n handler,\n options: options ? {\n pre: options.pre,\n post: options.post,\n validation: options.validation,\n timeout: options.timeout,\n } : undefined,\n };\n}\n\n/**\n * Define a GET route\n */\nexport function GET(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('GET', path, handler, options);\n}\n\n/**\n * Define a POST route\n */\nexport function POST(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('POST', path, handler, options);\n}\n\n/**\n * Define a PUT route\n */\nexport function PUT(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('PUT', path, handler, options);\n}\n\n/**\n * Define a PATCH route\n */\nexport function PATCH(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('PATCH', path, handler, options);\n}\n\n/**\n * Define a DELETE route\n */\nexport function DELETE(path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition {\n return createRoute('DELETE', path, handler, options);\n}\n\n/**\n * Route helper object - alternative syntax\n * \n * @example\n * const userRoutes = router('/api/users', [\n * route.get('/', async () => ({ users: [] })),\n * route.post('/', async (req) => ({ ...req.body })),\n * route.put('/:id', async (req) => ({ id: req.params.id })),\n * route.delete('/:id', async (req) => ({ deleted: true })),\n * ]);\n */\nexport const route = {\n get: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('GET', path, handler, options),\n \n post: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('POST', path, handler, options),\n \n put: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('PUT', path, handler, options),\n \n patch: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('PATCH', path, handler, options),\n \n delete: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('DELETE', path, handler, options),\n \n options: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('OPTIONS', path, handler, options),\n \n head: (path: string, handler: RouteHandlerFn, options?: SimpleRouteOptions): RouteDefinition =>\n createRoute('HEAD', path, handler, options),\n};\n\nexport class RouteBuilder {\n private _route: Partial<RouteDefinition> = {};\n private _options: RouteOptions = {};\n\n static create(): RouteBuilder {\n return new RouteBuilder();\n }\n\n path(path: string): this {\n this._route.path = path;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._route.method = method;\n return this;\n }\n\n get(path: string): this {\n return this.method('GET').path(path);\n }\n\n post(path: string): this {\n return this.method('POST').path(path);\n }\n\n put(path: string): this {\n return this.method('PUT').path(path);\n }\n\n patch(path: string): this {\n return this.method('PATCH').path(path);\n }\n\n delete(path: string): this {\n return this.method('DELETE').path(path);\n }\n\n handler(handler: RouteHandler): RouteDefinition {\n this._route.handler = handler;\n \n if (!this._route.path || !this._route.method || !this._route.handler) {\n throw new Error(t('router.missingRequired'));\n }\n\n return {\n path: this._route.path,\n method: this._route.method,\n handler: this._route.handler,\n options: Object.keys(this._options).length > 0 ? this._options : undefined,\n };\n }\n\n pre(...fns: PreFunction[]): this {\n this._options.pre = [...(this._options.pre ?? []), ...fns];\n return this;\n }\n\n postFn(...fns: PostFunction[]): this {\n this._options.post = [...(this._options.post ?? []), ...fns];\n return this;\n }\n\n validate(validation: RouteOptions['validation']): this {\n this._options.validation = validation;\n return this;\n }\n\n timeout(ms: number): this {\n this._options.timeout = ms;\n return this;\n }\n\n rateLimit(config: RouteOptions['rateLimit']): this {\n this._options.rateLimit = config;\n return this;\n }\n\n auth(config: RouteOptions['auth']): this {\n this._options.auth = config;\n return this;\n }\n\n cache(config: RouteOptions['cache']): this {\n this._options.cache = config;\n return this;\n }\n\n build(): RouteDefinition {\n if (!this._route.path || !this._route.method || !this._route.handler) {\n throw new Error(t('router.missingRequired'));\n }\n\n return {\n path: this._route.path,\n method: this._route.method,\n handler: this._route.handler,\n options: Object.keys(this._options).length > 0 ? this._options : undefined,\n };\n }\n}\n","import type { ErrorRequestHandler, RequestHandler, Request, Response, NextFunction } from 'express';\nimport type { HarborConfig, ErrorsConfig, ErrorHandler } from '../types';\nimport { HTTP_STATUS, HTTP_STATUS_MESSAGES } from '../constants';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('error');\n\nexport class HarborError extends Error {\n public statusCode: number;\n public code?: string;\n public details?: unknown;\n public isOperational: boolean;\n\n constructor(\n message: string,\n statusCode: number = HTTP_STATUS.INTERNAL_SERVER_ERROR,\n options?: {\n code?: string;\n details?: unknown;\n isOperational?: boolean;\n }\n ) {\n super(message);\n this.name = 'HarborError';\n this.statusCode = statusCode;\n this.code = options?.code;\n this.details = options?.details;\n this.isOperational = options?.isOperational ?? true;\n\n Error.captureStackTrace(this, this.constructor);\n }\n\n static badRequest(message?: string, details?: unknown): HarborError {\n return new HarborError(\n message ?? 'Bad Request',\n HTTP_STATUS.BAD_REQUEST,\n { code: 'BAD_REQUEST', details }\n );\n }\n\n static unauthorized(message?: string): HarborError {\n return new HarborError(\n message ?? 'Unauthorized',\n HTTP_STATUS.UNAUTHORIZED,\n { code: 'UNAUTHORIZED' }\n );\n }\n\n static forbidden(message?: string): HarborError {\n return new HarborError(\n message ?? 'Forbidden',\n HTTP_STATUS.FORBIDDEN,\n { code: 'FORBIDDEN' }\n );\n }\n\n static notFound(message?: string): HarborError {\n return new HarborError(\n message ?? 'Not Found',\n HTTP_STATUS.NOT_FOUND,\n { code: 'NOT_FOUND' }\n );\n }\n\n static conflict(message?: string, details?: unknown): HarborError {\n return new HarborError(\n message ?? 'Conflict',\n HTTP_STATUS.CONFLICT,\n { code: 'CONFLICT', details }\n );\n }\n\n static internal(message?: string): HarborError {\n return new HarborError(\n message ?? 'Internal Server Error',\n HTTP_STATUS.INTERNAL_SERVER_ERROR,\n { code: 'INTERNAL_ERROR', isOperational: false }\n );\n }\n\n static tooManyRequests(message?: string): HarborError {\n return new HarborError(\n message ?? 'Too Many Requests',\n HTTP_STATUS.TOO_MANY_REQUESTS,\n { code: 'RATE_LIMIT_EXCEEDED' }\n );\n }\n\n toJSON(): Record<string, unknown> {\n return {\n success: false,\n error: {\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n details: this.details,\n },\n };\n }\n}\n\nexport function createErrorHandler(config: HarborConfig): ErrorRequestHandler {\n const errorsConfig = config.errors;\n\n return (error: Error | HarborError, req: Request, res: Response, _next: NextFunction): void => {\n const statusCode = (error as HarborError).statusCode ?? HTTP_STATUS.INTERNAL_SERVER_ERROR;\n const errorConfig = getErrorConfig(statusCode, errorsConfig);\n\n if (errorConfig?.log !== false && config.logger.enabled) {\n logger.error(`${req.method} ${req.path} - ${error.message}`, error);\n }\n\n if (res.headersSent) {\n return;\n }\n\n if (errorConfig?.redirect) {\n res.redirect(errorConfig.redirect);\n return;\n }\n\n const response = buildErrorResponse(error, statusCode, errorConfig);\n\n if (errorConfig?.json !== false) {\n res.status(statusCode).json(response);\n } else {\n res.status(statusCode).send(response.error.message);\n }\n };\n}\n\nfunction getErrorConfig(statusCode: number, errorsConfig: ErrorsConfig): ErrorHandler | undefined {\n const statusKey = statusCode.toString() as keyof ErrorsConfig;\n return errorsConfig[statusKey] ?? errorsConfig.default;\n}\n\nfunction buildErrorResponse(\n error: Error | HarborError,\n statusCode: number,\n errorConfig?: ErrorHandler\n): { success: false; error: { message: string; code?: string; statusCode: number; details?: unknown } } {\n if (error instanceof HarborError) {\n return error.toJSON() as ReturnType<typeof buildErrorResponse>;\n }\n\n const message = errorConfig?.message ?? error.message ?? HTTP_STATUS_MESSAGES[statusCode] ?? 'An error occurred';\n\n return {\n success: false,\n error: {\n message,\n statusCode,\n },\n };\n}\n\nexport function notFoundHandler(config: HarborConfig): RequestHandler {\n return (req: Request, res: Response, _next: NextFunction): void => {\n const errorConfig = config.errors[404];\n \n if (config.logger.enabled && errorConfig?.log) {\n logger.warn(`404 Not Found: ${req.method} ${req.path}`);\n }\n\n if (errorConfig?.redirect) {\n res.redirect(errorConfig.redirect);\n return;\n }\n\n const message = errorConfig?.message ?? 'Not Found';\n\n if (errorConfig?.json !== false) {\n res.status(HTTP_STATUS.NOT_FOUND).json({\n success: false,\n error: {\n message,\n code: 'NOT_FOUND',\n statusCode: HTTP_STATUS.NOT_FOUND,\n },\n });\n } else {\n res.status(HTTP_STATUS.NOT_FOUND).send(message);\n }\n };\n}\n\n","import express, { Express, RequestHandler } from 'express';\nimport { createServer as createHttpServer, Server as HttpServer } from 'http';\nimport type {\n HarborServer,\n ServerInfo,\n CreateServerOptions,\n ServerStatus,\n HarborConfig,\n RouteDefinition,\n RouteGroup,\n} from '../types';\nimport { loadConfig } from './config';\nimport { createRouter } from './router';\nimport { createErrorHandler } from './errorHandler';\nimport { createLogger } from '../utils/logger';\nimport { GRACEFUL_SHUTDOWN_TIMEOUT } from '../constants/defaults.const';\n\nconst logger = createLogger('server');\n\nexport function createServer(options: CreateServerOptions = {}): HarborServer {\n const config = loadConfig(options.configPath);\n const app = express();\n let server: HttpServer | null = null;\n let status: ServerStatus = 'stopped';\n let startedAt: Date | null = null;\n const routes: RouteDefinition[] = [];\n\n applyMiddleware(app, config);\n\n const harborServer: HarborServer = {\n app,\n server,\n config,\n\n async start(): Promise<ServerInfo> {\n if (status === 'running') {\n logger.warn('Server is already running');\n return harborServer.getInfo();\n }\n\n status = 'starting';\n const port = options.port ?? config.server.port;\n const host = options.host ?? config.server.host ?? 'localhost';\n\n return new Promise((resolve, reject) => {\n try {\n server = createHttpServer(app);\n harborServer.server = server;\n\n server.listen(port, host, () => {\n status = 'running';\n startedAt = new Date();\n \n const info = harborServer.getInfo();\n logger.info(`Server started on http://${host}:${port}`);\n \n options.onReady?.(info);\n resolve(info);\n });\n\n server.on('error', (error) => {\n status = 'error';\n logger.error('Server error', error);\n options.onError?.(error);\n reject(error);\n });\n\n setupGracefulShutdown(harborServer);\n } catch (error) {\n status = 'error';\n reject(error);\n }\n });\n },\n\n async stop(): Promise<void> {\n if (!server || status === 'stopped') {\n return;\n }\n\n status = 'stopping';\n \n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n server?.close();\n resolve();\n }, GRACEFUL_SHUTDOWN_TIMEOUT);\n\n server!.close((error) => {\n clearTimeout(timeout);\n if (error) {\n logger.error('Error stopping server', error);\n reject(error);\n } else {\n status = 'stopped';\n startedAt = null;\n logger.info('Server stopped');\n resolve();\n }\n });\n });\n },\n\n async restart(): Promise<ServerInfo> {\n await harborServer.stop();\n return harborServer.start();\n },\n\n addRoute(route: RouteDefinition): void {\n routes.push(route);\n const router = createRouter({ routes: [route] }, config);\n app.use(router);\n },\n\n addRouteGroup(group: RouteGroup): void {\n routes.push(...group.routes);\n const router = createRouter({ \n prefix: group.prefix, \n routes: group.routes,\n middleware: group.middleware,\n }, config);\n app.use(group.prefix, router);\n },\n\n addMiddleware(middleware: RequestHandler): void {\n app.use(middleware);\n },\n\n // Convenience methods - works like Express!\n use(...args: Parameters<Express['use']>): void {\n app.use(...args);\n },\n\n get(path: string, ...handlers: RequestHandler[]): void {\n app.get(path, ...handlers);\n },\n\n post(path: string, ...handlers: RequestHandler[]): void {\n app.post(path, ...handlers);\n },\n\n put(path: string, ...handlers: RequestHandler[]): void {\n app.put(path, ...handlers);\n },\n\n patch(path: string, ...handlers: RequestHandler[]): void {\n app.patch(path, ...handlers);\n },\n\n delete(path: string, ...handlers: RequestHandler[]): void {\n app.delete(path, ...handlers);\n },\n\n listen(port?: number, callback?: () => void): void {\n const serverPort = port ?? options.port ?? config.server.port;\n const host = options.host ?? config.server.host ?? 'localhost';\n \n server = createHttpServer(app);\n harborServer.server = server;\n \n server.listen(serverPort, host, () => {\n status = 'running';\n startedAt = new Date();\n logger.info(`Server started on http://${host}:${serverPort}`);\n callback?.();\n });\n\n setupGracefulShutdown(harborServer);\n },\n\n getInfo(): ServerInfo {\n const port = options.port ?? config.server.port;\n const host = options.host ?? config.server.host ?? 'localhost';\n \n return {\n port,\n host,\n uptime: startedAt ? Date.now() - startedAt.getTime() : 0,\n startedAt,\n routes: routes.map((r) => ({\n path: r.path,\n method: r.method,\n middleware: [],\n })),\n status,\n };\n },\n };\n\n // Only auto-start if explicitly requested (default: false for easier setup)\n if (options.autoStart === true) {\n harborServer.start().catch((error) => {\n logger.error('Failed to auto-start server', error);\n });\n }\n\n return harborServer;\n}\n\nfunction applyMiddleware(app: Express, config: HarborConfig): void {\n if (config.server.bodyParser?.json) {\n app.use(express.json({ limit: config.server.bodyParser.limit }));\n }\n\n if (config.server.bodyParser?.urlencoded) {\n app.use(express.urlencoded({ \n extended: true, \n limit: config.server.bodyParser.limit \n }));\n }\n\n if (config.server.cors?.enabled) {\n app.use(corsMiddleware(config.server.cors));\n }\n\n app.use(requestEnhancer());\n\n const errorHandler = createErrorHandler(config);\n app.use(errorHandler);\n}\n\nfunction corsMiddleware(corsConfig: NonNullable<HarborConfig['server']['cors']>): RequestHandler {\n return (req, res, next) => {\n const origin = corsConfig.origin;\n \n if (origin === true || origin === '*') {\n res.setHeader('Access-Control-Allow-Origin', '*');\n } else if (typeof origin === 'string') {\n res.setHeader('Access-Control-Allow-Origin', origin);\n } else if (Array.isArray(origin)) {\n const requestOrigin = req.headers.origin;\n if (requestOrigin && origin.includes(requestOrigin)) {\n res.setHeader('Access-Control-Allow-Origin', requestOrigin);\n }\n }\n\n res.setHeader(\n 'Access-Control-Allow-Methods',\n corsConfig.methods?.join(', ') ?? 'GET,POST,PUT,PATCH,DELETE,OPTIONS'\n );\n\n if (corsConfig.allowedHeaders) {\n res.setHeader('Access-Control-Allow-Headers', corsConfig.allowedHeaders.join(', '));\n } else {\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n }\n\n if (corsConfig.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return;\n }\n\n next();\n };\n}\n\nfunction requestEnhancer(): RequestHandler {\n return (req, res, next) => {\n (req as any).startTime = Date.now();\n (req as any).harborContext = {};\n\n (res as any).success = function <T>(data: T, statusCode = 200) {\n res.status(statusCode).json({\n success: true,\n data,\n });\n };\n\n (res as any).error = function (message: string, statusCode = 500, details?: unknown) {\n res.status(statusCode).json({\n success: false,\n error: {\n message,\n details,\n },\n });\n };\n\n next();\n };\n}\n\nfunction setupGracefulShutdown(server: HarborServer): void {\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];\n\n signals.forEach((signal) => {\n process.on(signal, async () => {\n logger.info(`Received ${signal}, shutting down gracefully`);\n await server.stop();\n process.exit(0);\n });\n });\n}\n\n","import { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport type { ChangelogEntry, ChangelogConfig, ChangeItem, ChangeType, ReleaseNotes } from './types';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('changelog');\n\nconst DEFAULT_CONFIG: ChangelogConfig = {\n filePath: './CHANGELOG.md',\n format: 'markdown',\n includeUnreleased: true,\n};\n\nexport function createChangelogManager(config: Partial<ChangelogConfig> = {}) {\n const cfg: ChangelogConfig = { ...DEFAULT_CONFIG, ...config };\n const entries: ChangelogEntry[] = [];\n let unreleasedChanges: ChangeItem[] = [];\n\n function load(): void {\n const filePath = resolve(process.cwd(), cfg.filePath);\n \n if (!existsSync(filePath)) {\n logger.info('No changelog file found, starting fresh');\n return;\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n parseMarkdown(content);\n logger.info('Changelog loaded', { entries: entries.length });\n } catch (error) {\n logger.error('Failed to load changelog', error as Error);\n }\n }\n\n function parseMarkdown(content: string): void {\n const versionRegex = /## \\[(\\d+\\.\\d+\\.\\d+(?:-[\\w.]+)?)\\](?: - (\\d{4}-\\d{2}-\\d{2}))?/g;\n const sections = content.split(versionRegex);\n\n for (let i = 1; i < sections.length; i += 3) {\n const version = sections[i];\n const dateStr = sections[i + 1];\n const changesSection = sections[i + 2];\n\n if (version && changesSection) {\n const entry: ChangelogEntry = {\n version,\n date: dateStr ? new Date(dateStr) : new Date(),\n changes: parseChangesSection(changesSection),\n };\n entries.push(entry);\n }\n }\n }\n\n function parseChangesSection(section: string): ChangeItem[] {\n const items: ChangeItem[] = [];\n const lines = section.split('\\n');\n let currentType: ChangeType | null = null;\n\n for (const line of lines) {\n const typeMatch = line.match(/^### (Added|Changed|Deprecated|Removed|Fixed|Security)/i);\n if (typeMatch) {\n currentType = typeMatch[1].toLowerCase() as ChangeType;\n continue;\n }\n\n const itemMatch = line.match(/^- (.+)/);\n if (itemMatch && currentType) {\n items.push({\n type: currentType,\n description: itemMatch[1].trim(),\n });\n }\n }\n\n return items;\n }\n\n function save(): void {\n const filePath = resolve(process.cwd(), cfg.filePath);\n const content = generateMarkdown();\n \n writeFileSync(filePath, content, 'utf-8');\n logger.info('Changelog saved', { path: filePath });\n }\n\n function generateMarkdown(): string {\n let content = '# Changelog\\n\\n';\n content += 'All notable changes to this project will be documented in this file.\\n\\n';\n content += 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\\n';\n content += 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\\n\\n';\n\n if (cfg.includeUnreleased && unreleasedChanges.length > 0) {\n content += '## [Unreleased]\\n\\n';\n content += formatChanges(unreleasedChanges);\n content += '\\n';\n }\n\n for (const entry of entries) {\n const dateStr = entry.date.toISOString().split('T')[0];\n content += `## [${entry.version}] - ${dateStr}\\n\\n`;\n content += formatChanges(entry.changes);\n \n if (entry.breaking && entry.breaking.length > 0) {\n content += '### BREAKING CHANGES\\n\\n';\n for (const item of entry.breaking) {\n content += `- ${item.description}\\n`;\n }\n content += '\\n';\n }\n \n content += '\\n';\n }\n\n return content;\n }\n\n function formatChanges(changes: ChangeItem[]): string {\n const grouped = groupByType(changes);\n let content = '';\n\n const typeOrder: ChangeType[] = ['added', 'changed', 'deprecated', 'removed', 'fixed', 'security'];\n\n for (const type of typeOrder) {\n const items = grouped[type];\n if (items && items.length > 0) {\n content += `### ${capitalize(type)}\\n\\n`;\n for (const item of items) {\n let line = `- ${item.description}`;\n if (item.scope) line = `- **${item.scope}:** ${item.description}`;\n if (item.issue) line += ` (#${item.issue})`;\n content += line + '\\n';\n }\n content += '\\n';\n }\n }\n\n return content;\n }\n\n function groupByType(changes: ChangeItem[]): Record<ChangeType, ChangeItem[]> {\n const grouped: Record<ChangeType, ChangeItem[]> = {\n added: [],\n changed: [],\n deprecated: [],\n removed: [],\n fixed: [],\n security: [],\n };\n\n for (const change of changes) {\n grouped[change.type].push(change);\n }\n\n return grouped;\n }\n\n function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n return {\n load,\n save,\n\n addChange(type: ChangeType, description: string, options?: { scope?: string; issue?: string }): void {\n unreleasedChanges.push({\n type,\n description,\n scope: options?.scope,\n issue: options?.issue,\n });\n },\n\n release(version: string): ChangelogEntry {\n const entry: ChangelogEntry = {\n version,\n date: new Date(),\n changes: [...unreleasedChanges],\n };\n\n entries.unshift(entry);\n unreleasedChanges = [];\n save();\n\n logger.info(`Released version ${version}`);\n return entry;\n },\n\n getEntries(): ChangelogEntry[] {\n return [...entries];\n },\n\n getUnreleased(): ChangeItem[] {\n return [...unreleasedChanges];\n },\n\n getLatestVersion(): string | null {\n return entries[0]?.version ?? null;\n },\n\n getReleaseNotes(version: string): ReleaseNotes | null {\n const entry = entries.find((e) => e.version === version);\n if (!entry) return null;\n\n const grouped = groupByType(entry.changes);\n\n return {\n version: entry.version,\n date: entry.date,\n added: grouped.added.map((i) => i.description),\n changed: grouped.changed.map((i) => i.description),\n deprecated: grouped.deprecated.map((i) => i.description),\n removed: grouped.removed.map((i) => i.description),\n fixed: grouped.fixed.map((i) => i.description),\n security: grouped.security.map((i) => i.description),\n breaking: entry.breaking?.map((i) => i.description) ?? [],\n };\n },\n };\n}\n\nexport function generateChangelog(entries: ChangelogEntry[], config?: Partial<ChangelogConfig>): string {\n const manager = createChangelogManager(config);\n \n for (const entry of entries.reverse()) {\n for (const change of entry.changes) {\n manager.addChange(change.type, change.description, {\n scope: change.scope,\n issue: change.issue,\n });\n }\n manager.release(entry.version);\n }\n\n return '';\n}\n\nexport class ChangelogManager {\n private manager: ReturnType<typeof createChangelogManager>;\n\n constructor(config?: Partial<ChangelogConfig>) {\n this.manager = createChangelogManager(config);\n }\n\n load = () => this.manager.load();\n save = () => this.manager.save();\n addChange = (...args: Parameters<typeof this.manager.addChange>) => this.manager.addChange(...args);\n release = (version: string) => this.manager.release(version);\n getEntries = () => this.manager.getEntries();\n getUnreleased = () => this.manager.getUnreleased();\n getLatestVersion = () => this.manager.getLatestVersion();\n getReleaseNotes = (version: string) => this.manager.getReleaseNotes(version);\n}\n\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n \n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n\n return result;\n}\n\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n \n for (const key of keys) {\n delete result[key];\n }\n\n return result as Omit<T, K>;\n}\n\nexport function flatten(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n const value = obj[key];\n\n if (isObject(value)) {\n Object.assign(result, flatten(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\n }\n\n return result;\n}\n\n","export function generateId(length = 16): string {\n const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n let result = '';\n \n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n \n return result;\n}\n\nexport function formatDate(date: Date, format = 'ISO'): string {\n if (format === 'ISO') {\n return date.toISOString();\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n switch (format) {\n case 'DATE':\n return `${year}-${month}-${day}`;\n case 'TIME':\n return `${hours}:${minutes}:${seconds}`;\n case 'DATETIME':\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n default:\n return date.toISOString();\n }\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout;\n \n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle = false;\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n fn(...args);\n inThrottle = true;\n setTimeout(() => (inThrottle = false), limit);\n }\n };\n}\n\nexport function retry<T>(\n fn: () => Promise<T>,\n maxRetries: number,\n delay: number\n): Promise<T> {\n return new Promise((resolve, reject) => {\n let attempts = 0;\n\n const attempt = async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n attempts++;\n if (attempts >= maxRetries) {\n reject(error);\n } else {\n setTimeout(attempt, delay);\n }\n }\n };\n\n attempt();\n });\n}\n\n","import type { RequestHandler, Request, Response, NextFunction } from 'express';\nimport { createLogger } from './logger';\nimport { t } from '../i18n';\n\nconst logger = createLogger('http');\n\nexport type HttpLogFormat = 'tiny' | 'short' | 'dev' | 'combined' | 'common' | 'custom';\n\nexport interface HttpLoggerOptions {\n format?: HttpLogFormat;\n skip?: (req: Request, res: Response) => boolean;\n immediate?: boolean;\n customFormat?: (tokens: HttpLogTokens) => string;\n colorize?: boolean;\n}\n\nexport interface HttpLogTokens {\n method: string;\n url: string;\n status: number;\n statusColor: string;\n responseTime: number;\n contentLength: string;\n remoteAddr: string;\n date: string;\n httpVersion: string;\n userAgent: string;\n referrer: string;\n}\n\nconst STATUS_COLORS = {\n info: '\\x1b[36m', // Cyan for 1xx\n success: '\\x1b[32m', // Green for 2xx\n redirect: '\\x1b[36m',// Cyan for 3xx\n clientError: '\\x1b[33m', // Yellow for 4xx\n serverError: '\\x1b[31m', // Red for 5xx\n reset: '\\x1b[0m',\n};\n\nfunction getStatusColor(status: number): string {\n if (status >= 500) return STATUS_COLORS.serverError;\n if (status >= 400) return STATUS_COLORS.clientError;\n if (status >= 300) return STATUS_COLORS.redirect;\n if (status >= 200) return STATUS_COLORS.success;\n return STATUS_COLORS.info;\n}\n\nfunction getMethodColor(method: string): string {\n const colors: Record<string, string> = {\n GET: '\\x1b[32m', // Green\n POST: '\\x1b[34m', // Blue\n PUT: '\\x1b[33m', // Yellow\n PATCH: '\\x1b[35m', // Magenta\n DELETE: '\\x1b[31m', // Red\n OPTIONS: '\\x1b[36m',// Cyan\n HEAD: '\\x1b[36m', // Cyan\n };\n return colors[method] ?? '\\x1b[0m';\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '-';\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction getTokens(req: Request, res: Response, startTime: number): HttpLogTokens {\n const responseTime = Date.now() - startTime;\n const status = res.statusCode;\n const contentLength = res.get('content-length') ?? '0';\n\n return {\n method: req.method,\n url: req.originalUrl || req.url,\n status,\n statusColor: getStatusColor(status),\n responseTime,\n contentLength: formatBytes(parseInt(contentLength, 10) || 0),\n remoteAddr: req.ip || req.socket.remoteAddress || '-',\n date: new Date().toISOString(),\n httpVersion: `HTTP/${req.httpVersionMajor}.${req.httpVersionMinor}`,\n userAgent: req.get('user-agent') ?? '-',\n referrer: req.get('referrer') ?? '-',\n };\n}\n\n// Format presets (like Morgan)\nconst FORMATS: Record<HttpLogFormat, (tokens: HttpLogTokens, colorize: boolean) => string> = {\n tiny: (t, c) => {\n const method = c ? `${getMethodColor(t.method)}${t.method}${STATUS_COLORS.reset}` : t.method;\n const status = c ? `${t.statusColor}${t.status}${STATUS_COLORS.reset}` : String(t.status);\n return `${method} ${t.url} ${status} ${t.responseTime}ms`;\n },\n\n short: (t, c) => {\n const method = c ? `${getMethodColor(t.method)}${t.method}${STATUS_COLORS.reset}` : t.method;\n const status = c ? `${t.statusColor}${t.status}${STATUS_COLORS.reset}` : String(t.status);\n return `${t.remoteAddr} ${method} ${t.url} ${status} ${t.responseTime}ms - ${t.contentLength}`;\n },\n\n dev: (t, c) => {\n const method = c ? `${getMethodColor(t.method)}${t.method.padEnd(7)}${STATUS_COLORS.reset}` : t.method.padEnd(7);\n const status = c ? `${t.statusColor}${t.status}${STATUS_COLORS.reset}` : String(t.status);\n const time = t.responseTime < 100 \n ? `${t.responseTime}ms` \n : t.responseTime < 1000 \n ? `\\x1b[33m${t.responseTime}ms${STATUS_COLORS.reset}`\n : `\\x1b[31m${t.responseTime}ms${STATUS_COLORS.reset}`;\n return `${method} ${t.url} ${status} ${c ? time : `${t.responseTime}ms`} - ${t.contentLength}`;\n },\n\n combined: (t) => {\n return `${t.remoteAddr} - - [${t.date}] \"${t.method} ${t.url} ${t.httpVersion}\" ${t.status} ${t.contentLength} \"${t.referrer}\" \"${t.userAgent}\"`;\n },\n\n common: (t) => {\n return `${t.remoteAddr} - - [${t.date}] \"${t.method} ${t.url} ${t.httpVersion}\" ${t.status} ${t.contentLength}`;\n },\n\n custom: () => '', // Handled separately\n};\n\n/**\n * Create an HTTP request logger middleware (Morgan-like)\n */\nexport function httpLogger(options: HttpLoggerOptions = {}): RequestHandler {\n const {\n format = 'dev',\n skip,\n immediate = false,\n customFormat,\n colorize = true,\n } = options;\n\n return (req: Request, res: Response, next: NextFunction): void => {\n const startTime = Date.now();\n\n // Log immediately if configured\n if (immediate) {\n logger.info(t('http.requestStart', { method: req.method, url: req.url }));\n }\n\n // Store original end function\n const originalEnd = res.end;\n\n // Override end to log after response\n res.end = function(chunk?: any, encoding?: any, callback?: any): Response {\n res.end = originalEnd;\n const result = res.end(chunk, encoding, callback);\n\n // Skip logging if skip function returns true\n if (skip && skip(req, res)) {\n return result;\n }\n\n // Get tokens\n const tokens = getTokens(req, res, startTime);\n\n // Format log message\n let message: string;\n if (format === 'custom' && customFormat) {\n message = customFormat(tokens);\n } else {\n message = FORMATS[format](tokens, colorize);\n }\n\n // Log based on status code\n if (tokens.status >= 500) {\n logger.error(message);\n } else if (tokens.status >= 400) {\n logger.warn(message);\n } else {\n logger.info(message);\n }\n\n return result;\n };\n\n next();\n };\n}\n\n/**\n * Predefined skip functions\n */\nexport const skipFunctions = {\n /** Skip successful responses */\n successOnly: (_req: Request, res: Response): boolean => res.statusCode < 400,\n \n /** Skip health check endpoints */\n healthChecks: (req: Request): boolean => \n req.url === '/health' || req.url === '/healthz' || req.url === '/ready',\n \n /** Skip static files */\n staticFiles: (req: Request): boolean => \n /\\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$/i.test(req.url),\n \n /** Skip based on custom paths */\n paths: (paths: string[]) => (req: Request): boolean => \n paths.some(p => req.url.startsWith(p)),\n};\n\n/**\n * Create a custom format function\n */\nexport function createCustomFormat(\n formatFn: (tokens: HttpLogTokens) => string\n): (tokens: HttpLogTokens) => string {\n return formatFn;\n}\n\n// Export default formats for reference\nexport const formats = {\n tiny: ':method :url :status :response-time ms',\n short: ':remote-addr :method :url :status :response-time ms - :content-length',\n dev: ':method :url :status :response-time ms - :content-length',\n combined: ':remote-addr - :remote-user [:date] \":method :url HTTP/:http-version\" :status :content-length \":referrer\" \":user-agent\"',\n common: ':remote-addr - :remote-user [:date] \":method :url HTTP/:http-version\" :status :content-length',\n};\n\n"],"names":["CONFIG_SEARCH_PATHS","ENV_KEYS","DEFAULT_PORT","DEFAULT_HOST","DEFAULT_TIMEOUT","DEFAULT_BODY_LIMIT","DEFAULT_CONFIG","GRACEFUL_SHUTDOWN_TIMEOUT","logger","createLogger","loadConfig","configPath","path","findConfigPath","applyEnvOverrides","fileContent","readFileSync","userConfig","mergedConfig","deepMerge","error","defineConfig","config","customPath","resolved","resolve","existsSync","envPath","searchPath","envPort","envHost","envLogLevel","target","source","result","key","sourceValue","targetValue","createRouter","options","expressRouter","Router","mw","routeDef","registerRoute","method","handlers","buildHandlerChain","t","preFn","wrapPreFunction","validationMiddleware","timeoutMiddleware","wrapHandler","req","res","next","handler","postFn","validation","validated","validateRequest","HTTP_STATUS","timeout","_req","timer","router","basePath","routes","fullPath","buildSimpleHandlerChain","parentRouter","wrapSimpleHandler","createRoute","GET","POST","PUT","PATCH","DELETE","route","RouteBuilder","fns","ms","HarborError","message","statusCode","details","createErrorHandler","errorsConfig","_next","errorConfig","getErrorConfig","response","buildErrorResponse","statusKey","HTTP_STATUS_MESSAGES","createServer","app","express","server","status","startedAt","applyMiddleware","harborServer","port","host","reject","createHttpServer","info","setupGracefulShutdown","group","middleware","args","callback","serverPort","r","corsMiddleware","requestEnhancer","errorHandler","corsConfig","origin","requestOrigin","data","signal","createChangelogManager","cfg","entries","unreleasedChanges","load","filePath","content","parseMarkdown","versionRegex","sections","i","version","dateStr","changesSection","entry","parseChangesSection","section","items","lines","currentType","line","typeMatch","itemMatch","save","generateMarkdown","writeFileSync","formatChanges","item","changes","grouped","groupByType","typeOrder","type","capitalize","change","str","description","e","ChangelogManager","isObject","value","pick","obj","keys","omit","generateId","length","chars","formatDate","date","format","year","month","day","hours","minutes","seconds","sleep","STATUS_COLORS","getStatusColor","getMethodColor","formatBytes","bytes","getTokens","startTime","responseTime","contentLength","FORMATS","c","time","httpLogger","skip","immediate","customFormat","colorize","originalEnd","chunk","encoding","tokens","skipFunctions","paths","p","createCustomFormat","formatFn"],"mappings":"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"}
|