@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.
Files changed (123) hide show
  1. package/CHANGELOG.md +82 -101
  2. package/README.md +210 -794
  3. package/dist/auth/apiKey.d.ts +6 -0
  4. package/dist/auth/apiKey.d.ts.map +1 -0
  5. package/dist/auth/index.d.ts +7 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +2 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/jwt.d.ts +21 -0
  10. package/dist/auth/jwt.d.ts.map +1 -0
  11. package/dist/auth/password.d.ts +6 -0
  12. package/dist/auth/password.d.ts.map +1 -0
  13. package/dist/auth/rbac.d.ts +6 -0
  14. package/dist/auth/rbac.d.ts.map +1 -0
  15. package/dist/auth/signing.d.ts +5 -0
  16. package/dist/auth/signing.d.ts.map +1 -0
  17. package/dist/auth/types/apiKey.types.d.ts +9 -0
  18. package/dist/auth/types/apiKey.types.d.ts.map +1 -0
  19. package/dist/auth/types/index.d.ts +5 -0
  20. package/dist/auth/types/index.d.ts.map +1 -0
  21. package/dist/auth/types/jwt.types.d.ts +17 -0
  22. package/dist/auth/types/jwt.types.d.ts.map +1 -0
  23. package/dist/auth/types/rbac.types.d.ts +8 -0
  24. package/dist/auth/types/rbac.types.d.ts.map +1 -0
  25. package/dist/auth/types/signing.types.d.ts +8 -0
  26. package/dist/auth/types/signing.types.d.ts.map +1 -0
  27. package/dist/cache/index.d.ts +4 -0
  28. package/dist/cache/index.d.ts.map +1 -0
  29. package/dist/cache/index.js +2 -0
  30. package/dist/cache/index.js.map +1 -0
  31. package/dist/cache/manager.d.ts +24 -0
  32. package/dist/cache/manager.d.ts.map +1 -0
  33. package/dist/cache/stores.d.ts +28 -0
  34. package/dist/cache/stores.d.ts.map +1 -0
  35. package/dist/cache/types.d.ts +23 -0
  36. package/dist/cache/types.d.ts.map +1 -0
  37. package/dist/cli/index.js +21 -22
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/core/config.d.ts.map +1 -1
  40. package/dist/core/router.d.ts +40 -2
  41. package/dist/core/router.d.ts.map +1 -1
  42. package/dist/core/server.d.ts.map +1 -1
  43. package/dist/database/connection.d.ts +1 -2
  44. package/dist/database/connection.d.ts.map +1 -1
  45. package/dist/database/index.js +2 -0
  46. package/dist/database/index.js.map +1 -0
  47. package/dist/database/model.d.ts +1 -4
  48. package/dist/database/model.d.ts.map +1 -1
  49. package/dist/docker/index.js +1 -1
  50. package/dist/http.const-BKHG1Lsj.mjs +62 -0
  51. package/dist/http.const-BKHG1Lsj.mjs.map +1 -0
  52. package/dist/http.const-Ckcy7OFp.js +2 -0
  53. package/dist/http.const-Ckcy7OFp.js.map +1 -0
  54. package/dist/index-Ca4WpLvw.js +2 -0
  55. package/dist/index-Ca4WpLvw.js.map +1 -0
  56. package/dist/index-DIVHd6rO.mjs +1054 -0
  57. package/dist/index-DIVHd6rO.mjs.map +1 -0
  58. package/dist/index.cjs.js +16 -16
  59. package/dist/index.cjs.js.map +1 -1
  60. package/dist/index.d.ts +11 -2
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.es.js +676 -1691
  63. package/dist/index.es.js.map +1 -1
  64. package/dist/logger-CZn7QxCl.mjs +102 -0
  65. package/dist/{logger-D7aJSi62.mjs.map → logger-CZn7QxCl.mjs.map} +1 -1
  66. package/dist/logger-D-lfaRWQ.js +3 -0
  67. package/dist/{logger-DEnWXtpk.js.map → logger-D-lfaRWQ.js.map} +1 -1
  68. package/dist/manager-CjcKb4P9.mjs +149 -0
  69. package/dist/{manager-B6vqJgEn.mjs.map → manager-CjcKb4P9.mjs.map} +1 -1
  70. package/dist/manager-DrF1vbJg.js +4 -0
  71. package/dist/{manager-B1UKMjXW.js.map → manager-DrF1vbJg.js.map} +1 -1
  72. package/dist/middleware/health.d.ts +65 -0
  73. package/dist/middleware/health.d.ts.map +1 -0
  74. package/dist/middleware/index.d.ts +5 -0
  75. package/dist/middleware/index.d.ts.map +1 -0
  76. package/dist/middleware/index.js +2 -0
  77. package/dist/middleware/index.js.map +1 -0
  78. package/dist/middleware/metrics.d.ts +68 -0
  79. package/dist/middleware/metrics.d.ts.map +1 -0
  80. package/dist/middleware/rateLimit.d.ts +52 -0
  81. package/dist/middleware/rateLimit.d.ts.map +1 -0
  82. package/dist/middleware/upload.d.ts +59 -0
  83. package/dist/middleware/upload.d.ts.map +1 -0
  84. package/dist/password-BXBkKbv3.js +2 -0
  85. package/dist/password-BXBkKbv3.js.map +1 -0
  86. package/dist/password-y4m307oa.mjs +223 -0
  87. package/dist/password-y4m307oa.mjs.map +1 -0
  88. package/dist/scheduler/index.d.ts +3 -0
  89. package/dist/scheduler/index.d.ts.map +1 -0
  90. package/dist/scheduler/index.js +2 -0
  91. package/dist/scheduler/index.js.map +1 -0
  92. package/dist/scheduler/scheduler.d.ts +30 -0
  93. package/dist/scheduler/scheduler.d.ts.map +1 -0
  94. package/dist/scheduler/types.d.ts +25 -0
  95. package/dist/scheduler/types.d.ts.map +1 -0
  96. package/dist/types/server.types.d.ts +7 -0
  97. package/dist/types/server.types.d.ts.map +1 -1
  98. package/dist/upload-9lCNnKK_.js +5 -0
  99. package/dist/upload-9lCNnKK_.js.map +1 -0
  100. package/dist/upload-DUjQiuq7.mjs +619 -0
  101. package/dist/upload-DUjQiuq7.mjs.map +1 -0
  102. package/dist/validation/index.js +1 -1
  103. package/dist/validation/index.js.map +1 -1
  104. package/dist/websocket/index.d.ts +3 -0
  105. package/dist/websocket/index.d.ts.map +1 -0
  106. package/dist/websocket/index.js +2 -0
  107. package/dist/websocket/index.js.map +1 -0
  108. package/dist/websocket/manager.d.ts +30 -0
  109. package/dist/websocket/manager.d.ts.map +1 -0
  110. package/dist/websocket/types.d.ts +27 -0
  111. package/dist/websocket/types.d.ts.map +1 -0
  112. package/package.json +58 -18
  113. package/templates/default/controllers/user.controller.ts +44 -64
  114. package/templates/default/package.json +9 -33
  115. package/templates/default/routes/index.ts +2 -12
  116. package/templates/default/routes/user.routes.ts +26 -19
  117. package/templates/default/server.ts +16 -35
  118. package/dist/logger-D7aJSi62.mjs +0 -102
  119. package/dist/logger-DEnWXtpk.js +0 -3
  120. package/dist/manager-B1UKMjXW.js +0 -4
  121. package/dist/manager-B6vqJgEn.mjs +0 -152
  122. package/dist/portal.d.ts +0 -13
  123. package/dist/portal.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DIVHd6rO.mjs","sources":["../src/i18n/locales/en.ts","../src/i18n/locales/he.ts","../src/i18n/index.ts","../src/database/schema.ts","../src/database/connection.ts","../src/database/model.ts","../src/database/index.ts"],"sourcesContent":["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","// 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 // @ts-ignore - Reserved for future use\n private _uri: string = '';\n private _options: ConnectionOptions = {};\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 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._uri = 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 // @ts-ignore - Reserved for tracking changes\n private _original: Record<string, unknown> = {};\n private _modified: Set<string> = new Set();\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 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"],"names":["en","he","locales","currentLocale","setLocale","locale","getLocale","getAvailableLocales","t","key","params","text","paramKey","value","addTranslations","translations","registerLocale","Schema","definition","options","createdAtField","updatedAtField","versionField","_","prop","prefix","path","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","error","c","session","result","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","method","validation","e","now","docData","_path","Model","collectionName","methodName","document","projection","query","id","results","d","documentsToInsert","updateDoc","replacement","pipeline","operations","indexes","indexSpecs","idx","indexName","_options","context","resolve","reject","Types","harbor"],"mappings":"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"}
package/dist/index.cjs.js CHANGED
@@ -1,24 +1,24 @@
1
- "use strict";var ie=Object.create;var q=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var de=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var ue=(r,e,t)=>e in r?q(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var he=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ce(e))!le.call(r,s)&&s!==t&&q(r,s,{get:()=>e[s],enumerable:!(n=ae(e,s))||n.enumerable});return r};var me=(r,e,t)=>(t=r!=null?ie(de(r)):{},he(e||!r||!r.__esModule?q(t,"default",{value:r,enumerable:!0}):t,r));var c=(r,e,t)=>ue(r,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const F=require("express"),fe=require("http"),$=require("fs"),D=require("path"),A=require("./logger-DEnWXtpk.js"),E=require("./validation/index.js"),ge=require("events"),v=require("mongodb"),ee=require("./manager-B1UKMjXW.js"),pe=["./harbor.config.json","./config/harbor.config.json","./.harbor/config.json"],L={PORT:"HARBOR_PORT",HOST:"HARBOR_HOST",LOG_LEVEL:"HARBOR_LOG_LEVEL",CONFIG_PATH:"HARBOR_CONFIG_PATH"},_e={GET:"GET",POST:"POST",PUT:"PUT",PATCH:"PATCH",DELETE:"DELETE",OPTIONS:"OPTIONS",HEAD:"HEAD"},p={OK:200,CREATED:201,NO_CONTENT:204,BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,CONFLICT:409,UNPROCESSABLE_ENTITY:422,TOO_MANY_REQUESTS:429,INTERNAL_SERVER_ERROR:500,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504},ye={200:"OK",201:"Created",204:"No Content",400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",409:"Conflict",422:"Unprocessable Entity",429:"Too Many Requests",500:"Internal Server Error",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout"},we={JSON:"application/json",HTML:"text/html",TEXT:"text/plain",FORM:"application/x-www-form-urlencoded",MULTIPART:"multipart/form-data"},ve={CONTENT_TYPE:"Content-Type",AUTHORIZATION:"Authorization",ACCEPT:"Accept",CACHE_CONTROL:"Cache-Control",X_REQUEST_ID:"X-Request-ID",X_RESPONSE_TIME:"X-Response-Time"},be=3e3,Te="localhost",Oe=3e4,Ce="10mb",j={server:{port:be,host:Te,cors:{enabled:!0,origin:"*",methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!1},bodyParser:{json:!0,urlencoded:!0,limit:Ce},trustProxy:!1},routes:{prefix:"",timeout:Oe,defaultMiddleware:[]},validation:{adapter:"mongoose",strictMode:!0,sanitize:!0},errors:{400:{message:"Bad Request",json:!0,log:!1},401:{message:"Unauthorized",json:!0,log:!0},403:{message:"Forbidden",json:!0,log:!0},404:{message:"Not Found",json:!0,log:!1},500:{message:"Internal Server Error",json:!0,log:!0},default:{message:"An error occurred",json:!0,log:!0}},logger:{enabled:!0,level:"info",format:"text",output:"console"}},Ee=1e4,V=A.createLogger("config");function te(r){const e=Ae(r);if(!e)return V.info("No config file found, using defaults"),G(j);try{const t=$.readFileSync(e,"utf-8"),n=JSON.parse(t),s=Y(j,n);return V.info("Config loaded",{path:e}),G(s)}catch(t){return V.error("Failed to load config",t),G(j)}}function Se(r){return Y(j,r)}function Ae(r){if(r){const t=D.resolve(process.cwd(),r);return $.existsSync(t)?t:null}const e=process.env[L.CONFIG_PATH];if(e){const t=D.resolve(process.cwd(),e);if($.existsSync(t))return t}for(const t of pe){const n=D.resolve(process.cwd(),t);if($.existsSync(n))return n}return null}function G(r){const e=process.env[L.PORT],t=process.env[L.HOST],n=process.env[L.LOG_LEVEL];return e&&(r.server.port=parseInt(e,10)),t&&(r.server.host=t),n&&(r.logger.level=n),r}function Y(r,e){const t={...r};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)){const s=e[n],o=r[n];s!==null&&typeof s=="object"&&!Array.isArray(s)&&o!==null&&typeof o=="object"&&!Array.isArray(o)?t[n]=Y(o,s):s!==void 0&&(t[n]=s)}return t}const Pe={"server.starting":"Server starting...","server.started":"Server started on http://{host}:{port}","server.stopping":"Server stopping...","server.stopped":"Server stopped","server.alreadyRunning":"Server is already running","server.error":"Server error","server.gracefulShutdown":"Received {signal}, shutting down gracefully","router.registered":"Registered route: {method} {path}","router.missingRequired":"Route must have path, method, and handler","validation.failed":"Validation failed","validation.required":"{field} is required","validation.typeMismatch":"{field} must be of type {type}","validation.minValue":"{field} must be at least {min}","validation.maxValue":"{field} must be at most {max}","validation.minLength":"{field} must be at least {min} characters","validation.maxLength":"{field} must be at most {max} characters","validation.pattern":"{field} does not match the required pattern","validation.enum":"{field} must be one of: {values}","validation.invalidObjectId":"{field} is not a valid ObjectId","validation.invalidEmail":"{field} is not a valid email address","validation.invalidUrl":"{field} is not a valid URL","validation.invalidDate":"{field} is not a valid date","validation.customFailed":"{field} failed custom validation","errors.badRequest":"Bad Request","errors.unauthorized":"Unauthorized","errors.forbidden":"Forbidden","errors.notFound":"Not Found","errors.conflict":"Conflict","errors.tooManyRequests":"Too Many Requests","errors.internal":"Internal Server Error","errors.timeout":"Request timeout","errors.default":"An error occurred","config.notFound":"No config file found, using defaults","config.loaded":"Config loaded from {path}","config.loadFailed":"Failed to load config","docker.containerStarted":"Container started: {name}","docker.containerStopped":"Container stopped: {name}","docker.containerRestarted":"Container restarted: {name}","docker.containerRemoved":"Container removed: {name}","docker.imageBuilt":"Image built: {name}:{tag}","docker.imagePushed":"Image pushed: {name}","docker.imagePulled":"Image pulled: {name}:{tag}","docker.composeUp":"Docker Compose up completed","docker.composeDown":"Docker Compose down completed","docker.commandFailed":"Docker command failed: {command}","changelog.loaded":"Changelog loaded with {count} entries","changelog.saved":"Changelog saved to {path}","changelog.released":"Released version {version}","changelog.notFound":"No changelog file found, starting fresh","portal.generated":"Portal generated at {path}","portal.generating":"Generating documentation portal...","logger.levelChanged":"Log level changed to {level}","http.request":"{method} {url} {status} {duration}ms","http.requestStart":"Incoming request: {method} {url}","http.requestEnd":"Request completed: {method} {url} - {status} in {duration}ms","cli.init.success":"Harbor project initialized!","cli.init.configExists":"harbor.config.json already exists","cli.init.created":"Created {file}","cli.docs.generating":"Generating API documentation...","cli.docs.success":"Documentation generated successfully","cli.version":"Harbor v{version}","cli.unknownCommand":"Unknown command: {command}","database.connected":"Connected to MongoDB at {uri}","database.disconnected":"Disconnected from MongoDB","database.connecting":"Connecting to MongoDB...","database.connectionFailed":"Failed to connect to MongoDB: {error}","database.notConnected":"Not connected to database. Call harbor.connect() first.","database.modelCreated":"Model created: {name}","database.documentSaved":"Document saved: {id}","database.documentDeleted":"Document deleted: {id}","database.validationFailed":"Validation failed: {errors}","database.queryExecuted":"Query executed: {operation} on {collection}","database.indexCreated":"Index created: {name}","database.transactionStarted":"Transaction started","database.transactionCommitted":"Transaction committed","database.transactionAborted":"Transaction aborted"},$e={"server.starting":"השרת מופעל...","server.started":"השרת פועל בכתובת http://{host}:{port}","server.stopping":"השרת נעצר...","server.stopped":"השרת נעצר","server.alreadyRunning":"השרת כבר פועל","server.error":"שגיאת שרת","server.gracefulShutdown":"התקבל {signal}, מכבה בצורה מסודרת","router.registered":"נרשם נתיב: {method} {path}","router.missingRequired":"נתיב חייב לכלול path, method ו-handler","validation.failed":"האימות נכשל","validation.required":"{field} הוא שדה חובה","validation.typeMismatch":"{field} חייב להיות מסוג {type}","validation.minValue":"{field} חייב להיות לפחות {min}","validation.maxValue":"{field} חייב להיות לכל היותר {max}","validation.minLength":"{field} חייב להכיל לפחות {min} תווים","validation.maxLength":"{field} חייב להכיל לכל היותר {max} תווים","validation.pattern":"{field} לא תואם לתבנית הנדרשת","validation.enum":"{field} חייב להיות אחד מ: {values}","validation.invalidObjectId":"{field} אינו ObjectId תקין","validation.invalidEmail":"{field} אינה כתובת אימייל תקינה","validation.invalidUrl":"{field} אינו URL תקין","validation.invalidDate":"{field} אינו תאריך תקין","validation.customFailed":"{field} נכשל באימות מותאם אישית","errors.badRequest":"בקשה שגויה","errors.unauthorized":"לא מורשה","errors.forbidden":"גישה נדחתה","errors.notFound":"לא נמצא","errors.conflict":"התנגשות","errors.tooManyRequests":"יותר מדי בקשות","errors.internal":"שגיאת שרת פנימית","errors.timeout":"הבקשה פגה","errors.default":"אירעה שגיאה","config.notFound":"קובץ הגדרות לא נמצא, משתמש בברירת מחדל","config.loaded":"הגדרות נטענו מ-{path}","config.loadFailed":"נכשל בטעינת הגדרות","docker.containerStarted":"קונטיינר הופעל: {name}","docker.containerStopped":"קונטיינר נעצר: {name}","docker.containerRestarted":"קונטיינר הופעל מחדש: {name}","docker.containerRemoved":"קונטיינר הוסר: {name}","docker.imageBuilt":"תמונה נבנתה: {name}:{tag}","docker.imagePushed":"תמונה הועלתה: {name}","docker.imagePulled":"תמונה הורדה: {name}:{tag}","docker.composeUp":"Docker Compose הופעל בהצלחה","docker.composeDown":"Docker Compose נעצר בהצלחה","docker.commandFailed":"פקודת Docker נכשלה: {command}","changelog.loaded":"יומן שינויים נטען עם {count} רשומות","changelog.saved":"יומן שינויים נשמר ב-{path}","changelog.released":"שוחררה גרסה {version}","changelog.notFound":"קובץ יומן שינויים לא נמצא, מתחיל מחדש","portal.generated":"פורטל נוצר ב-{path}","portal.generating":"מייצר פורטל תיעוד...","logger.levelChanged":"רמת הלוג שונתה ל-{level}","http.request":"{method} {url} {status} {duration}ms","http.requestStart":"בקשה נכנסת: {method} {url}","http.requestEnd":"בקשה הושלמה: {method} {url} - {status} תוך {duration}ms","cli.init.success":"פרויקט Harbor אותחל בהצלחה!","cli.init.configExists":"harbor.config.json כבר קיים","cli.init.created":"נוצר {file}","cli.docs.generating":"מייצר תיעוד API...","cli.docs.success":"התיעוד נוצר בהצלחה","cli.version":"Harbor גרסה {version}","cli.unknownCommand":"פקודה לא מוכרת: {command}","database.connected":"מחובר ל-MongoDB ב-{uri}","database.disconnected":"נותק מ-MongoDB","database.connecting":"מתחבר ל-MongoDB...","database.connectionFailed":"החיבור ל-MongoDB נכשל: {error}","database.notConnected":"לא מחובר למסד נתונים. קרא ל-harbor.connect() קודם.","database.modelCreated":"מודל נוצר: {name}","database.documentSaved":"מסמך נשמר: {id}","database.documentDeleted":"מסמך נמחק: {id}","database.validationFailed":"האימות נכשל: {errors}","database.queryExecuted":"שאילתה בוצעה: {operation} על {collection}","database.indexCreated":"אינדקס נוצר: {name}","database.transactionStarted":"טרנזקציה התחילה","database.transactionCommitted":"טרנזקציה אושרה","database.transactionAborted":"טרנזקציה בוטלה"},S={en:Pe,he:$e};let U="en";function Re(r){if(!S[r]){console.warn(`Locale "${r}" not found, falling back to "en"`),U="en";return}U=r}function ke(){return U}function Ie(){return Object.keys(S)}function b(r,e){let n=(S[U]??S.en)[r]??S.en[r]??r;if(e)for(const[s,o]of Object.entries(e))n=n.replace(new RegExp(`{${s}}`,"g"),String(o??""));return n}function He(r,e){S[r]||(S[r]={}),Object.assign(S[r],e)}function De(r,e){S[r]=e}const Me=A.createLogger("router");function K(r,e){const t=F.Router();return r.middleware&&r.middleware.forEach(n=>t.use(n)),r.routes&&r.routes.forEach(n=>{Ne(t,n,e)}),t}function Ne(r,e,t){const n=e.method.toLowerCase(),s=xe(e,t);r[n](e.path,...s),Me.debug(b("router.registered",{method:e.method,path:e.path}))}function xe(r,e){const t=[],n=r.options??{};return n.pre&&n.pre.forEach(s=>{t.push(Le(s))}),n.validation&&t.push(Fe(n.validation,e)),n.timeout&&t.push(Ue(n.timeout)),t.push(je(r.handler,n)),t}function Le(r){return async(e,t,n)=>{try{await r(e,t,n)}catch(s){n(s)}}}function je(r,e){return async(t,n,s)=>{try{const o=await r(t,n);if(e.post&&e.post.length>0)for(const i of e.post)await i(t,n,o);!n.headersSent&&o!==void 0&&n.json({success:!0,data:o})}catch(o){s(o)}}}function Fe(r,e){return async(t,n,s)=>{try{const o={};if(r.params){const i=await E.validateRequest(r.params,t.params,e.validation);if(!i.valid){n.status(p.BAD_REQUEST).json({success:!1,error:{message:b("validation.failed"),details:i.errors}});return}o.params=i.data}if(r.query){const i=await E.validateRequest(r.query,t.query,e.validation);if(!i.valid){n.status(p.BAD_REQUEST).json({success:!1,error:{message:b("validation.failed"),details:i.errors}});return}o.query=i.data}if(r.body){const i=await E.validateRequest(r.body,t.body,e.validation);if(!i.valid){n.status(p.BAD_REQUEST).json({success:!1,error:{message:b("validation.failed"),details:i.errors}});return}o.body=i.data}t.validated=o,s()}catch(o){s(o)}}}function Ue(r){return(e,t,n)=>{const s=setTimeout(()=>{t.headersSent||t.status(p.GATEWAY_TIMEOUT).json({success:!1,error:{message:b("errors.timeout")}})},r);t.on("finish",()=>clearTimeout(s)),t.on("close",()=>clearTimeout(s)),n()}}function Be(r,e,t){return R("GET",r,e,t)}function qe(r,e,t){return R("POST",r,e,t)}function Ve(r,e,t){return R("PUT",r,e,t)}function Ge(r,e,t){return R("PATCH",r,e,t)}function ze(r,e,t){return R("DELETE",r,e,t)}function Ke(r,e,t,n){return R(r,e,t,n)}function R(r,e,t,n){return{path:e,method:r,handler:t,options:n?{pre:n.pre,post:n.post,validation:n.validation,timeout:n.timeout}:void 0}}class W{constructor(){c(this,"_route",{});c(this,"_options",{})}static create(){return new W}path(e){return this._route.path=e,this}method(e){return this._route.method=e,this}get(e){return this.method("GET").path(e)}post(e){return this.method("POST").path(e)}put(e){return this.method("PUT").path(e)}patch(e){return this.method("PATCH").path(e)}delete(e){return this.method("DELETE").path(e)}handler(e){if(this._route.handler=e,!this._route.path||!this._route.method||!this._route.handler)throw new Error(b("router.missingRequired"));return{path:this._route.path,method:this._route.method,handler:this._route.handler,options:Object.keys(this._options).length>0?this._options:void 0}}pre(...e){return this._options.pre=[...this._options.pre??[],...e],this}postFn(...e){return this._options.post=[...this._options.post??[],...e],this}validate(e){return this._options.validation=e,this}timeout(e){return this._options.timeout=e,this}rateLimit(e){return this._options.rateLimit=e,this}auth(e){return this._options.auth=e,this}cache(e){return this._options.cache=e,this}build(){if(!this._route.path||!this._route.method||!this._route.handler)throw new Error(b("router.missingRequired"));return{path:this._route.path,method:this._route.method,handler:this._route.handler,options:Object.keys(this._options).length>0?this._options:void 0}}}const Qe=A.createLogger("error");class O extends Error{constructor(t,n=p.INTERNAL_SERVER_ERROR,s){super(t);c(this,"statusCode");c(this,"code");c(this,"details");c(this,"isOperational");this.name="HarborError",this.statusCode=n,this.code=s==null?void 0:s.code,this.details=s==null?void 0:s.details,this.isOperational=(s==null?void 0:s.isOperational)??!0,Error.captureStackTrace(this,this.constructor)}static badRequest(t,n){return new O(t??"Bad Request",p.BAD_REQUEST,{code:"BAD_REQUEST",details:n})}static unauthorized(t){return new O(t??"Unauthorized",p.UNAUTHORIZED,{code:"UNAUTHORIZED"})}static forbidden(t){return new O(t??"Forbidden",p.FORBIDDEN,{code:"FORBIDDEN"})}static notFound(t){return new O(t??"Not Found",p.NOT_FOUND,{code:"NOT_FOUND"})}static conflict(t,n){return new O(t??"Conflict",p.CONFLICT,{code:"CONFLICT",details:n})}static internal(t){return new O(t??"Internal Server Error",p.INTERNAL_SERVER_ERROR,{code:"INTERNAL_ERROR",isOperational:!1})}static tooManyRequests(t){return new O(t??"Too Many Requests",p.TOO_MANY_REQUESTS,{code:"RATE_LIMIT_EXCEEDED"})}toJSON(){return{success:!1,error:{message:this.message,code:this.code,statusCode:this.statusCode,details:this.details}}}}function ne(r){const e=r.errors;return(t,n,s,o)=>{const i=t.statusCode??p.INTERNAL_SERVER_ERROR,a=Ye(i,e);if((a==null?void 0:a.log)!==!1&&r.logger.enabled&&Qe.error(`${n.method} ${n.path} - ${t.message}`,t),s.headersSent)return;if(a!=null&&a.redirect){s.redirect(a.redirect);return}const h=We(t,i,a);(a==null?void 0:a.json)!==!1?s.status(i).json(h):s.status(i).send(h.error.message)}}function Ye(r,e){const t=r.toString();return e[t]??e.default}function We(r,e,t){return r instanceof O?r.toJSON():{success:!1,error:{message:(t==null?void 0:t.message)??r.message??ye[e]??"An error occurred",statusCode:e}}}const P=A.createLogger("server");function Xe(r={}){const e=te(r.configPath),t=F();let n=null,s="stopped",o=null;const i=[];Je(t,e);const a={app:t,server:n,config:e,async start(){if(s==="running")return P.warn("Server is already running"),a.getInfo();s="starting";const h=r.port??e.server.port,g=r.host??e.server.host??"localhost";return new Promise((w,T)=>{try{n=fe.createServer(t),a.server=n,n.listen(h,g,()=>{var l;s="running",o=new Date;const d=a.getInfo();P.info(`Server started on http://${g}:${h}`),(l=r.onReady)==null||l.call(r,d),w(d)}),n.on("error",d=>{var l;s="error",P.error("Server error",d),(l=r.onError)==null||l.call(r,d),T(d)}),tt(a)}catch(d){s="error",T(d)}})},async stop(){if(!(!n||s==="stopped"))return s="stopping",new Promise((h,g)=>{const w=setTimeout(()=>{n==null||n.close(),h()},Ee);n.close(T=>{clearTimeout(w),T?(P.error("Error stopping server",T),g(T)):(s="stopped",o=null,P.info("Server stopped"),h())})})},async restart(){return await a.stop(),a.start()},addRoute(h){i.push(h);const g=K({routes:[h]},e);t.use(g)},addRouteGroup(h){i.push(...h.routes);const g=K({prefix:h.prefix,routes:h.routes,middleware:h.middleware},e);t.use(h.prefix,g)},addMiddleware(h){t.use(h)},getInfo(){const h=r.port??e.server.port,g=r.host??e.server.host??"localhost";return{port:h,host:g,uptime:o?Date.now()-o.getTime():0,startedAt:o,routes:i.map(w=>({path:w.path,method:w.method,middleware:[]})),status:s}}};return r.autoStart!==!1&&a.start().catch(h=>{P.error("Failed to auto-start server",h)}),a}function Je(r,e){var n,s,o;(n=e.server.bodyParser)!=null&&n.json&&r.use(F.json({limit:e.server.bodyParser.limit})),(s=e.server.bodyParser)!=null&&s.urlencoded&&r.use(F.urlencoded({extended:!0,limit:e.server.bodyParser.limit})),(o=e.server.cors)!=null&&o.enabled&&r.use(Ze(e.server.cors)),r.use(et());const t=ne(e);r.use(t)}function Ze(r){return(e,t,n)=>{var o;const s=r.origin;if(s===!0||s==="*")t.setHeader("Access-Control-Allow-Origin","*");else if(typeof s=="string")t.setHeader("Access-Control-Allow-Origin",s);else if(Array.isArray(s)){const i=e.headers.origin;i&&s.includes(i)&&t.setHeader("Access-Control-Allow-Origin",i)}if(t.setHeader("Access-Control-Allow-Methods",((o=r.methods)==null?void 0:o.join(", "))??"GET,POST,PUT,PATCH,DELETE,OPTIONS"),r.allowedHeaders?t.setHeader("Access-Control-Allow-Headers",r.allowedHeaders.join(", ")):t.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),r.credentials&&t.setHeader("Access-Control-Allow-Credentials","true"),e.method==="OPTIONS"){t.status(204).end();return}n()}}function et(){return(r,e,t)=>{r.startTime=Date.now(),r.harborContext={},e.success=function(n,s=200){e.status(s).json({success:!0,data:n})},e.error=function(n,s=500,o){e.status(s).json({success:!1,error:{message:n,details:o}})},t()}}function tt(r){["SIGTERM","SIGINT"].forEach(t=>{process.on(t,async()=>{P.info(`Received ${t}, shutting down gracefully`),await r.stop(),process.exit(0)})})}class X{constructor(e,t){c(this,"_definition");c(this,"_options");c(this,"_paths",new Map);c(this,"_virtuals",new Map);c(this,"_methods",new Map);c(this,"_statics",new Map);c(this,"_preHooks",new Map);c(this,"_postHooks",new Map);c(this,"_indexes",[]);c(this,"_plugins",[]);c(this,"methods",{});c(this,"statics",{});c(this,"virtuals",{});if(this._definition=e,this._options={timestamps:!1,strict:!0,strictQuery:!1,_id:!0,id:!0,versionKey:"__v",autoIndex:!0,autoCreate:!0,minimize:!0,...t},this._parseDefinition(e),this._options._id&&this._paths.set("_id",{type:"ObjectId",required:!1}),this._options.timestamps){const n=typeof this._options.timestamps=="object"?this._options.timestamps.createdAt===!1?null:this._options.timestamps.createdAt||"createdAt":"createdAt",s=typeof this._options.timestamps=="object"?this._options.timestamps.updatedAt===!1?null:this._options.timestamps.updatedAt||"updatedAt":"updatedAt";n&&this._paths.set(n,{type:"Date",required:!1}),s&&this._paths.set(s,{type:"Date",required:!1})}if(this._options.versionKey){const n=typeof this._options.versionKey=="string"?this._options.versionKey:"__v";this._paths.set(n,{type:"Number",default:0})}this.methods=new Proxy({},{set:(n,s,o)=>(this._methods.set(s,o),!0),get:(n,s)=>this._methods.get(s)}),this.statics=new Proxy({},{set:(n,s,o)=>(this._statics.set(s,o),!0),get:(n,s)=>this._statics.get(s)})}_parseDefinition(e,t=""){for(const[n,s]of Object.entries(e)){const o=t?`${t}.${n}`:n;if(typeof s=="string")this._paths.set(o,{type:s});else if(typeof s=="object"&&s!==null){const i=s;"type"in i?typeof i.type=="string"?this._paths.set(o,i):Array.isArray(i.type)?this._paths.set(o,{...i,type:"Array"}):typeof i.type=="object"&&(this._paths.set(o,{type:"Object"}),this._parseDefinition(i.type,o)):(this._paths.set(o,{type:"Object"}),this._parseDefinition(s,o))}}}add(e,t){return this._parseDefinition(e,t),this}path(e){return this._paths.get(e)}paths(){return this._paths}virtual(e){return new nt(this,e)}method(e,t){return this._methods.set(e,t),this}static(e,t){return this._statics.set(e,t),this}pre(e,t){const n=Array.isArray(e)?e:[e];for(const s of n){const o=this._preHooks.get(s)||[];o.push(t),this._preHooks.set(s,o)}return this}post(e,t){const n=Array.isArray(e)?e:[e];for(const s of n){const o=this._postHooks.get(s)||[];o.push(t),this._postHooks.set(s,o)}return this}index(e,t){return this._indexes.push({fields:e,options:t}),this}plugin(e,t){return this._plugins.push({fn:e,options:t}),e(this,t),this}loadClass(e){const t=e.prototype;for(const n of Object.getOwnPropertyNames(t)){if(n==="constructor")continue;const s=Object.getOwnPropertyDescriptor(t,n);if(s!=null&&s.get)this._virtuals.set(n,{get:s.get});else if(s!=null&&s.set){const o=this._virtuals.get(n)||{};this._virtuals.set(n,{...o,set:s.set})}else typeof(s==null?void 0:s.value)=="function"&&this._methods.set(n,s.value)}for(const n of Object.getOwnPropertyNames(e)){if(["length","prototype","name"].includes(n))continue;const s=e[n];typeof s=="function"&&this._statics.set(n,s)}return this}clone(){const e=new X({},this._options);return e._paths=new Map(this._paths),e._virtuals=new Map(this._virtuals),e._methods=new Map(this._methods),e._statics=new Map(this._statics),e._preHooks=new Map(this._preHooks),e._postHooks=new Map(this._postHooks),e._indexes=[...this._indexes],e}get options(){return this._options}get definition(){return this._definition}getMethods(){return this._methods}getStatics(){return this._statics}getVirtuals(){return this._virtuals}getPreHooks(){return this._preHooks}getPostHooks(){return this._postHooks}getIndexes(){return this._indexes}async validate(e){const t=[];for(const[n,s]of this._paths){const o=this._getNestedValue(e,n),i=await this._validateField(n,o,s);t.push(...i)}return t.length>0?{valid:!1,errors:t}:{valid:!0}}_getNestedValue(e,t){return t.split(".").reduce((n,s)=>n==null?void 0:n[s],e)}async _validateField(e,t,n){const s=[];return n.required&&t==null?(s.push({path:e,message:`${e} is required`}),s):t==null?s:this._validateType(t,n.type)?(n.type==="String"&&typeof t=="string"&&(n.minLength&&t.length<n.minLength&&s.push({path:e,message:`${e} must be at least ${n.minLength} characters`}),n.maxLength&&t.length>n.maxLength&&s.push({path:e,message:`${e} must be at most ${n.maxLength} characters`}),n.match&&!n.match.test(t)&&s.push({path:e,message:`${e} does not match required pattern`}),n.enum&&!n.enum.includes(t)&&s.push({path:e,message:`${e} must be one of: ${n.enum.join(", ")}`})),n.type==="Number"&&typeof t=="number"&&(n.min!==void 0&&t<n.min&&s.push({path:e,message:`${e} must be at least ${n.min}`}),n.max!==void 0&&t>n.max&&s.push({path:e,message:`${e} must be at most ${n.max}`})),n.validate&&(await n.validate.validator(t)||s.push({path:e,message:n.validate.message||`${e} failed validation`})),s):(s.push({path:e,message:`${e} must be of type ${n.type}`}),s)}_validateType(e,t){switch(t){case"String":return typeof e=="string";case"Number":return typeof e=="number"&&!isNaN(e);case"Boolean":return typeof e=="boolean";case"Date":return e instanceof Date||typeof e=="string"&&!isNaN(Date.parse(e));case"ObjectId":return typeof e=="string"&&/^[0-9a-fA-F]{24}$/.test(e);case"Array":return Array.isArray(e);case"Object":case"Mixed":return typeof e=="object"&&e!==null;case"Buffer":return Buffer.isBuffer(e);default:return!0}}transformValue(e,t){const n=this._paths.get(e);if(!n||typeof t!="string")return t;let s=t;return n.lowercase&&(s=s.toLowerCase()),n.uppercase&&(s=s.toUpperCase()),n.trim&&(s=s.trim()),s}getDefault(e){const t=this._paths.get(e);if(!(!t||t.default===void 0))return typeof t.default=="function"?t.default():t.default}}class nt{constructor(e,t){c(this,"schema");c(this,"name");this.schema=e,this.name=t}get(e){const t=this.schema.getVirtuals(),n=t.get(this.name)||{};return t.set(this.name,{...n,get:e}),this}set(e){const t=this.schema.getVirtuals(),n=t.get(this.name)||{};return t.set(this.name,{...n,set:e}),this}}class rt extends ge.EventEmitter{constructor(){super(...arguments);c(this,"_state",{connected:!1,readyState:0});c(this,"_options",{});c(this,"_connectionUri","");c(this,"_mongoClient",null);c(this,"_db",null);c(this,"_models",new Map)}get readyState(){return this._state.readyState}get host(){return this._state.host}get port(){return this._state.port}get name(){return this._state.name}get db(){return this._db}get client(){return this._mongoClient}get models(){return this._models}get uri(){return this._connectionUri}async connect(t,n){if(this._state.readyState===1)return console.warn("[Harbor] Already connected to MongoDB"),this;this._connectionUri=t,this._options={maxPoolSize:10,minPoolSize:1,serverSelectionTimeoutMS:3e4,socketTimeoutMS:45e3,retryWrites:!0,w:"majority",...n},this._state.readyState=2,this.emit("connecting");try{const{MongoClient:s}=await import("mongodb");this._mongoClient=new s(t,this._options),await this._mongoClient.connect();const o=new URL(t),i=o.pathname.slice(1)||"test";return this._db=this._mongoClient.db(i),this._state={connected:!0,readyState:1,host:o.hostname,port:parseInt(o.port)||27017,name:i},this.emit("connected"),this.emit("open"),console.log(`[Harbor] ${b("database.connected",{uri:`${o.hostname}:${o.port}/${i}`})}`),this}catch(s){throw this._state.readyState=0,this.emit("error",s),s}}async disconnect(){if(this._state.readyState===0){console.warn("[Harbor] Already disconnected from MongoDB");return}this._state.readyState=3,this.emit("disconnecting");try{this._mongoClient&&await this._mongoClient.close(),this._state={connected:!1,readyState:0},this._mongoClient=null,this._db=null,this.emit("disconnected"),this.emit("close"),console.log(`[Harbor] ${b("database.disconnected")}`)}catch(t){throw this.emit("error",t),t}}async close(){return this.disconnect()}async ping(){if(!this._db)return!1;try{return await this._db.command({ping:1}),!0}catch{return!1}}collection(t){if(!this._db)throw new Error("[Harbor] Not connected to database");return this._db.collection(t)}async createCollection(t,n){if(!this._db)throw new Error("[Harbor] Not connected to database");return this._db.createCollection(t,n)}async dropCollection(t){if(!this._db)throw new Error("[Harbor] Not connected to database");return this._db.dropCollection(t)}async listCollections(){if(!this._db)throw new Error("[Harbor] Not connected to database");return(await this._db.listCollections().toArray()).map(n=>n.name)}async dropDatabase(){if(!this._db)throw new Error("[Harbor] Not connected to database");return this._db.dropDatabase()}async startSession(){if(!this._mongoClient)throw new Error("[Harbor] Not connected to database");return this._mongoClient.startSession()}async withTransaction(t,n){const s=await this.startSession();try{let o;return await s.withTransaction(async()=>{o=await t(s)},n),o}finally{await s.endSession()}}on(t,n){return super.on(t,n)}once(t,n){return super.once(t,n)}}const M=new rt;async function st(r,e){return M.connect(r,e)}async function ot(){return M.disconnect()}var Z;Z=Symbol.toStringTag;class H{constructor(e,t,n,s){c(this,"_model");c(this,"_operation");c(this,"_filter",{});c(this,"_projection",null);c(this,"_options",{});c(this,"_update",null);c(this,"_currentPath",null);c(this,Z,"Query");this._model=e,this._operation=t,this._filter=n||{},this._update=s||null}select(e){if(typeof e=="string"){this._projection={};for(const t of e.split(" "))t.startsWith("-")?this._projection[t.slice(1)]=0:t&&(this._projection[t]=1)}else this._projection=e;return this}sort(e){if(typeof e=="string"){const t={};for(const n of e.split(" "))n.startsWith("-")?t[n.slice(1)]=-1:n&&(t[n]=1);this._options.sort=t}else this._options.sort=e;return this}limit(e){return this._options.limit=e,this}skip(e){return this._options.skip=e,this}lean(){return this._options.lean=!0,this}populate(e){return this._options.populate=e,this}where(e,t){return this._currentPath=e,t!==void 0&&(this._filter[e]=t),this}equals(e){return this._currentPath&&(this._filter[this._currentPath]=e),this}gt(e){return this._currentPath&&(this._filter[this._currentPath]={...this._filter[this._currentPath],$gt:e}),this}gte(e){return this._currentPath&&(this._filter[this._currentPath]={...this._filter[this._currentPath],$gte:e}),this}lt(e){return this._currentPath&&(this._filter[this._currentPath]={...this._filter[this._currentPath],$lt:e}),this}lte(e){return this._currentPath&&(this._filter[this._currentPath]={...this._filter[this._currentPath],$lte:e}),this}in(e){return this._currentPath&&(this._filter[this._currentPath]={$in:e}),this}nin(e){return this._currentPath&&(this._filter[this._currentPath]={$nin:e}),this}ne(e){return this._currentPath&&(this._filter[this._currentPath]={$ne:e}),this}regex(e){return this._currentPath&&(this._filter[this._currentPath]={$regex:e}),this}exists(e=!0){return this._currentPath&&(this._filter[this._currentPath]={$exists:e}),this}or(e){return this._filter.$or=e,this}and(e){return this._filter.$and=e,this}nor(e){return this._filter.$nor=e,this}async exec(){const e=this._model.getCollection();switch(this._operation){case"find":{let t=e.find(this._filter,{projection:this._projection});this._options.sort&&(t=t.sort(this._options.sort)),this._options.skip&&(t=t.skip(this._options.skip)),this._options.limit&&(t=t.limit(this._options.limit));const n=await t.toArray();return this._options.lean?n:n.map(s=>this._model.hydrate(s))}case"findOne":{const t=await e.findOne(this._filter,{projection:this._projection});return t?this._options.lean?t:this._model.hydrate(t):null}case"findOneAndUpdate":{const t=await e.findOneAndUpdate(this._filter,this._update,{returnDocument:this._options.new?"after":"before",upsert:this._options.upsert,projection:this._projection});return t?this._options.lean?t:this._model.hydrate(t):null}case"findOneAndDelete":{const t=await e.findOneAndDelete(this._filter,{projection:this._projection});return t?this._options.lean?t:this._model.hydrate(t):null}default:throw new Error(`Unknown operation: ${this._operation}`)}}then(e,t){return this.exec().then(e,t)}catch(e){return this.exec().catch(e)}finally(e){return this.exec().finally(e)}}class Q{constructor(e,t){c(this,"_id");c(this,"__v");c(this,"isNew",!0);c(this,"_model");c(this,"_modified",new Set);c(this,"_original",{});var s;if(this._model=e,this._id=((s=t==null?void 0:t._id)==null?void 0:s.toString())||new v.ObjectId().toString(),t){for(const[o,i]of Object.entries(t))o==="_id"?this._id=(i==null?void 0:i.toString())||this._id:this[o]=i;this._original={...t},this.isNew=!1}const n=e.schema;for(const[o]of n.paths())if(this[o]===void 0){const i=n.getDefault(o);i!==void 0&&(this[o]=i)}for(const[o,i]of n.getVirtuals())Object.defineProperty(this,o,{get:i.get,set:i.set,enumerable:!0});for(const[o,i]of n.getMethods())this[o]=i.bind(this)}get original(){return this._original}get id(){return this._id}isModified(e){return e?this._modified.has(e):this._modified.size>0}markModified(e){this._modified.add(e)}async save(){var i;const e=this._model.schema;await this._model.runPreHooks("save",this);const t=await e.validate(this.toObject());if(!t.valid){const a=new Error(`Validation failed: ${(i=t.errors)==null?void 0:i.map(h=>h.message).join(", ")}`);throw a.errors=t.errors,a}const n=new Date;if(e.options.timestamps){const a=typeof e.options.timestamps=="object"&&e.options.timestamps.createdAt||"createdAt",h=typeof e.options.timestamps=="object"&&e.options.timestamps.updatedAt||"updatedAt";this.isNew&&a&&(this[a]=n),this[h]=n}const s=this._model.getCollection(),o=this.toObject();if(this.isNew)await s.insertOne({_id:new v.ObjectId(this._id),...o}),this.isNew=!1;else{if(e.options.versionKey){const a=typeof e.options.versionKey=="string"?e.options.versionKey:"__v";this[a]=(this[a]||0)+1}await s.replaceOne({_id:new v.ObjectId(this._id)},o)}return this._original={...o},this._modified.clear(),await this._model.runPostHooks("save",this),this}async remove(){return await this._model.runPreHooks("remove",this),await this._model.getCollection().deleteOne({_id:new v.ObjectId(this._id)}),await this._model.runPostHooks("remove",this),this}async deleteOne(){await this._model.runPreHooks("deleteOne",this);const t=await this._model.getCollection().deleteOne({_id:new v.ObjectId(this._id)});return await this._model.runPostHooks("deleteOne",this),{acknowledged:t.acknowledged,deletedCount:t.deletedCount}}async updateOne(e){await this._model.runPreHooks("updateOne",this);const n=await this._model.getCollection().updateOne({_id:new v.ObjectId(this._id)},e);return await this._model.runPostHooks("updateOne",this),{acknowledged:n.acknowledged,modifiedCount:n.modifiedCount,matchedCount:n.matchedCount}}async populate(e){return this}toObject(){const e={_id:this._id},t=this._model.schema;for(const[n]of t.paths())n!=="_id"&&this[n]!==void 0&&(e[n]=this[n]);return e}toJSON(){return this.toObject()}}const B=class B{constructor(e,t,n){c(this,"_name");c(this,"_schema");c(this,"_collectionName");this._name=e,this._schema=t,this._collectionName=n||e.toLowerCase()+"s";for(const[s,o]of t.getStatics())this[s]=o.bind(this);B.models.set(e,this)}get modelName(){return this._name}get schema(){return this._schema}get collection(){return{name:this._collectionName}}getCollection(){if(!M.db)throw new Error("[Harbor] Not connected to database. Call harbor.connect() first.");return M.db.collection(this._collectionName)}new(e){return new Q(this,e)}hydrate(e){const t=new Q(this,e);return t.isNew=!1,t}find(e,t,n){const s=new H(this,"find",e);return t&&s.select(t),n!=null&&n.sort&&s.sort(n.sort),n!=null&&n.limit&&s.limit(n.limit),n!=null&&n.skip&&s.skip(n.skip),n!=null&&n.lean&&s.lean(),s}findOne(e,t,n){const s=new H(this,"findOne",e);return t&&s.select(t),n!=null&&n.lean&&s.lean(),s}findById(e,t,n){return this.findOne({_id:new v.ObjectId(e)},t,n)}async create(e){if(Array.isArray(e)){const n=[];for(const s of e){const o=this.new(s);await o.save(),n.push(o)}return n}const t=this.new(e);return await t.save(),t}async insertMany(e,t){const n=this.getCollection(),s=e.map(i=>({_id:new v.ObjectId,...i})),o=await n.insertMany(s,{ordered:(t==null?void 0:t.ordered)??!0});return{insertedCount:o.insertedCount,insertedIds:Object.values(o.insertedIds).map(i=>i.toString())}}async updateOne(e,t,n){var a;await this.runPreHooks("updateOne",null);const s=this.getCollection(),o=t.$set||t.$unset||t.$inc?t:{$set:t},i=await s.updateOne(e,o,{upsert:n==null?void 0:n.upsert});return await this.runPostHooks("updateOne",null),{acknowledged:i.acknowledged,modifiedCount:i.modifiedCount,matchedCount:i.matchedCount,upsertedCount:i.upsertedCount,upsertedId:(a=i.upsertedId)==null?void 0:a.toString()}}async updateMany(e,t,n){await this.runPreHooks("updateMany",null);const s=this.getCollection(),o=t.$set||t.$unset||t.$inc?t:{$set:t},i=await s.updateMany(e,o,{upsert:n==null?void 0:n.upsert});return await this.runPostHooks("updateMany",null),{acknowledged:i.acknowledged,modifiedCount:i.modifiedCount,matchedCount:i.matchedCount}}findOneAndUpdate(e,t,n){const s=new H(this,"findOneAndUpdate",e,t);return n!=null&&n.new&&(s._options.new=!0),n!=null&&n.upsert&&(s._options.upsert=!0),n!=null&&n.lean&&s.lean(),s}findByIdAndUpdate(e,t,n){return this.findOneAndUpdate({_id:new v.ObjectId(e)},t,n)}async replaceOne(e,t,n){const o=await this.getCollection().replaceOne(e,t,{upsert:n==null?void 0:n.upsert});return{acknowledged:o.acknowledged,modifiedCount:o.modifiedCount,matchedCount:o.matchedCount}}async deleteOne(e){await this.runPreHooks("deleteOne",null);const n=await this.getCollection().deleteOne(e);return await this.runPostHooks("deleteOne",null),{acknowledged:n.acknowledged,deletedCount:n.deletedCount}}async deleteMany(e){await this.runPreHooks("deleteMany",null);const n=await this.getCollection().deleteMany(e);return await this.runPostHooks("deleteMany",null),{acknowledged:n.acknowledged,deletedCount:n.deletedCount}}findOneAndDelete(e,t){const n=new H(this,"findOneAndDelete",e);return t!=null&&t.lean&&n.lean(),n}findByIdAndDelete(e,t){return this.findOneAndDelete({_id:new v.ObjectId(e)},t)}async countDocuments(e){return this.getCollection().countDocuments(e||{})}async estimatedDocumentCount(){return this.getCollection().estimatedDocumentCount()}async aggregate(e,t){return this.getCollection().aggregate(e,t).toArray()}async distinct(e,t){return this.getCollection().distinct(e,t||{})}async exists(e){const t=await this.findOne(e).select({_id:1}).lean();return t?{_id:t._id.toString()}:null}async bulkWrite(e){const n=await this.getCollection().bulkWrite(e);return{ok:n.ok,insertedCount:n.insertedCount,matchedCount:n.matchedCount,modifiedCount:n.modifiedCount,deletedCount:n.deletedCount,upsertedCount:n.upsertedCount,insertedIds:n.insertedIds||{},upsertedIds:n.upsertedIds||{}}}async createIndex(e,t){return this.getCollection().createIndex(e,t)}async createIndexes(e){const t=this.getCollection(),n=e.map(s=>({key:s.fields,...s.options}));return t.createIndexes(n)}async listIndexes(){return this.getCollection().listIndexes().toArray()}async dropIndex(e){await this.getCollection().dropIndex(e)}async populate(e,t){return e}watch(e,t){return this.getCollection().watch(e,t)}async runPreHooks(e,t){const n=this._schema.getPreHooks().get(e)||[];for(const s of n)await new Promise((o,i)=>{try{const a=s.call(t,o);a instanceof Promise&&a.then(o).catch(i)}catch(a){i(a)}})}async runPostHooks(e,t){const n=this._schema.getPostHooks().get(e)||[];for(const s of n)await new Promise((o,i)=>{try{const a=s.call(t,o);a instanceof Promise&&a.then(o).catch(i)}catch(a){i(a)}})}};c(B,"models",new Map);let N=B;function it(r,e,t){const n=N.models.get(r);return n||new N(r,e,t)}const at={ObjectId:v.ObjectId},I=A.createLogger("changelog"),ct={filePath:"./CHANGELOG.md",format:"markdown",includeUnreleased:!0};function re(r={}){const e={...ct,...r},t=[];let n=[];function s(){const d=D.resolve(process.cwd(),e.filePath);if(!$.existsSync(d)){I.info("No changelog file found, starting fresh");return}try{const l=$.readFileSync(d,"utf-8");o(l),I.info("Changelog loaded",{entries:t.length})}catch(l){I.error("Failed to load changelog",l)}}function o(d){const l=/## \[(\d+\.\d+\.\d+(?:-[\w.]+)?)\](?: - (\d{4}-\d{2}-\d{2}))?/g,u=d.split(l);for(let f=1;f<u.length;f+=3){const m=u[f],C=u[f+1],y=u[f+2];if(m&&y){const k={version:m,date:C?new Date(C):new Date,changes:i(y)};t.push(k)}}}function i(d){const l=[],u=d.split(`
2
- `);let f=null;for(const m of u){const C=m.match(/^### (Added|Changed|Deprecated|Removed|Fixed|Security)/i);if(C){f=C[1].toLowerCase();continue}const y=m.match(/^- (.+)/);y&&f&&l.push({type:f,description:y[1].trim()})}return l}function a(){const d=D.resolve(process.cwd(),e.filePath),l=h();$.writeFileSync(d,l,"utf-8"),I.info("Changelog saved",{path:d})}function h(){let d=`# Changelog
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("express"),V=require("http"),P=require("fs"),b=require("path"),_=require("./logger-D-lfaRWQ.js"),w=require("./validation/index.js"),p=require("./http.const-Ckcy7OFp.js"),f=require("./index-Ca4WpLvw.js"),m=require("./upload-9lCNnKK_.js"),K=require("./websocket/index.js"),z=require("./scheduler/index.js"),H=require("./cache/index.js"),R=require("./password-BXBkKbv3.js"),Q=require("./manager-DrF1vbJg.js"),re=["./harbor.config.json","./config/harbor.config.json","./.harbor/config.json"],D={PORT:"HARBOR_PORT",HOST:"HARBOR_HOST",LOG_LEVEL:"HARBOR_LOG_LEVEL",CONFIG_PATH:"HARBOR_CONFIG_PATH"},oe=3e3,se="localhost",ne=3e4,ae="10mb",F={server:{port:oe,host:se,cors:{enabled:!0,origin:"*",methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!1},bodyParser:{json:!0,urlencoded:!0,limit:ae},trustProxy:!1},routes:{prefix:"",timeout:ne,defaultMiddleware:[]},validation:{adapter:"mongoose",strictMode:!0,sanitize:!0},errors:{400:{message:"Bad Request",json:!0,log:!1},401:{message:"Unauthorized",json:!0,log:!0},403:{message:"Forbidden",json:!0,log:!0},404:{message:"Not Found",json:!0,log:!1},500:{message:"Internal Server Error",json:!0,log:!0},default:{message:"An error occurred",json:!0,log:!0}},logger:{enabled:!0,level:"info",format:"text",output:"console"}},ie=1e4,I=_.createLogger("config");function J(e){const t=ue(e);if(!t)return I.info("No config file found, using defaults"),k(F);try{const r=P.readFileSync(t,"utf-8"),o=JSON.parse(r),s=B(F,o);return I.info("Config loaded",{path:t}),k(s)}catch(r){return I.error("Failed to load config",r),k(F)}}function ce(e){return B(F,e)}function ue(e){if(e){const r=b.resolve(process.cwd(),e);return P.existsSync(r)?r:null}const t=process.env[D.CONFIG_PATH];if(t){const r=b.resolve(process.cwd(),t);if(P.existsSync(r))return r}for(const r of re){const o=b.resolve(process.cwd(),r);if(P.existsSync(o))return o}return null}function k(e){const t=process.env[D.PORT],r=process.env[D.HOST],o=process.env[D.LOG_LEVEL];return t&&(e.server.port=parseInt(t,10)),r&&(e.server.host=r),o&&(e.logger.level=o),e}function B(e,t){const r={...e};for(const o in t)if(Object.prototype.hasOwnProperty.call(t,o)){const s=t[o],n=e[o];s!==null&&typeof s=="object"&&!Array.isArray(s)&&n!==null&&typeof n=="object"&&!Array.isArray(n)?r[o]=B(n,s):s!==void 0&&(r[o]=s)}return r}const Y=_.createLogger("router");function j(e,t){const r=L.Router();return e.middleware&&e.middleware.forEach(o=>r.use(o)),e.routes&&e.routes.forEach(o=>{de(r,o,t)}),r}function de(e,t,r){const o=t.method.toLowerCase(),s=le(t,r);e[o](t.path,...s),Y.debug(f.t("router.registered",{method:t.method,path:t.path}))}function le(e,t){const r=[],o=e.options??{};return o.pre&&o.pre.forEach(s=>{r.push(Z(s))}),o.validation&&r.push(ge(o.validation,t)),o.timeout&&r.push(fe(o.timeout)),r.push(he(e.handler,o)),r}function Z(e){return async(t,r,o)=>{try{await e(t,r,o)}catch(s){o(s)}}}function he(e,t){return async(r,o,s)=>{try{const n=await e(r,o);if(t.post&&t.post.length>0)for(const c of t.post)await c(r,o,n);!o.headersSent&&n!==void 0&&o.json({success:!0,data:n})}catch(n){s(n)}}}function ge(e,t){return async(r,o,s)=>{try{const n={};if(e.params){const c=await w.validateRequest(e.params,r.params,t.validation);if(!c.valid){o.status(p.HTTP_STATUS.BAD_REQUEST).json({success:!1,error:{message:f.t("validation.failed"),details:c.errors}});return}n.params=c.data}if(e.query){const c=await w.validateRequest(e.query,r.query,t.validation);if(!c.valid){o.status(p.HTTP_STATUS.BAD_REQUEST).json({success:!1,error:{message:f.t("validation.failed"),details:c.errors}});return}n.query=c.data}if(e.body){const c=await w.validateRequest(e.body,r.body,t.validation);if(!c.valid){o.status(p.HTTP_STATUS.BAD_REQUEST).json({success:!1,error:{message:f.t("validation.failed"),details:c.errors}});return}n.body=c.data}r.validated=n,s()}catch(n){s(n)}}}function fe(e){return(t,r,o)=>{const s=setTimeout(()=>{r.headersSent||r.status(p.HTTP_STATUS.GATEWAY_TIMEOUT).json({success:!1,error:{message:f.t("errors.timeout")}})},e);r.on("finish",()=>clearTimeout(s)),r.on("close",()=>clearTimeout(s)),o()}}function pe(e,t,r){const o=L.Router();r?.middleware&&r.middleware.forEach(n=>o.use(n)),t.forEach(n=>{const c=n.path==="/"?"":n.path,l=n.method.toLowerCase(),i=me(n);o[l](c,...i),Y.debug(f.t("router.registered",{method:n.method,path:`${e}${c}`}))});const s=L.Router();return s.use(e,o),s}function me(e){const t=[],r=e.options??{};return r.pre&&r.pre.forEach(o=>{t.push(Z(o))}),t.push(Te(e.handler,r)),t}function Te(e,t){return async(r,o,s)=>{try{const n=await e(r,o);if(t.post&&t.post.length>0)for(const c of t.post)await c(r,o,n);!o.headersSent&&n!==void 0&&o.json({success:!0,data:n})}catch(n){s(n)}}}function y(e,t,r,o){return{path:t,method:e,handler:r,options:o?{pre:o.pre,post:o.post,validation:o.validation,timeout:o.timeout}:void 0}}function Se(e,t,r){return y("GET",e,t,r)}function Ee(e,t,r){return y("POST",e,t,r)}function ve(e,t,r){return y("PUT",e,t,r)}function Ae(e,t,r){return y("PATCH",e,t,r)}function ye(e,t,r){return y("DELETE",e,t,r)}const Ce={get:(e,t,r)=>y("GET",e,t,r),post:(e,t,r)=>y("POST",e,t,r),put:(e,t,r)=>y("PUT",e,t,r),patch:(e,t,r)=>y("PATCH",e,t,r),delete:(e,t,r)=>y("DELETE",e,t,r),options:(e,t,r)=>y("OPTIONS",e,t,r),head:(e,t,r)=>y("HEAD",e,t,r)};class G{_route={};_options={};static create(){return new G}path(t){return this._route.path=t,this}method(t){return this._route.method=t,this}get(t){return this.method("GET").path(t)}post(t){return this.method("POST").path(t)}put(t){return this.method("PUT").path(t)}patch(t){return this.method("PATCH").path(t)}delete(t){return this.method("DELETE").path(t)}handler(t){if(this._route.handler=t,!this._route.path||!this._route.method||!this._route.handler)throw new Error(f.t("router.missingRequired"));return{path:this._route.path,method:this._route.method,handler:this._route.handler,options:Object.keys(this._options).length>0?this._options:void 0}}pre(...t){return this._options.pre=[...this._options.pre??[],...t],this}postFn(...t){return this._options.post=[...this._options.post??[],...t],this}validate(t){return this._options.validation=t,this}timeout(t){return this._options.timeout=t,this}rateLimit(t){return this._options.rateLimit=t,this}auth(t){return this._options.auth=t,this}cache(t){return this._options.cache=t,this}build(){if(!this._route.path||!this._route.method||!this._route.handler)throw new Error(f.t("router.missingRequired"));return{path:this._route.path,method:this._route.method,handler:this._route.handler,options:Object.keys(this._options).length>0?this._options:void 0}}}const Re=_.createLogger("error");class C extends Error{statusCode;code;details;isOperational;constructor(t,r=p.HTTP_STATUS.INTERNAL_SERVER_ERROR,o){super(t),this.name="HarborError",this.statusCode=r,this.code=o?.code,this.details=o?.details,this.isOperational=o?.isOperational??!0,Error.captureStackTrace(this,this.constructor)}static badRequest(t,r){return new C(t??"Bad Request",p.HTTP_STATUS.BAD_REQUEST,{code:"BAD_REQUEST",details:r})}static unauthorized(t){return new C(t??"Unauthorized",p.HTTP_STATUS.UNAUTHORIZED,{code:"UNAUTHORIZED"})}static forbidden(t){return new C(t??"Forbidden",p.HTTP_STATUS.FORBIDDEN,{code:"FORBIDDEN"})}static notFound(t){return new C(t??"Not Found",p.HTTP_STATUS.NOT_FOUND,{code:"NOT_FOUND"})}static conflict(t,r){return new C(t??"Conflict",p.HTTP_STATUS.CONFLICT,{code:"CONFLICT",details:r})}static internal(t){return new C(t??"Internal Server Error",p.HTTP_STATUS.INTERNAL_SERVER_ERROR,{code:"INTERNAL_ERROR",isOperational:!1})}static tooManyRequests(t){return new C(t??"Too Many Requests",p.HTTP_STATUS.TOO_MANY_REQUESTS,{code:"RATE_LIMIT_EXCEEDED"})}toJSON(){return{success:!1,error:{message:this.message,code:this.code,statusCode:this.statusCode,details:this.details}}}}function X(e){const t=e.errors;return(r,o,s,n)=>{const c=r.statusCode??p.HTTP_STATUS.INTERNAL_SERVER_ERROR,l=$e(c,t);if(l?.log!==!1&&e.logger.enabled&&Re.error(`${o.method} ${o.path} - ${r.message}`,r),s.headersSent)return;if(l?.redirect){s.redirect(l.redirect);return}const i=we(r,c,l);l?.json!==!1?s.status(c).json(i):s.status(c).send(i.error.message)}}function $e(e,t){const r=e.toString();return t[r]??t.default}function we(e,t,r){return e instanceof C?e.toJSON():{success:!1,error:{message:r?.message??e.message??p.HTTP_STATUS_MESSAGES[t]??"An error occurred",statusCode:t}}}const O=_.createLogger("server");function Oe(e={}){const t=J(e.configPath),r=L();let o=null,s="stopped",n=null;const c=[];_e(r,t);const l={app:r,server:o,config:t,async start(){if(s==="running")return O.warn("Server is already running"),l.getInfo();s="starting";const i=e.port??t.server.port,g=e.host??t.server.host??"localhost";return new Promise((T,E)=>{try{o=V.createServer(r),l.server=o,o.listen(i,g,()=>{s="running",n=new Date;const a=l.getInfo();O.info(`Server started on http://${g}:${i}`),e.onReady?.(a),T(a)}),o.on("error",a=>{s="error",O.error("Server error",a),e.onError?.(a),E(a)}),q(l)}catch(a){s="error",E(a)}})},async stop(){if(!(!o||s==="stopped"))return s="stopping",new Promise((i,g)=>{const T=setTimeout(()=>{o?.close(),i()},ie);o.close(E=>{clearTimeout(T),E?(O.error("Error stopping server",E),g(E)):(s="stopped",n=null,O.info("Server stopped"),i())})})},async restart(){return await l.stop(),l.start()},addRoute(i){c.push(i);const g=j({routes:[i]},t);r.use(g)},addRouteGroup(i){c.push(...i.routes);const g=j({prefix:i.prefix,routes:i.routes,middleware:i.middleware},t);r.use(i.prefix,g)},addMiddleware(i){r.use(i)},use(...i){r.use(...i)},get(i,...g){r.get(i,...g)},post(i,...g){r.post(i,...g)},put(i,...g){r.put(i,...g)},patch(i,...g){r.patch(i,...g)},delete(i,...g){r.delete(i,...g)},listen(i,g){const T=i??e.port??t.server.port,E=e.host??t.server.host??"localhost";o=V.createServer(r),l.server=o,o.listen(T,E,()=>{s="running",n=new Date,O.info(`Server started on http://${E}:${T}`),g?.()}),q(l)},getInfo(){const i=e.port??t.server.port,g=e.host??t.server.host??"localhost";return{port:i,host:g,uptime:n?Date.now()-n.getTime():0,startedAt:n,routes:c.map(T=>({path:T.path,method:T.method,middleware:[]})),status:s}}};return e.autoStart===!0&&l.start().catch(i=>{O.error("Failed to auto-start server",i)}),l}function _e(e,t){t.server.bodyParser?.json&&e.use(L.json({limit:t.server.bodyParser.limit})),t.server.bodyParser?.urlencoded&&e.use(L.urlencoded({extended:!0,limit:t.server.bodyParser.limit})),t.server.cors?.enabled&&e.use(Pe(t.server.cors)),e.use(He());const r=X(t);e.use(r)}function Pe(e){return(t,r,o)=>{const s=e.origin;if(s===!0||s==="*")r.setHeader("Access-Control-Allow-Origin","*");else if(typeof s=="string")r.setHeader("Access-Control-Allow-Origin",s);else if(Array.isArray(s)){const n=t.headers.origin;n&&s.includes(n)&&r.setHeader("Access-Control-Allow-Origin",n)}if(r.setHeader("Access-Control-Allow-Methods",e.methods?.join(", ")??"GET,POST,PUT,PATCH,DELETE,OPTIONS"),e.allowedHeaders?r.setHeader("Access-Control-Allow-Headers",e.allowedHeaders.join(", ")):r.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),e.credentials&&r.setHeader("Access-Control-Allow-Credentials","true"),t.method==="OPTIONS"){r.status(204).end();return}o()}}function He(){return(e,t,r)=>{e.startTime=Date.now(),e.harborContext={},t.success=function(o,s=200){t.status(s).json({success:!0,data:o})},t.error=function(o,s=500,n){t.status(s).json({success:!1,error:{message:o,details:n}})},r()}}function q(e){["SIGTERM","SIGINT"].forEach(r=>{process.on(r,async()=>{O.info(`Received ${r}, shutting down gracefully`),await e.stop(),process.exit(0)})})}const U=_.createLogger("changelog"),Le={filePath:"./CHANGELOG.md",format:"markdown",includeUnreleased:!0};function ee(e={}){const t={...Le,...e},r=[];let o=[];function s(){const a=b.resolve(process.cwd(),t.filePath);if(!P.existsSync(a)){U.info("No changelog file found, starting fresh");return}try{const u=P.readFileSync(a,"utf-8");n(u),U.info("Changelog loaded",{entries:r.length})}catch(u){U.error("Failed to load changelog",u)}}function n(a){const u=/## \[(\d+\.\d+\.\d+(?:-[\w.]+)?)\](?: - (\d{4}-\d{2}-\d{2}))?/g,h=a.split(u);for(let d=1;d<h.length;d+=3){const S=h[d],$=h[d+1],A=h[d+2];if(S&&A){const M={version:S,date:$?new Date($):new Date,changes:c(A)};r.push(M)}}}function c(a){const u=[],h=a.split(`
2
+ `);let d=null;for(const S of h){const $=S.match(/^### (Added|Changed|Deprecated|Removed|Fixed|Security)/i);if($){d=$[1].toLowerCase();continue}const A=S.match(/^- (.+)/);A&&d&&u.push({type:d,description:A[1].trim()})}return u}function l(){const a=b.resolve(process.cwd(),t.filePath),u=i();P.writeFileSync(a,u,"utf-8"),U.info("Changelog saved",{path:a})}function i(){let a=`# Changelog
3
3
 
4
- `;d+=`All notable changes to this project will be documented in this file.
4
+ `;a+=`All notable changes to this project will be documented in this file.
5
5
 
6
- `,d+=`The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7
- `,d+=`and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+ `,a+=`The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7
+ `,a+=`and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
- `,e.includeUnreleased&&n.length>0&&(d+=`## [Unreleased]
9
+ `,t.includeUnreleased&&o.length>0&&(a+=`## [Unreleased]
10
10
 
11
- `,d+=g(n),d+=`
12
- `);for(const l of t){const u=l.date.toISOString().split("T")[0];if(d+=`## [${l.version}] - ${u}
11
+ `,a+=g(o),a+=`
12
+ `);for(const u of r){const h=u.date.toISOString().split("T")[0];if(a+=`## [${u.version}] - ${h}
13
13
 
14
- `,d+=g(l.changes),l.breaking&&l.breaking.length>0){d+=`### BREAKING CHANGES
14
+ `,a+=g(u.changes),u.breaking&&u.breaking.length>0){a+=`### BREAKING CHANGES
15
15
 
16
- `;for(const f of l.breaking)d+=`- ${f.description}
17
- `;d+=`
18
- `}d+=`
19
- `}return d}function g(d){const l=w(d);let u="";const f=["added","changed","deprecated","removed","fixed","security"];for(const m of f){const C=l[m];if(C&&C.length>0){u+=`### ${T(m)}
16
+ `;for(const d of u.breaking)a+=`- ${d.description}
17
+ `;a+=`
18
+ `}a+=`
19
+ `}return a}function g(a){const u=T(a);let h="";const d=["added","changed","deprecated","removed","fixed","security"];for(const S of d){const $=u[S];if($&&$.length>0){h+=`### ${E(S)}
20
20
 
21
- `;for(const y of C){let k=`- ${y.description}`;y.scope&&(k=`- **${y.scope}:** ${y.description}`),y.issue&&(k+=` (#${y.issue})`),u+=k+`
22
- `}u+=`
23
- `}}return u}function w(d){const l={added:[],changed:[],deprecated:[],removed:[],fixed:[],security:[]};for(const u of d)l[u.type].push(u);return l}function T(d){return d.charAt(0).toUpperCase()+d.slice(1)}return{load:s,save:a,addChange(d,l,u){n.push({type:d,description:l,scope:u==null?void 0:u.scope,issue:u==null?void 0:u.issue})},release(d){const l={version:d,date:new Date,changes:[...n]};return t.unshift(l),n=[],a(),I.info(`Released version ${d}`),l},getEntries(){return[...t]},getUnreleased(){return[...n]},getLatestVersion(){var d;return((d=t[0])==null?void 0:d.version)??null},getReleaseNotes(d){var f;const l=t.find(m=>m.version===d);if(!l)return null;const u=w(l.changes);return{version:l.version,date:l.date,added:u.added.map(m=>m.description),changed:u.changed.map(m=>m.description),deprecated:u.deprecated.map(m=>m.description),removed:u.removed.map(m=>m.description),fixed:u.fixed.map(m=>m.description),security:u.security.map(m=>m.description),breaking:((f=l.breaking)==null?void 0:f.map(m=>m.description))??[]}}}}class dt{constructor(e){c(this,"manager");c(this,"load",()=>this.manager.load());c(this,"save",()=>this.manager.save());c(this,"addChange",(...e)=>this.manager.addChange(...e));c(this,"release",e=>this.manager.release(e));c(this,"getEntries",()=>this.manager.getEntries());c(this,"getUnreleased",()=>this.manager.getUnreleased());c(this,"getLatestVersion",()=>this.manager.getLatestVersion());c(this,"getReleaseNotes",e=>this.manager.getReleaseNotes(e));this.manager=re(e)}}class se{constructor(e={}){this.options=e}get config(){return this.options}generate(){console.log("[Harbor] Portal generation is coming soon.")}}function lt(r){return new se(r)}function ut(){console.log("[Harbor] API documentation generation is coming soon.")}function J(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function oe(r,e){const t={...r};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)){const s=e[n],o=r[n];J(s)&&J(o)?t[n]=oe(o,s):s!==void 0&&(t[n]=s)}return t}function ht(r,e){const t={};for(const n of e)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n]);return t}function mt(r,e){const t={...r};for(const n of e)delete t[n];return t}function ft(r=16){const e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";let t="";for(let n=0;n<r;n++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}function gt(r,e="ISO"){if(e==="ISO")return r.toISOString();const t=r.getFullYear(),n=String(r.getMonth()+1).padStart(2,"0"),s=String(r.getDate()).padStart(2,"0"),o=String(r.getHours()).padStart(2,"0"),i=String(r.getMinutes()).padStart(2,"0"),a=String(r.getSeconds()).padStart(2,"0");switch(e){case"DATE":return`${t}-${n}-${s}`;case"TIME":return`${o}:${i}:${a}`;case"DATETIME":return`${t}-${n}-${s} ${o}:${i}:${a}`;default:return r.toISOString()}}function pt(r){return new Promise(e=>setTimeout(e,r))}const x=A.createLogger("http"),_={info:"\x1B[36m",success:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",reset:"\x1B[0m"};function _t(r){return r>=500?_.serverError:r>=400?_.clientError:r>=300?_.redirect:r>=200?_.success:_.info}function z(r){return{GET:"\x1B[32m",POST:"\x1B[34m",PUT:"\x1B[33m",PATCH:"\x1B[35m",DELETE:"\x1B[31m",OPTIONS:"\x1B[36m",HEAD:"\x1B[36m"}[r]??"\x1B[0m"}function yt(r){return r===0?"-":r<1024?`${r}B`:r<1024*1024?`${(r/1024).toFixed(1)}KB`:`${(r/(1024*1024)).toFixed(1)}MB`}function wt(r,e,t){const n=Date.now()-t,s=e.statusCode,o=e.get("content-length")??"0";return{method:r.method,url:r.originalUrl||r.url,status:s,statusColor:_t(s),responseTime:n,contentLength:yt(parseInt(o,10)||0),remoteAddr:r.ip||r.socket.remoteAddress||"-",date:new Date().toISOString(),httpVersion:`HTTP/${r.httpVersionMajor}.${r.httpVersionMinor}`,userAgent:r.get("user-agent")??"-",referrer:r.get("referrer")??"-"}}const vt={tiny:(r,e)=>{const t=e?`${z(r.method)}${r.method}${_.reset}`:r.method,n=e?`${r.statusColor}${r.status}${_.reset}`:String(r.status);return`${t} ${r.url} ${n} ${r.responseTime}ms`},short:(r,e)=>{const t=e?`${z(r.method)}${r.method}${_.reset}`:r.method,n=e?`${r.statusColor}${r.status}${_.reset}`:String(r.status);return`${r.remoteAddr} ${t} ${r.url} ${n} ${r.responseTime}ms - ${r.contentLength}`},dev:(r,e)=>{const t=e?`${z(r.method)}${r.method.padEnd(7)}${_.reset}`:r.method.padEnd(7),n=e?`${r.statusColor}${r.status}${_.reset}`:String(r.status),s=r.responseTime<100?`${r.responseTime}ms`:r.responseTime<1e3?`\x1B[33m${r.responseTime}ms${_.reset}`:`\x1B[31m${r.responseTime}ms${_.reset}`;return`${t} ${r.url} ${n} ${e?s:`${r.responseTime}ms`} - ${r.contentLength}`},combined:r=>`${r.remoteAddr} - - [${r.date}] "${r.method} ${r.url} ${r.httpVersion}" ${r.status} ${r.contentLength} "${r.referrer}" "${r.userAgent}"`,common:r=>`${r.remoteAddr} - - [${r.date}] "${r.method} ${r.url} ${r.httpVersion}" ${r.status} ${r.contentLength}`,custom:()=>""};function bt(r={}){const{format:e="dev",skip:t,immediate:n=!1,customFormat:s,colorize:o=!0}=r;return(i,a,h)=>{const g=Date.now();n&&x.info(b("http.requestStart",{method:i.method,url:i.url}));const w=a.end;a.end=function(T,d,l){a.end=w;const u=a.end(T,d,l);if(t&&t(i,a))return u;const f=wt(i,a,g);let m;return e==="custom"&&s?m=s(f):m=vt[e](f,o),f.status>=500?x.error(m):f.status>=400?x.warn(m):x.info(m),u},h()}}const Tt={successOnly:(r,e)=>e.statusCode<400,healthChecks:r=>r.url==="/health"||r.url==="/healthz"||r.url==="/ready",staticFiles:r=>/\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$/i.test(r.url),paths:r=>e=>r.some(t=>e.url.startsWith(t))};function Ot(r){return r}exports.createLogger=A.createLogger;exports.setGlobalLogLevel=A.setGlobalLogLevel;exports.MongoValidator=E.MongoValidator;exports.createMongoSchema=E.createMongoSchema;exports.createParamValidator=E.createParamValidator;exports.validateField=E.validateField;exports.validateRequest=E.validateRequest;exports.validators=E.validators;exports.DockerManager=ee.DockerManager;exports.createDockerManager=ee.createDockerManager;exports.CONTENT_TYPES=we;exports.ChangelogManager=dt;exports.DELETE=ze;exports.GET=Be;exports.HEADERS=ve;exports.HTTP_METHODS=_e;exports.HTTP_STATUS=p;exports.HarborDocument=Q;exports.HarborError=O;exports.Model=N;exports.PATCH=Ge;exports.POST=qe;exports.PUT=Ve;exports.PortalGenerator=se;exports.Query=H;exports.RouteBuilder=W;exports.Schema=X;exports.Types=at;exports.addTranslations=He;exports.connect=st;exports.connection=M;exports.createChangelogManager=re;exports.createCustomFormat=Ot;exports.createErrorHandler=ne;exports.createPortal=lt;exports.createRouter=K;exports.createServer=Xe;exports.deepMerge=oe;exports.defineConfig=Se;exports.disconnect=ot;exports.formatDate=gt;exports.generateDocs=ut;exports.generateId=ft;exports.getAvailableLocales=Ie;exports.getLocale=ke;exports.httpLogger=bt;exports.loadConfig=te;exports.model=it;exports.omit=mt;exports.pick=ht;exports.registerLocale=De;exports.route=Ke;exports.setLocale=Re;exports.skipFunctions=Tt;exports.sleep=pt;exports.t=b;
21
+ `;for(const A of $){let M=`- ${A.description}`;A.scope&&(M=`- **${A.scope}:** ${A.description}`),A.issue&&(M+=` (#${A.issue})`),h+=M+`
22
+ `}h+=`
23
+ `}}return h}function T(a){const u={added:[],changed:[],deprecated:[],removed:[],fixed:[],security:[]};for(const h of a)u[h.type].push(h);return u}function E(a){return a.charAt(0).toUpperCase()+a.slice(1)}return{load:s,save:l,addChange(a,u,h){o.push({type:a,description:u,scope:h?.scope,issue:h?.issue})},release(a){const u={version:a,date:new Date,changes:[...o]};return r.unshift(u),o=[],l(),U.info(`Released version ${a}`),u},getEntries(){return[...r]},getUnreleased(){return[...o]},getLatestVersion(){return r[0]?.version??null},getReleaseNotes(a){const u=r.find(d=>d.version===a);if(!u)return null;const h=T(u.changes);return{version:u.version,date:u.date,added:h.added.map(d=>d.description),changed:h.changed.map(d=>d.description),deprecated:h.deprecated.map(d=>d.description),removed:h.removed.map(d=>d.description),fixed:h.fixed.map(d=>d.description),security:h.security.map(d=>d.description),breaking:u.breaking?.map(d=>d.description)??[]}}}}class Me{manager;constructor(t){this.manager=ee(t)}load=()=>this.manager.load();save=()=>this.manager.save();addChange=(...t)=>this.manager.addChange(...t);release=t=>this.manager.release(t);getEntries=()=>this.manager.getEntries();getUnreleased=()=>this.manager.getUnreleased();getLatestVersion=()=>this.manager.getLatestVersion();getReleaseNotes=t=>this.manager.getReleaseNotes(t)}function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function te(e,t){const r={...e};for(const o in t)if(Object.prototype.hasOwnProperty.call(t,o)){const s=t[o],n=e[o];W(s)&&W(n)?r[o]=te(n,s):s!==void 0&&(r[o]=s)}return r}function Ue(e,t){const r={};for(const o of t)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r}function be(e,t){const r={...e};for(const o of t)delete r[o];return r}function Ne(e=16){const t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";let r="";for(let o=0;o<e;o++)r+=t.charAt(Math.floor(Math.random()*t.length));return r}function De(e,t="ISO"){if(t==="ISO")return e.toISOString();const r=e.getFullYear(),o=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0"),n=String(e.getHours()).padStart(2,"0"),c=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");switch(t){case"DATE":return`${r}-${o}-${s}`;case"TIME":return`${n}:${c}:${l}`;case"DATETIME":return`${r}-${o}-${s} ${n}:${c}:${l}`;default:return e.toISOString()}}function Fe(e){return new Promise(t=>setTimeout(t,e))}const N=_.createLogger("http"),v={info:"\x1B[36m",success:"\x1B[32m",redirect:"\x1B[36m",clientError:"\x1B[33m",serverError:"\x1B[31m",reset:"\x1B[0m"};function Ie(e){return e>=500?v.serverError:e>=400?v.clientError:e>=300?v.redirect:e>=200?v.success:v.info}function x(e){return{GET:"\x1B[32m",POST:"\x1B[34m",PUT:"\x1B[33m",PATCH:"\x1B[35m",DELETE:"\x1B[31m",OPTIONS:"\x1B[36m",HEAD:"\x1B[36m"}[e]??"\x1B[0m"}function ke(e){return e===0?"-":e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(1)}MB`}function xe(e,t,r){const o=Date.now()-r,s=t.statusCode,n=t.get("content-length")??"0";return{method:e.method,url:e.originalUrl||e.url,status:s,statusColor:Ie(s),responseTime:o,contentLength:ke(parseInt(n,10)||0),remoteAddr:e.ip||e.socket.remoteAddress||"-",date:new Date().toISOString(),httpVersion:`HTTP/${e.httpVersionMajor}.${e.httpVersionMinor}`,userAgent:e.get("user-agent")??"-",referrer:e.get("referrer")??"-"}}const je={tiny:(e,t)=>{const r=t?`${x(e.method)}${e.method}${v.reset}`:e.method,o=t?`${e.statusColor}${e.status}${v.reset}`:String(e.status);return`${r} ${e.url} ${o} ${e.responseTime}ms`},short:(e,t)=>{const r=t?`${x(e.method)}${e.method}${v.reset}`:e.method,o=t?`${e.statusColor}${e.status}${v.reset}`:String(e.status);return`${e.remoteAddr} ${r} ${e.url} ${o} ${e.responseTime}ms - ${e.contentLength}`},dev:(e,t)=>{const r=t?`${x(e.method)}${e.method.padEnd(7)}${v.reset}`:e.method.padEnd(7),o=t?`${e.statusColor}${e.status}${v.reset}`:String(e.status),s=e.responseTime<100?`${e.responseTime}ms`:e.responseTime<1e3?`\x1B[33m${e.responseTime}ms${v.reset}`:`\x1B[31m${e.responseTime}ms${v.reset}`;return`${r} ${e.url} ${o} ${t?s:`${e.responseTime}ms`} - ${e.contentLength}`},combined:e=>`${e.remoteAddr} - - [${e.date}] "${e.method} ${e.url} ${e.httpVersion}" ${e.status} ${e.contentLength} "${e.referrer}" "${e.userAgent}"`,common:e=>`${e.remoteAddr} - - [${e.date}] "${e.method} ${e.url} ${e.httpVersion}" ${e.status} ${e.contentLength}`,custom:()=>""};function Be(e={}){const{format:t="dev",skip:r,immediate:o=!1,customFormat:s,colorize:n=!0}=e;return(c,l,i)=>{const g=Date.now();o&&N.info(f.t("http.requestStart",{method:c.method,url:c.url}));const T=l.end;l.end=function(E,a,u){l.end=T;const h=l.end(E,a,u);if(r&&r(c,l))return h;const d=xe(c,l,g);let S;return t==="custom"&&s?S=s(d):S=je[t](d,n),d.status>=500?N.error(S):d.status>=400?N.warn(S):N.info(S),h},i()}}const Ge={successOnly:(e,t)=>t.statusCode<400,healthChecks:e=>e.url==="/health"||e.url==="/healthz"||e.url==="/ready",staticFiles:e=>/\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$/i.test(e.url),paths:e=>t=>e.some(r=>t.url.startsWith(r))};function Ve(e){return e}exports.createLogger=_.createLogger;exports.setGlobalLogLevel=_.setGlobalLogLevel;exports.MongoValidator=w.MongoValidator;exports.createMongoSchema=w.createMongoSchema;exports.createParamValidator=w.createParamValidator;exports.validateField=w.validateField;exports.validateRequest=w.validateRequest;exports.validators=w.validators;exports.CONTENT_TYPES=p.CONTENT_TYPES;exports.HEADERS=p.HEADERS;exports.HTTP_METHODS=p.HTTP_METHODS;exports.HTTP_STATUS=p.HTTP_STATUS;exports.HarborDocument=f.HarborDocument;exports.Model=f.Model;exports.Query=f.Query;exports.Schema=f.Schema;exports.Types=f.Types;exports.addTranslations=f.addTranslations;exports.connect=f.connect;exports.connection=f.connection;exports.disconnect=f.disconnect;exports.getAvailableLocales=f.getAvailableLocales;exports.getLocale=f.getLocale;exports.model=f.model;exports.registerLocale=f.registerLocale;exports.setLocale=f.setLocale;exports.t=f.t;exports.RateLimitRedisStore=m.RedisStore;exports.customHealthCheck=m.customHealthCheck;exports.defaultRegistry=m.defaultRegistry;exports.diskHealthCheck=m.diskHealthCheck;exports.healthCheck=m.healthCheck;exports.memoryHealthCheck=m.memoryHealthCheck;exports.metricsEndpoint=m.metricsEndpoint;exports.metricsMiddleware=m.metricsMiddleware;exports.mimeToExtension=m.mimeToExtension;exports.mongoHealthCheck=m.mongoHealthCheck;exports.rateLimit=m.rateLimit;exports.redisHealthCheck=m.redisHealthCheck;exports.slidingWindowRateLimit=m.slidingWindowRateLimit;exports.upload=m.upload;exports.validateFileType=m.validateFileType;exports.WebSocketManager=K.WebSocketManager;exports.createWebSocketServer=K.createWebSocketServer;exports.Scheduler=z.Scheduler;exports.createScheduler=z.createScheduler;exports.CacheManager=H.CacheManager;exports.MemoryCache=H.MemoryCache;exports.RedisCache=H.RedisCache;exports.cache=H.cache;exports.cacheResponse=H.cacheResponse;exports.cached=H.cached;exports.createCache=H.createCache;exports.JWT=R.JWT;exports.apiKeyAuth=R.apiKeyAuth;exports.createJwt=R.createJwt;exports.generateApiKey=R.generateApiKey;exports.hashPassword=R.hashPassword;exports.jwtAuth=R.jwtAuth;exports.requirePermission=R.requirePermission;exports.requireRole=R.requireRole;exports.verifyPassword=R.verifyPassword;exports.verifySignature=R.verifySignature;exports.DockerManager=Q.DockerManager;exports.createDockerManager=Q.createDockerManager;exports.ChangelogManager=Me;exports.DELETE=ye;exports.GET=Se;exports.HarborError=C;exports.PATCH=Ae;exports.POST=Ee;exports.PUT=ve;exports.RouteBuilder=G;exports.createChangelogManager=ee;exports.createCustomFormat=Ve;exports.createErrorHandler=X;exports.createRouter=j;exports.createServer=Oe;exports.deepMerge=te;exports.defineConfig=ce;exports.formatDate=De;exports.generateId=Ne;exports.httpLogger=Be;exports.loadConfig=J;exports.omit=be;exports.pick=Ue;exports.route=Ce;exports.router=pe;exports.skipFunctions=Ge;exports.sleep=Fe;
24
24
  //# sourceMappingURL=index.cjs.js.map