@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,102 @@
1
+ const f = {
2
+ debug: 0,
3
+ info: 1,
4
+ warn: 2,
5
+ error: 3,
6
+ silent: 4
7
+ }, b = {
8
+ debug: "\x1B[36m",
9
+ info: "\x1B[32m",
10
+ warn: "\x1B[33m",
11
+ error: "\x1B[31m",
12
+ silent: ""
13
+ }, L = "\x1B[0m";
14
+ let u = "info";
15
+ function p(c) {
16
+ u = c;
17
+ }
18
+ function m(c, r) {
19
+ const i = c ?? "harbor", t = {
20
+ level: r?.level ?? u,
21
+ format: r?.format ?? "text",
22
+ output: r?.output ?? "console",
23
+ colorize: r?.colorize ?? !0,
24
+ prefix: r?.prefix,
25
+ filePath: r?.filePath
26
+ };
27
+ function x(e) {
28
+ return f[e] >= f[t.level];
29
+ }
30
+ function d(e) {
31
+ if (t.format === "json")
32
+ return JSON.stringify({
33
+ timestamp: e.timestamp.toISOString(),
34
+ level: e.level,
35
+ context: e.context,
36
+ message: e.message,
37
+ data: e.data,
38
+ error: e.error ? {
39
+ name: e.error.name,
40
+ message: e.error.message,
41
+ stack: e.error.stack
42
+ } : void 0
43
+ });
44
+ const o = e.timestamp.toISOString(), s = e.level.toUpperCase().padEnd(5), g = e.context ? `[${e.context}]` : "";
45
+ let a = `${o} ${s} ${g} ${e.message}`;
46
+ return e.data && Object.keys(e.data).length > 0 && (a += ` ${JSON.stringify(e.data)}`), e.error && (a += `
47
+ ${e.error.stack ?? e.error.message}`), t.colorize && (a = `${b[e.level]}${a}${L}`), a;
48
+ }
49
+ function l(e, o, s, g) {
50
+ if (!x(e)) return;
51
+ const n = d({
52
+ level: e,
53
+ message: o,
54
+ timestamp: /* @__PURE__ */ new Date(),
55
+ context: i,
56
+ data: s,
57
+ error: g
58
+ });
59
+ if (t.output === "console" || t.output === "both")
60
+ switch (e) {
61
+ case "debug":
62
+ case "info":
63
+ console.log(n);
64
+ break;
65
+ case "warn":
66
+ console.warn(n);
67
+ break;
68
+ case "error":
69
+ console.error(n);
70
+ break;
71
+ }
72
+ }
73
+ return {
74
+ debug(e, o) {
75
+ l("debug", e, o);
76
+ },
77
+ info(e, o) {
78
+ l("info", e, o);
79
+ },
80
+ warn(e, o) {
81
+ l("warn", e, o);
82
+ },
83
+ error(e, o, s) {
84
+ l("error", e, s, o);
85
+ },
86
+ setLevel(e) {
87
+ t.level = e;
88
+ },
89
+ setContext(e) {
90
+ return m(e, t);
91
+ },
92
+ child(e) {
93
+ const o = i ? `${i}:${e}` : e;
94
+ return m(o, t);
95
+ }
96
+ };
97
+ }
98
+ export {
99
+ m as c,
100
+ p as s
101
+ };
102
+ //# sourceMappingURL=logger-CZn7QxCl.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger-D7aJSi62.mjs","sources":["../src/utils/logger.ts"],"sourcesContent":["import type { Logger, LogLevel, LogEntry, LoggerOptions } from '../types';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nconst LOG_COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m',\n info: '\\x1b[32m',\n warn: '\\x1b[33m',\n error: '\\x1b[31m',\n silent: '',\n};\n\nconst RESET = '\\x1b[0m';\n\nlet globalLogLevel: LogLevel = 'info';\nlet globalEnabled = true;\n\nexport function setGlobalLogLevel(level: LogLevel): void {\n globalLogLevel = level;\n}\n\nexport function setGlobalLogging(enabled: boolean): void {\n globalEnabled = enabled;\n}\n\nexport function createLogger(context?: string, options?: Partial<LoggerOptions>): Logger {\n const loggerContext = context ?? 'harbor';\n const loggerOptions: LoggerOptions = {\n level: options?.level ?? globalLogLevel,\n format: options?.format ?? 'text',\n output: options?.output ?? 'console',\n colorize: options?.colorize ?? true,\n prefix: options?.prefix,\n filePath: options?.filePath,\n };\n\n function shouldLog(level: LogLevel): boolean {\n if (!globalEnabled) return false;\n return LOG_LEVELS[level] >= LOG_LEVELS[loggerOptions.level];\n }\n\n function formatEntry(entry: LogEntry): string {\n if (loggerOptions.format === 'json') {\n return JSON.stringify({\n timestamp: entry.timestamp.toISOString(),\n level: entry.level,\n context: entry.context,\n message: entry.message,\n data: entry.data,\n error: entry.error ? {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n } : undefined,\n });\n }\n\n const timestamp = entry.timestamp.toISOString();\n const levelStr = entry.level.toUpperCase().padEnd(5);\n const contextStr = entry.context ? `[${entry.context}]` : '';\n \n let message = `${timestamp} ${levelStr} ${contextStr} ${entry.message}`;\n\n if (entry.data && Object.keys(entry.data).length > 0) {\n message += ` ${JSON.stringify(entry.data)}`;\n }\n\n if (entry.error) {\n message += `\\n${entry.error.stack ?? entry.error.message}`;\n }\n\n if (loggerOptions.colorize) {\n const color = LOG_COLORS[entry.level];\n message = `${color}${message}${RESET}`;\n }\n\n return message;\n }\n\n function log(level: LogLevel, message: string, data?: Record<string, unknown>, error?: Error): void {\n if (!shouldLog(level)) return;\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n context: loggerContext,\n data,\n error,\n };\n\n const formatted = formatEntry(entry);\n\n if (loggerOptions.output === 'console' || loggerOptions.output === 'both') {\n switch (level) {\n case 'debug':\n case 'info':\n console.log(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n case 'error':\n console.error(formatted);\n break;\n }\n }\n }\n\n const logger: Logger = {\n debug(message: string, data?: Record<string, unknown>): void {\n log('debug', message, data);\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n log('info', message, data);\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n log('warn', message, data);\n },\n\n error(message: string, error?: Error, data?: Record<string, unknown>): void {\n log('error', message, data, error);\n },\n\n setLevel(level: LogLevel): void {\n loggerOptions.level = level;\n },\n\n setContext(newContext: string): Logger {\n return createLogger(newContext, loggerOptions);\n },\n\n child(childContext: string): Logger {\n const fullContext = loggerContext ? `${loggerContext}:${childContext}` : childContext;\n return createLogger(fullContext, loggerOptions);\n },\n };\n\n return logger;\n}\n\n"],"names":["LOG_LEVELS","LOG_COLORS","RESET","globalLogLevel","setGlobalLogLevel","level","createLogger","context","options","loggerContext","loggerOptions","shouldLog","formatEntry","entry","timestamp","levelStr","contextStr","message","log","data","error","formatted","newContext","childContext","fullContext"],"mappings":"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"}
1
+ {"version":3,"file":"logger-CZn7QxCl.mjs","sources":["../src/utils/logger.ts"],"sourcesContent":["import type { Logger, LogLevel, LogEntry, LoggerOptions } from '../types';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nconst LOG_COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m',\n info: '\\x1b[32m',\n warn: '\\x1b[33m',\n error: '\\x1b[31m',\n silent: '',\n};\n\nconst RESET = '\\x1b[0m';\n\nlet globalLogLevel: LogLevel = 'info';\nlet globalEnabled = true;\n\nexport function setGlobalLogLevel(level: LogLevel): void {\n globalLogLevel = level;\n}\n\nexport function setGlobalLogging(enabled: boolean): void {\n globalEnabled = enabled;\n}\n\nexport function createLogger(context?: string, options?: Partial<LoggerOptions>): Logger {\n const loggerContext = context ?? 'harbor';\n const loggerOptions: LoggerOptions = {\n level: options?.level ?? globalLogLevel,\n format: options?.format ?? 'text',\n output: options?.output ?? 'console',\n colorize: options?.colorize ?? true,\n prefix: options?.prefix,\n filePath: options?.filePath,\n };\n\n function shouldLog(level: LogLevel): boolean {\n if (!globalEnabled) return false;\n return LOG_LEVELS[level] >= LOG_LEVELS[loggerOptions.level];\n }\n\n function formatEntry(entry: LogEntry): string {\n if (loggerOptions.format === 'json') {\n return JSON.stringify({\n timestamp: entry.timestamp.toISOString(),\n level: entry.level,\n context: entry.context,\n message: entry.message,\n data: entry.data,\n error: entry.error ? {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n } : undefined,\n });\n }\n\n const timestamp = entry.timestamp.toISOString();\n const levelStr = entry.level.toUpperCase().padEnd(5);\n const contextStr = entry.context ? `[${entry.context}]` : '';\n \n let message = `${timestamp} ${levelStr} ${contextStr} ${entry.message}`;\n\n if (entry.data && Object.keys(entry.data).length > 0) {\n message += ` ${JSON.stringify(entry.data)}`;\n }\n\n if (entry.error) {\n message += `\\n${entry.error.stack ?? entry.error.message}`;\n }\n\n if (loggerOptions.colorize) {\n const color = LOG_COLORS[entry.level];\n message = `${color}${message}${RESET}`;\n }\n\n return message;\n }\n\n function log(level: LogLevel, message: string, data?: Record<string, unknown>, error?: Error): void {\n if (!shouldLog(level)) return;\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n context: loggerContext,\n data,\n error,\n };\n\n const formatted = formatEntry(entry);\n\n if (loggerOptions.output === 'console' || loggerOptions.output === 'both') {\n switch (level) {\n case 'debug':\n case 'info':\n console.log(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n case 'error':\n console.error(formatted);\n break;\n }\n }\n }\n\n const logger: Logger = {\n debug(message: string, data?: Record<string, unknown>): void {\n log('debug', message, data);\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n log('info', message, data);\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n log('warn', message, data);\n },\n\n error(message: string, error?: Error, data?: Record<string, unknown>): void {\n log('error', message, data, error);\n },\n\n setLevel(level: LogLevel): void {\n loggerOptions.level = level;\n },\n\n setContext(newContext: string): Logger {\n return createLogger(newContext, loggerOptions);\n },\n\n child(childContext: string): Logger {\n const fullContext = loggerContext ? `${loggerContext}:${childContext}` : childContext;\n return createLogger(fullContext, loggerOptions);\n },\n };\n\n return logger;\n}\n\n"],"names":["LOG_LEVELS","LOG_COLORS","RESET","globalLogLevel","setGlobalLogLevel","level","createLogger","context","options","loggerContext","loggerOptions","shouldLog","formatEntry","entry","timestamp","levelStr","contextStr","message","log","data","error","formatted","newContext","childContext","fullContext"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";const m={debug:0,info:1,warn:2,error:3,silent:4},L={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",silent:""},b="\x1B[0m";let u="info";function v(n){u=n}function f(n,r){const g=n??"harbor",t={level:r?.level??u,format:r?.format??"text",output:r?.output??"console",colorize:r?.colorize??!0,prefix:r?.prefix,filePath:r?.filePath};function x(e){return m[e]>=m[t.level]}function d(e){if(t.format==="json")return JSON.stringify({timestamp:e.timestamp.toISOString(),level:e.level,context:e.context,message:e.message,data:e.data,error:e.error?{name:e.error.name,message:e.error.message,stack:e.error.stack}:void 0});const o=e.timestamp.toISOString(),s=e.level.toUpperCase().padEnd(5),i=e.context?`[${e.context}]`:"";let a=`${o} ${s} ${i} ${e.message}`;return e.data&&Object.keys(e.data).length>0&&(a+=` ${JSON.stringify(e.data)}`),e.error&&(a+=`
2
+ ${e.error.stack??e.error.message}`),t.colorize&&(a=`${L[e.level]}${a}${b}`),a}function l(e,o,s,i){if(!x(e))return;const c=d({level:e,message:o,timestamp:new Date,context:g,data:s,error:i});if(t.output==="console"||t.output==="both")switch(e){case"debug":case"info":console.log(c);break;case"warn":console.warn(c);break;case"error":console.error(c);break}}return{debug(e,o){l("debug",e,o)},info(e,o){l("info",e,o)},warn(e,o){l("warn",e,o)},error(e,o,s){l("error",e,s,o)},setLevel(e){t.level=e},setContext(e){return f(e,t)},child(e){const o=g?`${g}:${e}`:e;return f(o,t)}}}exports.createLogger=f;exports.setGlobalLogLevel=v;
3
+ //# sourceMappingURL=logger-D-lfaRWQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger-DEnWXtpk.js","sources":["../src/utils/logger.ts"],"sourcesContent":["import type { Logger, LogLevel, LogEntry, LoggerOptions } from '../types';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nconst LOG_COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m',\n info: '\\x1b[32m',\n warn: '\\x1b[33m',\n error: '\\x1b[31m',\n silent: '',\n};\n\nconst RESET = '\\x1b[0m';\n\nlet globalLogLevel: LogLevel = 'info';\nlet globalEnabled = true;\n\nexport function setGlobalLogLevel(level: LogLevel): void {\n globalLogLevel = level;\n}\n\nexport function setGlobalLogging(enabled: boolean): void {\n globalEnabled = enabled;\n}\n\nexport function createLogger(context?: string, options?: Partial<LoggerOptions>): Logger {\n const loggerContext = context ?? 'harbor';\n const loggerOptions: LoggerOptions = {\n level: options?.level ?? globalLogLevel,\n format: options?.format ?? 'text',\n output: options?.output ?? 'console',\n colorize: options?.colorize ?? true,\n prefix: options?.prefix,\n filePath: options?.filePath,\n };\n\n function shouldLog(level: LogLevel): boolean {\n if (!globalEnabled) return false;\n return LOG_LEVELS[level] >= LOG_LEVELS[loggerOptions.level];\n }\n\n function formatEntry(entry: LogEntry): string {\n if (loggerOptions.format === 'json') {\n return JSON.stringify({\n timestamp: entry.timestamp.toISOString(),\n level: entry.level,\n context: entry.context,\n message: entry.message,\n data: entry.data,\n error: entry.error ? {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n } : undefined,\n });\n }\n\n const timestamp = entry.timestamp.toISOString();\n const levelStr = entry.level.toUpperCase().padEnd(5);\n const contextStr = entry.context ? `[${entry.context}]` : '';\n \n let message = `${timestamp} ${levelStr} ${contextStr} ${entry.message}`;\n\n if (entry.data && Object.keys(entry.data).length > 0) {\n message += ` ${JSON.stringify(entry.data)}`;\n }\n\n if (entry.error) {\n message += `\\n${entry.error.stack ?? entry.error.message}`;\n }\n\n if (loggerOptions.colorize) {\n const color = LOG_COLORS[entry.level];\n message = `${color}${message}${RESET}`;\n }\n\n return message;\n }\n\n function log(level: LogLevel, message: string, data?: Record<string, unknown>, error?: Error): void {\n if (!shouldLog(level)) return;\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n context: loggerContext,\n data,\n error,\n };\n\n const formatted = formatEntry(entry);\n\n if (loggerOptions.output === 'console' || loggerOptions.output === 'both') {\n switch (level) {\n case 'debug':\n case 'info':\n console.log(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n case 'error':\n console.error(formatted);\n break;\n }\n }\n }\n\n const logger: Logger = {\n debug(message: string, data?: Record<string, unknown>): void {\n log('debug', message, data);\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n log('info', message, data);\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n log('warn', message, data);\n },\n\n error(message: string, error?: Error, data?: Record<string, unknown>): void {\n log('error', message, data, error);\n },\n\n setLevel(level: LogLevel): void {\n loggerOptions.level = level;\n },\n\n setContext(newContext: string): Logger {\n return createLogger(newContext, loggerOptions);\n },\n\n child(childContext: string): Logger {\n const fullContext = loggerContext ? `${loggerContext}:${childContext}` : childContext;\n return createLogger(fullContext, loggerOptions);\n },\n };\n\n return logger;\n}\n\n"],"names":["LOG_LEVELS","LOG_COLORS","RESET","globalLogLevel","setGlobalLogLevel","level","createLogger","context","options","loggerContext","loggerOptions","shouldLog","formatEntry","entry","timestamp","levelStr","contextStr","message","log","data","error","formatted","newContext","childContext","fullContext"],"mappings":"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"}
1
+ {"version":3,"file":"logger-D-lfaRWQ.js","sources":["../src/utils/logger.ts"],"sourcesContent":["import type { Logger, LogLevel, LogEntry, LoggerOptions } from '../types';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nconst LOG_COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m',\n info: '\\x1b[32m',\n warn: '\\x1b[33m',\n error: '\\x1b[31m',\n silent: '',\n};\n\nconst RESET = '\\x1b[0m';\n\nlet globalLogLevel: LogLevel = 'info';\nlet globalEnabled = true;\n\nexport function setGlobalLogLevel(level: LogLevel): void {\n globalLogLevel = level;\n}\n\nexport function setGlobalLogging(enabled: boolean): void {\n globalEnabled = enabled;\n}\n\nexport function createLogger(context?: string, options?: Partial<LoggerOptions>): Logger {\n const loggerContext = context ?? 'harbor';\n const loggerOptions: LoggerOptions = {\n level: options?.level ?? globalLogLevel,\n format: options?.format ?? 'text',\n output: options?.output ?? 'console',\n colorize: options?.colorize ?? true,\n prefix: options?.prefix,\n filePath: options?.filePath,\n };\n\n function shouldLog(level: LogLevel): boolean {\n if (!globalEnabled) return false;\n return LOG_LEVELS[level] >= LOG_LEVELS[loggerOptions.level];\n }\n\n function formatEntry(entry: LogEntry): string {\n if (loggerOptions.format === 'json') {\n return JSON.stringify({\n timestamp: entry.timestamp.toISOString(),\n level: entry.level,\n context: entry.context,\n message: entry.message,\n data: entry.data,\n error: entry.error ? {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n } : undefined,\n });\n }\n\n const timestamp = entry.timestamp.toISOString();\n const levelStr = entry.level.toUpperCase().padEnd(5);\n const contextStr = entry.context ? `[${entry.context}]` : '';\n \n let message = `${timestamp} ${levelStr} ${contextStr} ${entry.message}`;\n\n if (entry.data && Object.keys(entry.data).length > 0) {\n message += ` ${JSON.stringify(entry.data)}`;\n }\n\n if (entry.error) {\n message += `\\n${entry.error.stack ?? entry.error.message}`;\n }\n\n if (loggerOptions.colorize) {\n const color = LOG_COLORS[entry.level];\n message = `${color}${message}${RESET}`;\n }\n\n return message;\n }\n\n function log(level: LogLevel, message: string, data?: Record<string, unknown>, error?: Error): void {\n if (!shouldLog(level)) return;\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: new Date(),\n context: loggerContext,\n data,\n error,\n };\n\n const formatted = formatEntry(entry);\n\n if (loggerOptions.output === 'console' || loggerOptions.output === 'both') {\n switch (level) {\n case 'debug':\n case 'info':\n console.log(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n case 'error':\n console.error(formatted);\n break;\n }\n }\n }\n\n const logger: Logger = {\n debug(message: string, data?: Record<string, unknown>): void {\n log('debug', message, data);\n },\n\n info(message: string, data?: Record<string, unknown>): void {\n log('info', message, data);\n },\n\n warn(message: string, data?: Record<string, unknown>): void {\n log('warn', message, data);\n },\n\n error(message: string, error?: Error, data?: Record<string, unknown>): void {\n log('error', message, data, error);\n },\n\n setLevel(level: LogLevel): void {\n loggerOptions.level = level;\n },\n\n setContext(newContext: string): Logger {\n return createLogger(newContext, loggerOptions);\n },\n\n child(childContext: string): Logger {\n const fullContext = loggerContext ? `${loggerContext}:${childContext}` : childContext;\n return createLogger(fullContext, loggerOptions);\n },\n };\n\n return logger;\n}\n\n"],"names":["LOG_LEVELS","LOG_COLORS","RESET","globalLogLevel","setGlobalLogLevel","level","createLogger","context","options","loggerContext","loggerOptions","shouldLog","formatEntry","entry","timestamp","levelStr","contextStr","message","log","data","error","formatted","newContext","childContext","fullContext"],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ import { exec as f } from "child_process";
2
+ import { promisify as g } from "util";
3
+ import { c as $ } from "./logger-CZn7QxCl.mjs";
4
+ const h = g(f), s = $("docker");
5
+ function C(c = {}) {
6
+ const r = c.composePath ?? "./docker-compose.yml", a = c.projectName;
7
+ async function o(e) {
8
+ try {
9
+ s.debug(`Executing: ${e}`);
10
+ const { stdout: t, stderr: n } = await h(e);
11
+ return n && s.warn(`Command stderr: ${n}`), t.trim();
12
+ } catch (t) {
13
+ throw s.error(`Command failed: ${e}`, t), t;
14
+ }
15
+ }
16
+ function p(e) {
17
+ const t = e.toLowerCase();
18
+ return t.includes("running") ? "running" : t.includes("exited") ? "exited" : t.includes("created") ? "created" : t.includes("paused") ? "paused" : t.includes("restarting") ? "restarting" : t.includes("removing") ? "removing" : t.includes("dead") ? "dead" : "exited";
19
+ }
20
+ return {
21
+ async listContainers() {
22
+ const e = await o(
23
+ 'docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}"'
24
+ );
25
+ return e ? e.split(`
26
+ `).map((t) => {
27
+ const [n, i, m, u, l, d] = t.split("|");
28
+ return {
29
+ id: n,
30
+ name: i,
31
+ image: m,
32
+ status: p(u),
33
+ ports: w(l),
34
+ createdAt: new Date(d)
35
+ };
36
+ }) : [];
37
+ },
38
+ async listImages() {
39
+ const e = await o(
40
+ 'docker images --format "{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}"'
41
+ );
42
+ return e ? e.split(`
43
+ `).map((t) => {
44
+ const [n, i, m, u, l] = t.split("|");
45
+ return {
46
+ id: n,
47
+ name: i,
48
+ tag: m,
49
+ size: y(u),
50
+ createdAt: new Date(l)
51
+ };
52
+ }) : [];
53
+ },
54
+ async startContainer(e) {
55
+ await o(`docker start ${e}`), s.info(`Container started: ${e}`);
56
+ },
57
+ async stopContainer(e) {
58
+ await o(`docker stop ${e}`), s.info(`Container stopped: ${e}`);
59
+ },
60
+ async restartContainer(e) {
61
+ await o(`docker restart ${e}`), s.info(`Container restarted: ${e}`);
62
+ },
63
+ async removeContainer(e, t = !1) {
64
+ await o(`docker rm ${t ? "-f" : ""} ${e}`), s.info(`Container removed: ${e}`);
65
+ },
66
+ async buildImage(e, t = "latest", n) {
67
+ let i = `docker build -t ${e}:${t}`;
68
+ if (n?.noCache && (i += " --no-cache"), n?.pull && (i += " --pull"), n?.target && (i += ` --target ${n.target}`), n?.platform && (i += ` --platform ${n.platform}`), n?.buildArgs)
69
+ for (const [m, u] of Object.entries(n.buildArgs))
70
+ i += ` --build-arg ${m}=${u}`;
71
+ i += " .", await o(i), s.info(`Image built: ${e}:${t}`);
72
+ },
73
+ async pushImage(e, t = "latest") {
74
+ const n = c.registry ? `${c.registry}/${e}:${t}` : `${e}:${t}`;
75
+ await o(`docker push ${n}`), s.info(`Image pushed: ${n}`);
76
+ },
77
+ async pullImage(e, t = "latest") {
78
+ await o(`docker pull ${e}:${t}`), s.info(`Image pulled: ${e}:${t}`);
79
+ },
80
+ async composeUp(e = !0) {
81
+ let t = `docker-compose -f ${r}`;
82
+ a && (t += ` -p ${a}`), t += " up", e && (t += " -d"), await o(t), s.info("Docker Compose up completed");
83
+ },
84
+ async composeDown(e = !1) {
85
+ let t = `docker-compose -f ${r}`;
86
+ a && (t += ` -p ${a}`), t += " down", e && (t += " -v"), await o(t), s.info("Docker Compose down completed");
87
+ },
88
+ async composeLogs(e, t = !1) {
89
+ let n = `docker-compose -f ${r}`;
90
+ return a && (n += ` -p ${a}`), n += " logs", t && (n += " -f"), e && (n += ` ${e}`), o(n);
91
+ },
92
+ async exec(e, t) {
93
+ return o(`docker exec ${e} ${t}`);
94
+ }
95
+ };
96
+ }
97
+ function w(c) {
98
+ return c ? c.split(",").map((r) => {
99
+ const a = r.match(/(\d+):(\d+)\/(\w+)/);
100
+ return a ? {
101
+ external: parseInt(a[1], 10),
102
+ internal: parseInt(a[2], 10),
103
+ protocol: a[3]
104
+ } : {
105
+ external: 0,
106
+ internal: 0,
107
+ protocol: "tcp"
108
+ };
109
+ }).filter((r) => r.internal > 0) : [];
110
+ }
111
+ function y(c) {
112
+ const r = c.match(/([\d.]+)\s*(GB|MB|KB|B)/i);
113
+ if (!r) return 0;
114
+ const a = parseFloat(r[1]);
115
+ switch (r[2].toUpperCase()) {
116
+ case "GB":
117
+ return a * 1024 * 1024 * 1024;
118
+ case "MB":
119
+ return a * 1024 * 1024;
120
+ case "KB":
121
+ return a * 1024;
122
+ default:
123
+ return a;
124
+ }
125
+ }
126
+ class b {
127
+ manager;
128
+ constructor(r = {}) {
129
+ this.manager = C(r);
130
+ }
131
+ listContainers = () => this.manager.listContainers();
132
+ listImages = () => this.manager.listImages();
133
+ startContainer = (r) => this.manager.startContainer(r);
134
+ stopContainer = (r) => this.manager.stopContainer(r);
135
+ restartContainer = (r) => this.manager.restartContainer(r);
136
+ removeContainer = (r, a) => this.manager.removeContainer(r, a);
137
+ buildImage = (r, a) => this.manager.buildImage(r, a);
138
+ pushImage = (r, a) => this.manager.pushImage(r, a);
139
+ pullImage = (r, a) => this.manager.pullImage(r, a);
140
+ composeUp = (r) => this.manager.composeUp(r);
141
+ composeDown = (r) => this.manager.composeDown(r);
142
+ composeLogs = (r, a) => this.manager.composeLogs(r, a);
143
+ exec = (r, a) => this.manager.exec(r, a);
144
+ }
145
+ export {
146
+ b as D,
147
+ C as c
148
+ };
149
+ //# sourceMappingURL=manager-CjcKb4P9.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager-B6vqJgEn.mjs","sources":["../src/docker/manager.ts"],"sourcesContent":["import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type {\n DockerManager as IDockerManager,\n DockerManagerConfig,\n DockerContainer,\n DockerImage,\n ContainerStatus,\n DockerBuildOptions,\n} from '../types';\nimport { createLogger } from '../utils/logger';\n\nconst execAsync = promisify(exec);\nconst logger = createLogger('docker');\n\nexport function createDockerManager(config: DockerManagerConfig = {}): IDockerManager {\n const composePath = config.composePath ?? './docker-compose.yml';\n const projectName = config.projectName;\n\n async function runCommand(command: string): Promise<string> {\n try {\n logger.debug(`Executing: ${command}`);\n const { stdout, stderr } = await execAsync(command);\n if (stderr) {\n logger.warn(`Command stderr: ${stderr}`);\n }\n return stdout.trim();\n } catch (error) {\n logger.error(`Command failed: ${command}`, error as Error);\n throw error;\n }\n }\n\n function parseContainerStatus(status: string): ContainerStatus {\n const statusLower = status.toLowerCase();\n if (statusLower.includes('running')) return 'running';\n if (statusLower.includes('exited')) return 'exited';\n if (statusLower.includes('created')) return 'created';\n if (statusLower.includes('paused')) return 'paused';\n if (statusLower.includes('restarting')) return 'restarting';\n if (statusLower.includes('removing')) return 'removing';\n if (statusLower.includes('dead')) return 'dead';\n return 'exited';\n }\n\n const manager: IDockerManager = {\n async listContainers(): Promise<DockerContainer[]> {\n const output = await runCommand(\n 'docker ps -a --format \"{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, image, status, ports, createdAt] = line.split('|');\n return {\n id,\n name,\n image,\n status: parseContainerStatus(status),\n ports: parsePorts(ports),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async listImages(): Promise<DockerImage[]> {\n const output = await runCommand(\n 'docker images --format \"{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, tag, size, createdAt] = line.split('|');\n return {\n id,\n name,\n tag,\n size: parseSize(size),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async startContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker start ${nameOrId}`);\n logger.info(`Container started: ${nameOrId}`);\n },\n\n async stopContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker stop ${nameOrId}`);\n logger.info(`Container stopped: ${nameOrId}`);\n },\n\n async restartContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker restart ${nameOrId}`);\n logger.info(`Container restarted: ${nameOrId}`);\n },\n\n async removeContainer(nameOrId: string, force = false): Promise<void> {\n const forceFlag = force ? '-f' : '';\n await runCommand(`docker rm ${forceFlag} ${nameOrId}`);\n logger.info(`Container removed: ${nameOrId}`);\n },\n\n async buildImage(name: string, tag = 'latest', options?: DockerBuildOptions): Promise<void> {\n let command = `docker build -t ${name}:${tag}`;\n \n if (options?.noCache) command += ' --no-cache';\n if (options?.pull) command += ' --pull';\n if (options?.target) command += ` --target ${options.target}`;\n if (options?.platform) command += ` --platform ${options.platform}`;\n \n if (options?.buildArgs) {\n for (const [key, value] of Object.entries(options.buildArgs)) {\n command += ` --build-arg ${key}=${value}`;\n }\n }\n \n command += ' .';\n \n await runCommand(command);\n logger.info(`Image built: ${name}:${tag}`);\n },\n\n async pushImage(name: string, tag = 'latest'): Promise<void> {\n const fullName = config.registry \n ? `${config.registry}/${name}:${tag}` \n : `${name}:${tag}`;\n \n await runCommand(`docker push ${fullName}`);\n logger.info(`Image pushed: ${fullName}`);\n },\n\n async pullImage(name: string, tag = 'latest'): Promise<void> {\n await runCommand(`docker pull ${name}:${tag}`);\n logger.info(`Image pulled: ${name}:${tag}`);\n },\n\n async composeUp(detach = true): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' up';\n if (detach) command += ' -d';\n \n await runCommand(command);\n logger.info('Docker Compose up completed');\n },\n\n async composeDown(removeVolumes = false): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' down';\n if (removeVolumes) command += ' -v';\n \n await runCommand(command);\n logger.info('Docker Compose down completed');\n },\n\n async composeLogs(service?: string, follow = false): Promise<string> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' logs';\n if (follow) command += ' -f';\n if (service) command += ` ${service}`;\n \n return runCommand(command);\n },\n\n async exec(container: string, command: string): Promise<string> {\n return runCommand(`docker exec ${container} ${command}`);\n },\n };\n\n return manager;\n}\n\nfunction parsePorts(portsStr: string): DockerContainer['ports'] {\n if (!portsStr) return [];\n \n return portsStr.split(',').map((port) => {\n const match = port.match(/(\\d+):(\\d+)\\/(\\w+)/);\n if (match) {\n return {\n external: parseInt(match[1], 10),\n internal: parseInt(match[2], 10),\n protocol: match[3] as 'tcp' | 'udp',\n };\n }\n return {\n external: 0,\n internal: 0,\n protocol: 'tcp' as const,\n };\n }).filter((p) => p.internal > 0);\n}\n\nfunction parseSize(sizeStr: string): number {\n const match = sizeStr.match(/([\\d.]+)\\s*(GB|MB|KB|B)/i);\n if (!match) return 0;\n \n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n \n switch (unit) {\n case 'GB': return value * 1024 * 1024 * 1024;\n case 'MB': return value * 1024 * 1024;\n case 'KB': return value * 1024;\n default: return value;\n }\n}\n\nexport class DockerManager implements IDockerManager {\n private manager: IDockerManager;\n\n constructor(config: DockerManagerConfig = {}) {\n this.manager = createDockerManager(config);\n }\n\n listContainers = () => this.manager.listContainers();\n listImages = () => this.manager.listImages();\n startContainer = (nameOrId: string) => this.manager.startContainer(nameOrId);\n stopContainer = (nameOrId: string) => this.manager.stopContainer(nameOrId);\n restartContainer = (nameOrId: string) => this.manager.restartContainer(nameOrId);\n removeContainer = (nameOrId: string, force?: boolean) => this.manager.removeContainer(nameOrId, force);\n buildImage = (name: string, tag?: string) => this.manager.buildImage(name, tag);\n pushImage = (name: string, tag?: string) => this.manager.pushImage(name, tag);\n pullImage = (name: string, tag?: string) => this.manager.pullImage(name, tag);\n composeUp = (detach?: boolean) => this.manager.composeUp(detach);\n composeDown = (removeVolumes?: boolean) => this.manager.composeDown(removeVolumes);\n composeLogs = (service?: string, follow?: boolean) => this.manager.composeLogs(service, follow);\n exec = (container: string, command: string) => this.manager.exec(container, command);\n}\n\n"],"names":["execAsync","promisify","exec","logger","createLogger","createDockerManager","config","composePath","projectName","runCommand","command","stdout","stderr","error","parseContainerStatus","status","statusLower","output","line","id","name","image","ports","createdAt","parsePorts","tag","size","parseSize","nameOrId","force","options","key","value","fullName","detach","removeVolumes","service","follow","container","portsStr","port","match","p","sizeStr","DockerManager","__publicField"],"mappings":"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"}
1
+ {"version":3,"file":"manager-CjcKb4P9.mjs","sources":["../src/docker/manager.ts"],"sourcesContent":["import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type {\n DockerManager as IDockerManager,\n DockerManagerConfig,\n DockerContainer,\n DockerImage,\n ContainerStatus,\n DockerBuildOptions,\n} from '../types';\nimport { createLogger } from '../utils/logger';\n\nconst execAsync = promisify(exec);\nconst logger = createLogger('docker');\n\nexport function createDockerManager(config: DockerManagerConfig = {}): IDockerManager {\n const composePath = config.composePath ?? './docker-compose.yml';\n const projectName = config.projectName;\n\n async function runCommand(command: string): Promise<string> {\n try {\n logger.debug(`Executing: ${command}`);\n const { stdout, stderr } = await execAsync(command);\n if (stderr) {\n logger.warn(`Command stderr: ${stderr}`);\n }\n return stdout.trim();\n } catch (error) {\n logger.error(`Command failed: ${command}`, error as Error);\n throw error;\n }\n }\n\n function parseContainerStatus(status: string): ContainerStatus {\n const statusLower = status.toLowerCase();\n if (statusLower.includes('running')) return 'running';\n if (statusLower.includes('exited')) return 'exited';\n if (statusLower.includes('created')) return 'created';\n if (statusLower.includes('paused')) return 'paused';\n if (statusLower.includes('restarting')) return 'restarting';\n if (statusLower.includes('removing')) return 'removing';\n if (statusLower.includes('dead')) return 'dead';\n return 'exited';\n }\n\n const manager: IDockerManager = {\n async listContainers(): Promise<DockerContainer[]> {\n const output = await runCommand(\n 'docker ps -a --format \"{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, image, status, ports, createdAt] = line.split('|');\n return {\n id,\n name,\n image,\n status: parseContainerStatus(status),\n ports: parsePorts(ports),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async listImages(): Promise<DockerImage[]> {\n const output = await runCommand(\n 'docker images --format \"{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, tag, size, createdAt] = line.split('|');\n return {\n id,\n name,\n tag,\n size: parseSize(size),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async startContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker start ${nameOrId}`);\n logger.info(`Container started: ${nameOrId}`);\n },\n\n async stopContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker stop ${nameOrId}`);\n logger.info(`Container stopped: ${nameOrId}`);\n },\n\n async restartContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker restart ${nameOrId}`);\n logger.info(`Container restarted: ${nameOrId}`);\n },\n\n async removeContainer(nameOrId: string, force = false): Promise<void> {\n const forceFlag = force ? '-f' : '';\n await runCommand(`docker rm ${forceFlag} ${nameOrId}`);\n logger.info(`Container removed: ${nameOrId}`);\n },\n\n async buildImage(name: string, tag = 'latest', options?: DockerBuildOptions): Promise<void> {\n let command = `docker build -t ${name}:${tag}`;\n \n if (options?.noCache) command += ' --no-cache';\n if (options?.pull) command += ' --pull';\n if (options?.target) command += ` --target ${options.target}`;\n if (options?.platform) command += ` --platform ${options.platform}`;\n \n if (options?.buildArgs) {\n for (const [key, value] of Object.entries(options.buildArgs)) {\n command += ` --build-arg ${key}=${value}`;\n }\n }\n \n command += ' .';\n \n await runCommand(command);\n logger.info(`Image built: ${name}:${tag}`);\n },\n\n async pushImage(name: string, tag = 'latest'): Promise<void> {\n const fullName = config.registry \n ? `${config.registry}/${name}:${tag}` \n : `${name}:${tag}`;\n \n await runCommand(`docker push ${fullName}`);\n logger.info(`Image pushed: ${fullName}`);\n },\n\n async pullImage(name: string, tag = 'latest'): Promise<void> {\n await runCommand(`docker pull ${name}:${tag}`);\n logger.info(`Image pulled: ${name}:${tag}`);\n },\n\n async composeUp(detach = true): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' up';\n if (detach) command += ' -d';\n \n await runCommand(command);\n logger.info('Docker Compose up completed');\n },\n\n async composeDown(removeVolumes = false): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' down';\n if (removeVolumes) command += ' -v';\n \n await runCommand(command);\n logger.info('Docker Compose down completed');\n },\n\n async composeLogs(service?: string, follow = false): Promise<string> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' logs';\n if (follow) command += ' -f';\n if (service) command += ` ${service}`;\n \n return runCommand(command);\n },\n\n async exec(container: string, command: string): Promise<string> {\n return runCommand(`docker exec ${container} ${command}`);\n },\n };\n\n return manager;\n}\n\nfunction parsePorts(portsStr: string): DockerContainer['ports'] {\n if (!portsStr) return [];\n \n return portsStr.split(',').map((port) => {\n const match = port.match(/(\\d+):(\\d+)\\/(\\w+)/);\n if (match) {\n return {\n external: parseInt(match[1], 10),\n internal: parseInt(match[2], 10),\n protocol: match[3] as 'tcp' | 'udp',\n };\n }\n return {\n external: 0,\n internal: 0,\n protocol: 'tcp' as const,\n };\n }).filter((p) => p.internal > 0);\n}\n\nfunction parseSize(sizeStr: string): number {\n const match = sizeStr.match(/([\\d.]+)\\s*(GB|MB|KB|B)/i);\n if (!match) return 0;\n \n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n \n switch (unit) {\n case 'GB': return value * 1024 * 1024 * 1024;\n case 'MB': return value * 1024 * 1024;\n case 'KB': return value * 1024;\n default: return value;\n }\n}\n\nexport class DockerManager implements IDockerManager {\n private manager: IDockerManager;\n\n constructor(config: DockerManagerConfig = {}) {\n this.manager = createDockerManager(config);\n }\n\n listContainers = () => this.manager.listContainers();\n listImages = () => this.manager.listImages();\n startContainer = (nameOrId: string) => this.manager.startContainer(nameOrId);\n stopContainer = (nameOrId: string) => this.manager.stopContainer(nameOrId);\n restartContainer = (nameOrId: string) => this.manager.restartContainer(nameOrId);\n removeContainer = (nameOrId: string, force?: boolean) => this.manager.removeContainer(nameOrId, force);\n buildImage = (name: string, tag?: string) => this.manager.buildImage(name, tag);\n pushImage = (name: string, tag?: string) => this.manager.pushImage(name, tag);\n pullImage = (name: string, tag?: string) => this.manager.pullImage(name, tag);\n composeUp = (detach?: boolean) => this.manager.composeUp(detach);\n composeDown = (removeVolumes?: boolean) => this.manager.composeDown(removeVolumes);\n composeLogs = (service?: string, follow?: boolean) => this.manager.composeLogs(service, follow);\n exec = (container: string, command: string) => this.manager.exec(container, command);\n}\n\n"],"names":["execAsync","promisify","exec","logger","createLogger","createDockerManager","config","composePath","projectName","runCommand","command","stdout","stderr","error","parseContainerStatus","status","statusLower","output","line","id","name","image","ports","createdAt","parsePorts","tag","size","parseSize","nameOrId","force","options","key","value","fullName","detach","removeVolumes","service","follow","container","portsStr","port","match","p","sizeStr","DockerManager"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";const f=require("child_process"),$=require("util"),h=require("./logger-D-lfaRWQ.js"),C=$.promisify(f.exec),o=h.createLogger("docker");function p(c={}){const r=c.composePath??"./docker-compose.yml",a=c.projectName;async function s(e){try{o.debug(`Executing: ${e}`);const{stdout:t,stderr:n}=await C(e);return n&&o.warn(`Command stderr: ${n}`),t.trim()}catch(t){throw o.error(`Command failed: ${e}`,t),t}}function d(e){const t=e.toLowerCase();return t.includes("running")?"running":t.includes("exited")?"exited":t.includes("created")?"created":t.includes("paused")?"paused":t.includes("restarting")?"restarting":t.includes("removing")?"removing":t.includes("dead")?"dead":"exited"}return{async listContainers(){const e=await s('docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}"');return e?e.split(`
2
+ `).map(t=>{const[n,i,u,m,l,g]=t.split("|");return{id:n,name:i,image:u,status:d(m),ports:w(l),createdAt:new Date(g)}}):[]},async listImages(){const e=await s('docker images --format "{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}"');return e?e.split(`
3
+ `).map(t=>{const[n,i,u,m,l]=t.split("|");return{id:n,name:i,tag:u,size:k(m),createdAt:new Date(l)}}):[]},async startContainer(e){await s(`docker start ${e}`),o.info(`Container started: ${e}`)},async stopContainer(e){await s(`docker stop ${e}`),o.info(`Container stopped: ${e}`)},async restartContainer(e){await s(`docker restart ${e}`),o.info(`Container restarted: ${e}`)},async removeContainer(e,t=!1){await s(`docker rm ${t?"-f":""} ${e}`),o.info(`Container removed: ${e}`)},async buildImage(e,t="latest",n){let i=`docker build -t ${e}:${t}`;if(n?.noCache&&(i+=" --no-cache"),n?.pull&&(i+=" --pull"),n?.target&&(i+=` --target ${n.target}`),n?.platform&&(i+=` --platform ${n.platform}`),n?.buildArgs)for(const[u,m]of Object.entries(n.buildArgs))i+=` --build-arg ${u}=${m}`;i+=" .",await s(i),o.info(`Image built: ${e}:${t}`)},async pushImage(e,t="latest"){const n=c.registry?`${c.registry}/${e}:${t}`:`${e}:${t}`;await s(`docker push ${n}`),o.info(`Image pushed: ${n}`)},async pullImage(e,t="latest"){await s(`docker pull ${e}:${t}`),o.info(`Image pulled: ${e}:${t}`)},async composeUp(e=!0){let t=`docker-compose -f ${r}`;a&&(t+=` -p ${a}`),t+=" up",e&&(t+=" -d"),await s(t),o.info("Docker Compose up completed")},async composeDown(e=!1){let t=`docker-compose -f ${r}`;a&&(t+=` -p ${a}`),t+=" down",e&&(t+=" -v"),await s(t),o.info("Docker Compose down completed")},async composeLogs(e,t=!1){let n=`docker-compose -f ${r}`;return a&&(n+=` -p ${a}`),n+=" logs",t&&(n+=" -f"),e&&(n+=` ${e}`),s(n)},async exec(e,t){return s(`docker exec ${e} ${t}`)}}}function w(c){return c?c.split(",").map(r=>{const a=r.match(/(\d+):(\d+)\/(\w+)/);return a?{external:parseInt(a[1],10),internal:parseInt(a[2],10),protocol:a[3]}:{external:0,internal:0,protocol:"tcp"}}).filter(r=>r.internal>0):[]}function k(c){const r=c.match(/([\d.]+)\s*(GB|MB|KB|B)/i);if(!r)return 0;const a=parseFloat(r[1]);switch(r[2].toUpperCase()){case"GB":return a*1024*1024*1024;case"MB":return a*1024*1024;case"KB":return a*1024;default:return a}}class y{manager;constructor(r={}){this.manager=p(r)}listContainers=()=>this.manager.listContainers();listImages=()=>this.manager.listImages();startContainer=r=>this.manager.startContainer(r);stopContainer=r=>this.manager.stopContainer(r);restartContainer=r=>this.manager.restartContainer(r);removeContainer=(r,a)=>this.manager.removeContainer(r,a);buildImage=(r,a)=>this.manager.buildImage(r,a);pushImage=(r,a)=>this.manager.pushImage(r,a);pullImage=(r,a)=>this.manager.pullImage(r,a);composeUp=r=>this.manager.composeUp(r);composeDown=r=>this.manager.composeDown(r);composeLogs=(r,a)=>this.manager.composeLogs(r,a);exec=(r,a)=>this.manager.exec(r,a)}exports.DockerManager=y;exports.createDockerManager=p;
4
+ //# sourceMappingURL=manager-DrF1vbJg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager-B1UKMjXW.js","sources":["../src/docker/manager.ts"],"sourcesContent":["import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type {\n DockerManager as IDockerManager,\n DockerManagerConfig,\n DockerContainer,\n DockerImage,\n ContainerStatus,\n DockerBuildOptions,\n} from '../types';\nimport { createLogger } from '../utils/logger';\n\nconst execAsync = promisify(exec);\nconst logger = createLogger('docker');\n\nexport function createDockerManager(config: DockerManagerConfig = {}): IDockerManager {\n const composePath = config.composePath ?? './docker-compose.yml';\n const projectName = config.projectName;\n\n async function runCommand(command: string): Promise<string> {\n try {\n logger.debug(`Executing: ${command}`);\n const { stdout, stderr } = await execAsync(command);\n if (stderr) {\n logger.warn(`Command stderr: ${stderr}`);\n }\n return stdout.trim();\n } catch (error) {\n logger.error(`Command failed: ${command}`, error as Error);\n throw error;\n }\n }\n\n function parseContainerStatus(status: string): ContainerStatus {\n const statusLower = status.toLowerCase();\n if (statusLower.includes('running')) return 'running';\n if (statusLower.includes('exited')) return 'exited';\n if (statusLower.includes('created')) return 'created';\n if (statusLower.includes('paused')) return 'paused';\n if (statusLower.includes('restarting')) return 'restarting';\n if (statusLower.includes('removing')) return 'removing';\n if (statusLower.includes('dead')) return 'dead';\n return 'exited';\n }\n\n const manager: IDockerManager = {\n async listContainers(): Promise<DockerContainer[]> {\n const output = await runCommand(\n 'docker ps -a --format \"{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, image, status, ports, createdAt] = line.split('|');\n return {\n id,\n name,\n image,\n status: parseContainerStatus(status),\n ports: parsePorts(ports),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async listImages(): Promise<DockerImage[]> {\n const output = await runCommand(\n 'docker images --format \"{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, tag, size, createdAt] = line.split('|');\n return {\n id,\n name,\n tag,\n size: parseSize(size),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async startContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker start ${nameOrId}`);\n logger.info(`Container started: ${nameOrId}`);\n },\n\n async stopContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker stop ${nameOrId}`);\n logger.info(`Container stopped: ${nameOrId}`);\n },\n\n async restartContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker restart ${nameOrId}`);\n logger.info(`Container restarted: ${nameOrId}`);\n },\n\n async removeContainer(nameOrId: string, force = false): Promise<void> {\n const forceFlag = force ? '-f' : '';\n await runCommand(`docker rm ${forceFlag} ${nameOrId}`);\n logger.info(`Container removed: ${nameOrId}`);\n },\n\n async buildImage(name: string, tag = 'latest', options?: DockerBuildOptions): Promise<void> {\n let command = `docker build -t ${name}:${tag}`;\n \n if (options?.noCache) command += ' --no-cache';\n if (options?.pull) command += ' --pull';\n if (options?.target) command += ` --target ${options.target}`;\n if (options?.platform) command += ` --platform ${options.platform}`;\n \n if (options?.buildArgs) {\n for (const [key, value] of Object.entries(options.buildArgs)) {\n command += ` --build-arg ${key}=${value}`;\n }\n }\n \n command += ' .';\n \n await runCommand(command);\n logger.info(`Image built: ${name}:${tag}`);\n },\n\n async pushImage(name: string, tag = 'latest'): Promise<void> {\n const fullName = config.registry \n ? `${config.registry}/${name}:${tag}` \n : `${name}:${tag}`;\n \n await runCommand(`docker push ${fullName}`);\n logger.info(`Image pushed: ${fullName}`);\n },\n\n async pullImage(name: string, tag = 'latest'): Promise<void> {\n await runCommand(`docker pull ${name}:${tag}`);\n logger.info(`Image pulled: ${name}:${tag}`);\n },\n\n async composeUp(detach = true): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' up';\n if (detach) command += ' -d';\n \n await runCommand(command);\n logger.info('Docker Compose up completed');\n },\n\n async composeDown(removeVolumes = false): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' down';\n if (removeVolumes) command += ' -v';\n \n await runCommand(command);\n logger.info('Docker Compose down completed');\n },\n\n async composeLogs(service?: string, follow = false): Promise<string> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' logs';\n if (follow) command += ' -f';\n if (service) command += ` ${service}`;\n \n return runCommand(command);\n },\n\n async exec(container: string, command: string): Promise<string> {\n return runCommand(`docker exec ${container} ${command}`);\n },\n };\n\n return manager;\n}\n\nfunction parsePorts(portsStr: string): DockerContainer['ports'] {\n if (!portsStr) return [];\n \n return portsStr.split(',').map((port) => {\n const match = port.match(/(\\d+):(\\d+)\\/(\\w+)/);\n if (match) {\n return {\n external: parseInt(match[1], 10),\n internal: parseInt(match[2], 10),\n protocol: match[3] as 'tcp' | 'udp',\n };\n }\n return {\n external: 0,\n internal: 0,\n protocol: 'tcp' as const,\n };\n }).filter((p) => p.internal > 0);\n}\n\nfunction parseSize(sizeStr: string): number {\n const match = sizeStr.match(/([\\d.]+)\\s*(GB|MB|KB|B)/i);\n if (!match) return 0;\n \n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n \n switch (unit) {\n case 'GB': return value * 1024 * 1024 * 1024;\n case 'MB': return value * 1024 * 1024;\n case 'KB': return value * 1024;\n default: return value;\n }\n}\n\nexport class DockerManager implements IDockerManager {\n private manager: IDockerManager;\n\n constructor(config: DockerManagerConfig = {}) {\n this.manager = createDockerManager(config);\n }\n\n listContainers = () => this.manager.listContainers();\n listImages = () => this.manager.listImages();\n startContainer = (nameOrId: string) => this.manager.startContainer(nameOrId);\n stopContainer = (nameOrId: string) => this.manager.stopContainer(nameOrId);\n restartContainer = (nameOrId: string) => this.manager.restartContainer(nameOrId);\n removeContainer = (nameOrId: string, force?: boolean) => this.manager.removeContainer(nameOrId, force);\n buildImage = (name: string, tag?: string) => this.manager.buildImage(name, tag);\n pushImage = (name: string, tag?: string) => this.manager.pushImage(name, tag);\n pullImage = (name: string, tag?: string) => this.manager.pullImage(name, tag);\n composeUp = (detach?: boolean) => this.manager.composeUp(detach);\n composeDown = (removeVolumes?: boolean) => this.manager.composeDown(removeVolumes);\n composeLogs = (service?: string, follow?: boolean) => this.manager.composeLogs(service, follow);\n exec = (container: string, command: string) => this.manager.exec(container, command);\n}\n\n"],"names":["execAsync","promisify","exec","logger","createLogger","createDockerManager","config","composePath","projectName","runCommand","command","stdout","stderr","error","parseContainerStatus","status","statusLower","output","line","id","name","image","ports","createdAt","parsePorts","tag","size","parseSize","nameOrId","force","options","key","value","fullName","detach","removeVolumes","service","follow","container","portsStr","port","match","p","sizeStr","DockerManager","__publicField"],"mappings":"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"}
1
+ {"version":3,"file":"manager-DrF1vbJg.js","sources":["../src/docker/manager.ts"],"sourcesContent":["import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type {\n DockerManager as IDockerManager,\n DockerManagerConfig,\n DockerContainer,\n DockerImage,\n ContainerStatus,\n DockerBuildOptions,\n} from '../types';\nimport { createLogger } from '../utils/logger';\n\nconst execAsync = promisify(exec);\nconst logger = createLogger('docker');\n\nexport function createDockerManager(config: DockerManagerConfig = {}): IDockerManager {\n const composePath = config.composePath ?? './docker-compose.yml';\n const projectName = config.projectName;\n\n async function runCommand(command: string): Promise<string> {\n try {\n logger.debug(`Executing: ${command}`);\n const { stdout, stderr } = await execAsync(command);\n if (stderr) {\n logger.warn(`Command stderr: ${stderr}`);\n }\n return stdout.trim();\n } catch (error) {\n logger.error(`Command failed: ${command}`, error as Error);\n throw error;\n }\n }\n\n function parseContainerStatus(status: string): ContainerStatus {\n const statusLower = status.toLowerCase();\n if (statusLower.includes('running')) return 'running';\n if (statusLower.includes('exited')) return 'exited';\n if (statusLower.includes('created')) return 'created';\n if (statusLower.includes('paused')) return 'paused';\n if (statusLower.includes('restarting')) return 'restarting';\n if (statusLower.includes('removing')) return 'removing';\n if (statusLower.includes('dead')) return 'dead';\n return 'exited';\n }\n\n const manager: IDockerManager = {\n async listContainers(): Promise<DockerContainer[]> {\n const output = await runCommand(\n 'docker ps -a --format \"{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, image, status, ports, createdAt] = line.split('|');\n return {\n id,\n name,\n image,\n status: parseContainerStatus(status),\n ports: parsePorts(ports),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async listImages(): Promise<DockerImage[]> {\n const output = await runCommand(\n 'docker images --format \"{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}\"'\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [id, name, tag, size, createdAt] = line.split('|');\n return {\n id,\n name,\n tag,\n size: parseSize(size),\n createdAt: new Date(createdAt),\n };\n });\n },\n\n async startContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker start ${nameOrId}`);\n logger.info(`Container started: ${nameOrId}`);\n },\n\n async stopContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker stop ${nameOrId}`);\n logger.info(`Container stopped: ${nameOrId}`);\n },\n\n async restartContainer(nameOrId: string): Promise<void> {\n await runCommand(`docker restart ${nameOrId}`);\n logger.info(`Container restarted: ${nameOrId}`);\n },\n\n async removeContainer(nameOrId: string, force = false): Promise<void> {\n const forceFlag = force ? '-f' : '';\n await runCommand(`docker rm ${forceFlag} ${nameOrId}`);\n logger.info(`Container removed: ${nameOrId}`);\n },\n\n async buildImage(name: string, tag = 'latest', options?: DockerBuildOptions): Promise<void> {\n let command = `docker build -t ${name}:${tag}`;\n \n if (options?.noCache) command += ' --no-cache';\n if (options?.pull) command += ' --pull';\n if (options?.target) command += ` --target ${options.target}`;\n if (options?.platform) command += ` --platform ${options.platform}`;\n \n if (options?.buildArgs) {\n for (const [key, value] of Object.entries(options.buildArgs)) {\n command += ` --build-arg ${key}=${value}`;\n }\n }\n \n command += ' .';\n \n await runCommand(command);\n logger.info(`Image built: ${name}:${tag}`);\n },\n\n async pushImage(name: string, tag = 'latest'): Promise<void> {\n const fullName = config.registry \n ? `${config.registry}/${name}:${tag}` \n : `${name}:${tag}`;\n \n await runCommand(`docker push ${fullName}`);\n logger.info(`Image pushed: ${fullName}`);\n },\n\n async pullImage(name: string, tag = 'latest'): Promise<void> {\n await runCommand(`docker pull ${name}:${tag}`);\n logger.info(`Image pulled: ${name}:${tag}`);\n },\n\n async composeUp(detach = true): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' up';\n if (detach) command += ' -d';\n \n await runCommand(command);\n logger.info('Docker Compose up completed');\n },\n\n async composeDown(removeVolumes = false): Promise<void> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' down';\n if (removeVolumes) command += ' -v';\n \n await runCommand(command);\n logger.info('Docker Compose down completed');\n },\n\n async composeLogs(service?: string, follow = false): Promise<string> {\n let command = `docker-compose -f ${composePath}`;\n if (projectName) command += ` -p ${projectName}`;\n command += ' logs';\n if (follow) command += ' -f';\n if (service) command += ` ${service}`;\n \n return runCommand(command);\n },\n\n async exec(container: string, command: string): Promise<string> {\n return runCommand(`docker exec ${container} ${command}`);\n },\n };\n\n return manager;\n}\n\nfunction parsePorts(portsStr: string): DockerContainer['ports'] {\n if (!portsStr) return [];\n \n return portsStr.split(',').map((port) => {\n const match = port.match(/(\\d+):(\\d+)\\/(\\w+)/);\n if (match) {\n return {\n external: parseInt(match[1], 10),\n internal: parseInt(match[2], 10),\n protocol: match[3] as 'tcp' | 'udp',\n };\n }\n return {\n external: 0,\n internal: 0,\n protocol: 'tcp' as const,\n };\n }).filter((p) => p.internal > 0);\n}\n\nfunction parseSize(sizeStr: string): number {\n const match = sizeStr.match(/([\\d.]+)\\s*(GB|MB|KB|B)/i);\n if (!match) return 0;\n \n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n \n switch (unit) {\n case 'GB': return value * 1024 * 1024 * 1024;\n case 'MB': return value * 1024 * 1024;\n case 'KB': return value * 1024;\n default: return value;\n }\n}\n\nexport class DockerManager implements IDockerManager {\n private manager: IDockerManager;\n\n constructor(config: DockerManagerConfig = {}) {\n this.manager = createDockerManager(config);\n }\n\n listContainers = () => this.manager.listContainers();\n listImages = () => this.manager.listImages();\n startContainer = (nameOrId: string) => this.manager.startContainer(nameOrId);\n stopContainer = (nameOrId: string) => this.manager.stopContainer(nameOrId);\n restartContainer = (nameOrId: string) => this.manager.restartContainer(nameOrId);\n removeContainer = (nameOrId: string, force?: boolean) => this.manager.removeContainer(nameOrId, force);\n buildImage = (name: string, tag?: string) => this.manager.buildImage(name, tag);\n pushImage = (name: string, tag?: string) => this.manager.pushImage(name, tag);\n pullImage = (name: string, tag?: string) => this.manager.pullImage(name, tag);\n composeUp = (detach?: boolean) => this.manager.composeUp(detach);\n composeDown = (removeVolumes?: boolean) => this.manager.composeDown(removeVolumes);\n composeLogs = (service?: string, follow?: boolean) => this.manager.composeLogs(service, follow);\n exec = (container: string, command: string) => this.manager.exec(container, command);\n}\n\n"],"names":["execAsync","promisify","exec","logger","createLogger","createDockerManager","config","composePath","projectName","runCommand","command","stdout","stderr","error","parseContainerStatus","status","statusLower","output","line","id","name","image","ports","createdAt","parsePorts","tag","size","parseSize","nameOrId","force","options","key","value","fullName","detach","removeVolumes","service","follow","container","portsStr","port","match","p","sizeStr","DockerManager"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { RequestHandler } from 'express';
2
+
3
+ export interface HealthCheckResult {
4
+ name: string;
5
+ status: 'healthy' | 'unhealthy' | 'degraded';
6
+ latency?: number;
7
+ message?: string;
8
+ details?: Record<string, unknown>;
9
+ }
10
+ export interface HealthCheck {
11
+ name: string;
12
+ check: () => Promise<HealthCheckResult>;
13
+ critical?: boolean;
14
+ timeout?: number;
15
+ }
16
+ export interface HealthOptions {
17
+ path?: string;
18
+ checks?: HealthCheck[];
19
+ timeout?: number;
20
+ onHealthCheck?: (results: HealthCheckResult[]) => void;
21
+ }
22
+ export interface HealthStatus {
23
+ status: 'healthy' | 'unhealthy' | 'degraded';
24
+ timestamp: string;
25
+ uptime: number;
26
+ version?: string;
27
+ checks: HealthCheckResult[];
28
+ }
29
+ /**
30
+ * Create health check endpoint
31
+ *
32
+ * @example
33
+ * app.use(healthCheck({
34
+ * checks: [
35
+ * mongoHealthCheck(connection),
36
+ * redisHealthCheck(redisClient),
37
+ * customHealthCheck('api', async () => { ... }),
38
+ * ],
39
+ * }));
40
+ */
41
+ export declare function healthCheck(options?: HealthOptions): RequestHandler;
42
+ /**
43
+ * MongoDB health check
44
+ */
45
+ export declare function mongoHealthCheck(connection: any, name?: string): HealthCheck;
46
+ /**
47
+ * Redis health check
48
+ */
49
+ export declare function redisHealthCheck(client: any, name?: string): HealthCheck;
50
+ /**
51
+ * Memory health check
52
+ */
53
+ export declare function memoryHealthCheck(maxHeapMB?: number, name?: string): HealthCheck;
54
+ /**
55
+ * Disk health check (requires 'check-disk-space' package)
56
+ */
57
+ export declare function diskHealthCheck(_path?: string, _minFreeGB?: number, name?: string): HealthCheck;
58
+ /**
59
+ * Custom health check
60
+ */
61
+ export declare function customHealthCheck(name: string, checkFn: () => Promise<boolean | {
62
+ healthy: boolean;
63
+ message?: string;
64
+ }>, critical?: boolean): HealthCheck;
65
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/middleware/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,cAAc,CAiEvE;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,SAAY,GAAG,WAAW,CAoB/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,SAAU,GAAG,WAAW,CAoBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,SAAM,EACf,IAAI,SAAW,GACd,WAAW,CAyBb;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,SAAM,EACX,UAAU,SAAI,EACd,IAAI,SAAS,GACZ,WAAW,CAab;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxE,QAAQ,UAAQ,GACf,WAAW,CA2Bb"}
@@ -0,0 +1,5 @@
1
+ export * from './rateLimit';
2
+ export * from './health';
3
+ export * from './metrics';
4
+ export * from './upload';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../upload-9lCNnKK_.js");exports.Counter=e.Counter;exports.Gauge=e.Gauge;exports.Histogram=e.Histogram;exports.MetricsRegistry=e.MetricsRegistry;exports.RedisStore=e.RedisStore;exports.customHealthCheck=e.customHealthCheck;exports.defaultRegistry=e.defaultRegistry;exports.diskHealthCheck=e.diskHealthCheck;exports.healthCheck=e.healthCheck;exports.httpRequestDuration=e.httpRequestDuration;exports.httpRequestSize=e.httpRequestSize;exports.httpRequestsTotal=e.httpRequestsTotal;exports.httpResponseSize=e.httpResponseSize;exports.memoryHealthCheck=e.memoryHealthCheck;exports.metricsEndpoint=e.metricsEndpoint;exports.metricsMiddleware=e.metricsMiddleware;exports.mimeToExtension=e.mimeToExtension;exports.mongoHealthCheck=e.mongoHealthCheck;exports.rateLimit=e.rateLimit;exports.redisHealthCheck=e.redisHealthCheck;exports.slidingWindowRateLimit=e.slidingWindowRateLimit;exports.upload=e.upload;exports.validateFileType=e.validateFileType;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}