@forgedevstack/harbor 1.0.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 (130) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +927 -0
  3. package/dist/changelog/index.d.ts +3 -0
  4. package/dist/changelog/index.d.ts.map +1 -0
  5. package/dist/changelog/manager.d.ts +29 -0
  6. package/dist/changelog/manager.d.ts.map +1 -0
  7. package/dist/changelog/types.d.ts +41 -0
  8. package/dist/changelog/types.d.ts.map +1 -0
  9. package/dist/cli/index.d.ts +3 -0
  10. package/dist/cli/index.d.ts.map +1 -0
  11. package/dist/cli/index.js +43 -0
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/constants/config.const.d.ts +11 -0
  14. package/dist/constants/config.const.d.ts.map +1 -0
  15. package/dist/constants/defaults.const.d.ts +10 -0
  16. package/dist/constants/defaults.const.d.ts.map +1 -0
  17. package/dist/constants/http.const.d.ts +43 -0
  18. package/dist/constants/http.const.d.ts.map +1 -0
  19. package/dist/constants/index.d.ts +5 -0
  20. package/dist/constants/index.d.ts.map +1 -0
  21. package/dist/constants/validation.const.d.ts +35 -0
  22. package/dist/constants/validation.const.d.ts.map +1 -0
  23. package/dist/core/config.d.ts +6 -0
  24. package/dist/core/config.d.ts.map +1 -0
  25. package/dist/core/errorHandler.d.ts +25 -0
  26. package/dist/core/errorHandler.d.ts.map +1 -0
  27. package/dist/core/index.d.ts +6 -0
  28. package/dist/core/index.d.ts.map +1 -0
  29. package/dist/core/router.d.ts +68 -0
  30. package/dist/core/router.d.ts.map +1 -0
  31. package/dist/core/server.d.ts +4 -0
  32. package/dist/core/server.d.ts.map +1 -0
  33. package/dist/database/connection.d.ts +39 -0
  34. package/dist/database/connection.d.ts.map +1 -0
  35. package/dist/database/index.d.ts +28 -0
  36. package/dist/database/index.d.ts.map +1 -0
  37. package/dist/database/model.d.ts +118 -0
  38. package/dist/database/model.d.ts.map +1 -0
  39. package/dist/database/schema.d.ts +63 -0
  40. package/dist/database/schema.d.ts.map +1 -0
  41. package/dist/database/types.d.ts +270 -0
  42. package/dist/database/types.d.ts.map +1 -0
  43. package/dist/docker/index.d.ts +3 -0
  44. package/dist/docker/index.d.ts.map +1 -0
  45. package/dist/docker/index.js +2 -0
  46. package/dist/docker/index.js.map +1 -0
  47. package/dist/docker/manager.d.ts +21 -0
  48. package/dist/docker/manager.d.ts.map +1 -0
  49. package/dist/i18n/index.d.ts +38 -0
  50. package/dist/i18n/index.d.ts.map +1 -0
  51. package/dist/i18n/locales/en.d.ts +2 -0
  52. package/dist/i18n/locales/en.d.ts.map +1 -0
  53. package/dist/i18n/locales/he.d.ts +2 -0
  54. package/dist/i18n/locales/he.d.ts.map +1 -0
  55. package/dist/index.cjs.js +24 -0
  56. package/dist/index.cjs.js.map +1 -0
  57. package/dist/index.d.ts +21 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.es.js +2094 -0
  60. package/dist/index.es.js.map +1 -0
  61. package/dist/logger-D7aJSi62.mjs +102 -0
  62. package/dist/logger-D7aJSi62.mjs.map +1 -0
  63. package/dist/logger-DEnWXtpk.js +3 -0
  64. package/dist/logger-DEnWXtpk.js.map +1 -0
  65. package/dist/manager-B1UKMjXW.js +4 -0
  66. package/dist/manager-B1UKMjXW.js.map +1 -0
  67. package/dist/manager-B6vqJgEn.mjs +152 -0
  68. package/dist/manager-B6vqJgEn.mjs.map +1 -0
  69. package/dist/portal.d.ts +13 -0
  70. package/dist/portal.d.ts.map +1 -0
  71. package/dist/types/config.types.d.ts +83 -0
  72. package/dist/types/config.types.d.ts.map +1 -0
  73. package/dist/types/docker.types.d.ts +92 -0
  74. package/dist/types/docker.types.d.ts.map +1 -0
  75. package/dist/types/index.d.ts +7 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/dist/types/logger.types.d.ts +35 -0
  78. package/dist/types/logger.types.d.ts.map +1 -0
  79. package/dist/types/route.types.d.ts +78 -0
  80. package/dist/types/route.types.d.ts.map +1 -0
  81. package/dist/types/server.types.d.ts +67 -0
  82. package/dist/types/server.types.d.ts.map +1 -0
  83. package/dist/types/validation.types.d.ts +64 -0
  84. package/dist/types/validation.types.d.ts.map +1 -0
  85. package/dist/utils/helpers.d.ts +7 -0
  86. package/dist/utils/helpers.d.ts.map +1 -0
  87. package/dist/utils/httpLogger.d.ts +52 -0
  88. package/dist/utils/httpLogger.d.ts.map +1 -0
  89. package/dist/utils/index.d.ts +6 -0
  90. package/dist/utils/index.d.ts.map +1 -0
  91. package/dist/utils/logger.d.ts +6 -0
  92. package/dist/utils/logger.d.ts.map +1 -0
  93. package/dist/utils/object.d.ts +6 -0
  94. package/dist/utils/object.d.ts.map +1 -0
  95. package/dist/validation/index.d.ts +5 -0
  96. package/dist/validation/index.d.ts.map +1 -0
  97. package/dist/validation/index.js +2 -0
  98. package/dist/validation/index.js.map +1 -0
  99. package/dist/validation/mongo.d.ts +13 -0
  100. package/dist/validation/mongo.d.ts.map +1 -0
  101. package/dist/validation/paramValidators.d.ts +18 -0
  102. package/dist/validation/paramValidators.d.ts.map +1 -0
  103. package/dist/validation/validators.d.ts +9 -0
  104. package/dist/validation/validators.d.ts.map +1 -0
  105. package/harbor.config.example.json +72 -0
  106. package/package.json +107 -0
  107. package/templates/default/.eslintrc.json +45 -0
  108. package/templates/default/README.md +97 -0
  109. package/templates/default/constants/config.ts +26 -0
  110. package/templates/default/constants/http.ts +32 -0
  111. package/templates/default/constants/index.ts +3 -0
  112. package/templates/default/controllers/index.ts +6 -0
  113. package/templates/default/controllers/user.controller.ts +77 -0
  114. package/templates/default/env.example +22 -0
  115. package/templates/default/harbor.version.json +7 -0
  116. package/templates/default/models/index.ts +6 -0
  117. package/templates/default/models/user.model.ts +68 -0
  118. package/templates/default/package.json +44 -0
  119. package/templates/default/routes/index.ts +12 -0
  120. package/templates/default/routes/user.routes.ts +21 -0
  121. package/templates/default/server.ts +45 -0
  122. package/templates/default/services/index.ts +6 -0
  123. package/templates/default/services/user.service.ts +84 -0
  124. package/templates/default/tsconfig.json +35 -0
  125. package/templates/default/types/index.ts +57 -0
  126. package/templates/default/utils/asyncHandler.ts +14 -0
  127. package/templates/default/utils/index.ts +5 -0
  128. package/templates/default/utils/logger.ts +52 -0
  129. package/templates/default/utils/response.ts +24 -0
  130. package/templates/default/utils/validation.ts +23 -0
@@ -0,0 +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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"}
@@ -0,0 +1,152 @@
1
+ var p = Object.defineProperty;
2
+ var $ = (s, e, n) => e in s ? p(s, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : s[e] = n;
3
+ var o = (s, e, n) => $(s, typeof e != "symbol" ? e + "" : e, n);
4
+ import { exec as h } from "child_process";
5
+ import { promisify as C } from "util";
6
+ import { c as w } from "./logger-D7aJSi62.mjs";
7
+ const y = C(h), i = w("docker");
8
+ function k(s = {}) {
9
+ const e = s.composePath ?? "./docker-compose.yml", n = s.projectName;
10
+ async function c(t) {
11
+ try {
12
+ i.debug(`Executing: ${t}`);
13
+ const { stdout: r, stderr: a } = await y(t);
14
+ return a && i.warn(`Command stderr: ${a}`), r.trim();
15
+ } catch (r) {
16
+ throw i.error(`Command failed: ${t}`, r), r;
17
+ }
18
+ }
19
+ function f(t) {
20
+ const r = t.toLowerCase();
21
+ return r.includes("running") ? "running" : r.includes("exited") ? "exited" : r.includes("created") ? "created" : r.includes("paused") ? "paused" : r.includes("restarting") ? "restarting" : r.includes("removing") ? "removing" : r.includes("dead") ? "dead" : "exited";
22
+ }
23
+ return {
24
+ async listContainers() {
25
+ const t = await c(
26
+ 'docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}"'
27
+ );
28
+ return t ? t.split(`
29
+ `).map((r) => {
30
+ const [a, m, u, l, d, g] = r.split("|");
31
+ return {
32
+ id: a,
33
+ name: m,
34
+ image: u,
35
+ status: f(l),
36
+ ports: I(d),
37
+ createdAt: new Date(g)
38
+ };
39
+ }) : [];
40
+ },
41
+ async listImages() {
42
+ const t = await c(
43
+ 'docker images --format "{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}"'
44
+ );
45
+ return t ? t.split(`
46
+ `).map((r) => {
47
+ const [a, m, u, l, d] = r.split("|");
48
+ return {
49
+ id: a,
50
+ name: m,
51
+ tag: u,
52
+ size: x(l),
53
+ createdAt: new Date(d)
54
+ };
55
+ }) : [];
56
+ },
57
+ async startContainer(t) {
58
+ await c(`docker start ${t}`), i.info(`Container started: ${t}`);
59
+ },
60
+ async stopContainer(t) {
61
+ await c(`docker stop ${t}`), i.info(`Container stopped: ${t}`);
62
+ },
63
+ async restartContainer(t) {
64
+ await c(`docker restart ${t}`), i.info(`Container restarted: ${t}`);
65
+ },
66
+ async removeContainer(t, r = !1) {
67
+ await c(`docker rm ${r ? "-f" : ""} ${t}`), i.info(`Container removed: ${t}`);
68
+ },
69
+ async buildImage(t, r = "latest", a) {
70
+ let m = `docker build -t ${t}:${r}`;
71
+ if (a != null && a.noCache && (m += " --no-cache"), a != null && a.pull && (m += " --pull"), a != null && a.target && (m += ` --target ${a.target}`), a != null && a.platform && (m += ` --platform ${a.platform}`), a != null && a.buildArgs)
72
+ for (const [u, l] of Object.entries(a.buildArgs))
73
+ m += ` --build-arg ${u}=${l}`;
74
+ m += " .", await c(m), i.info(`Image built: ${t}:${r}`);
75
+ },
76
+ async pushImage(t, r = "latest") {
77
+ const a = s.registry ? `${s.registry}/${t}:${r}` : `${t}:${r}`;
78
+ await c(`docker push ${a}`), i.info(`Image pushed: ${a}`);
79
+ },
80
+ async pullImage(t, r = "latest") {
81
+ await c(`docker pull ${t}:${r}`), i.info(`Image pulled: ${t}:${r}`);
82
+ },
83
+ async composeUp(t = !0) {
84
+ let r = `docker-compose -f ${e}`;
85
+ n && (r += ` -p ${n}`), r += " up", t && (r += " -d"), await c(r), i.info("Docker Compose up completed");
86
+ },
87
+ async composeDown(t = !1) {
88
+ let r = `docker-compose -f ${e}`;
89
+ n && (r += ` -p ${n}`), r += " down", t && (r += " -v"), await c(r), i.info("Docker Compose down completed");
90
+ },
91
+ async composeLogs(t, r = !1) {
92
+ let a = `docker-compose -f ${e}`;
93
+ return n && (a += ` -p ${n}`), a += " logs", r && (a += " -f"), t && (a += ` ${t}`), c(a);
94
+ },
95
+ async exec(t, r) {
96
+ return c(`docker exec ${t} ${r}`);
97
+ }
98
+ };
99
+ }
100
+ function I(s) {
101
+ return s ? s.split(",").map((e) => {
102
+ const n = e.match(/(\d+):(\d+)\/(\w+)/);
103
+ return n ? {
104
+ external: parseInt(n[1], 10),
105
+ internal: parseInt(n[2], 10),
106
+ protocol: n[3]
107
+ } : {
108
+ external: 0,
109
+ internal: 0,
110
+ protocol: "tcp"
111
+ };
112
+ }).filter((e) => e.internal > 0) : [];
113
+ }
114
+ function x(s) {
115
+ const e = s.match(/([\d.]+)\s*(GB|MB|KB|B)/i);
116
+ if (!e) return 0;
117
+ const n = parseFloat(e[1]);
118
+ switch (e[2].toUpperCase()) {
119
+ case "GB":
120
+ return n * 1024 * 1024 * 1024;
121
+ case "MB":
122
+ return n * 1024 * 1024;
123
+ case "KB":
124
+ return n * 1024;
125
+ default:
126
+ return n;
127
+ }
128
+ }
129
+ class L {
130
+ constructor(e = {}) {
131
+ o(this, "manager");
132
+ o(this, "listContainers", () => this.manager.listContainers());
133
+ o(this, "listImages", () => this.manager.listImages());
134
+ o(this, "startContainer", (e) => this.manager.startContainer(e));
135
+ o(this, "stopContainer", (e) => this.manager.stopContainer(e));
136
+ o(this, "restartContainer", (e) => this.manager.restartContainer(e));
137
+ o(this, "removeContainer", (e, n) => this.manager.removeContainer(e, n));
138
+ o(this, "buildImage", (e, n) => this.manager.buildImage(e, n));
139
+ o(this, "pushImage", (e, n) => this.manager.pushImage(e, n));
140
+ o(this, "pullImage", (e, n) => this.manager.pullImage(e, n));
141
+ o(this, "composeUp", (e) => this.manager.composeUp(e));
142
+ o(this, "composeDown", (e) => this.manager.composeDown(e));
143
+ o(this, "composeLogs", (e, n) => this.manager.composeLogs(e, n));
144
+ o(this, "exec", (e, n) => this.manager.exec(e, n));
145
+ this.manager = k(e);
146
+ }
147
+ }
148
+ export {
149
+ L as D,
150
+ k as c
151
+ };
152
+ //# sourceMappingURL=manager-B6vqJgEn.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,13 @@
1
+ export interface PortalGeneratorOptions {
2
+ outDir?: string;
3
+ title?: string;
4
+ }
5
+ export declare class PortalGenerator {
6
+ private options;
7
+ constructor(options?: PortalGeneratorOptions);
8
+ get config(): PortalGeneratorOptions;
9
+ generate(): void;
10
+ }
11
+ export declare function createPortal(_options?: PortalGeneratorOptions): PortalGenerator;
12
+ export declare function generateDocs(): void;
13
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../src/portal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,sBAA2B;IAExD,IAAI,MAAM,IAAI,sBAAsB,CAEnC;IAED,QAAQ,IAAI,IAAI;CAGjB;AAED,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,sBAAsB,GAAG,eAAe,CAE/E;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
@@ -0,0 +1,83 @@
1
+ import { LogLevel } from './logger.types';
2
+
3
+ export interface HarborConfig {
4
+ server: ServerConfig;
5
+ routes: RoutesConfig;
6
+ validation: ValidationConfig;
7
+ errors: ErrorsConfig;
8
+ logger: LoggerConfig;
9
+ docker?: DockerConfig;
10
+ }
11
+ export interface ServerConfig {
12
+ port: number;
13
+ host?: string;
14
+ cors?: CorsConfig;
15
+ bodyParser?: BodyParserConfig;
16
+ trustProxy?: boolean;
17
+ }
18
+ export interface CorsConfig {
19
+ enabled: boolean;
20
+ origin?: string | string[] | boolean;
21
+ methods?: string[];
22
+ allowedHeaders?: string[];
23
+ credentials?: boolean;
24
+ }
25
+ export interface BodyParserConfig {
26
+ json?: boolean;
27
+ urlencoded?: boolean;
28
+ limit?: string;
29
+ }
30
+ export interface RoutesConfig {
31
+ prefix?: string;
32
+ timeout?: number;
33
+ defaultMiddleware?: string[];
34
+ }
35
+ export interface ValidationConfig {
36
+ adapter: 'mongoose' | 'custom';
37
+ strictMode?: boolean;
38
+ sanitize?: boolean;
39
+ customAdapter?: ValidationAdapter;
40
+ }
41
+ export interface ValidationAdapter {
42
+ validate: <T>(schema: unknown, data: unknown) => Promise<ValidationResult<T>>;
43
+ sanitize?: (data: unknown) => unknown;
44
+ }
45
+ export interface ValidationResult<T = unknown> {
46
+ valid: boolean;
47
+ data?: T;
48
+ errors?: ValidationError[];
49
+ }
50
+ export interface ValidationError {
51
+ field: string;
52
+ message: string;
53
+ code?: string;
54
+ }
55
+ export interface ErrorsConfig {
56
+ 400?: ErrorHandler;
57
+ 401?: ErrorHandler;
58
+ 403?: ErrorHandler;
59
+ 404?: ErrorHandler;
60
+ 500?: ErrorHandler;
61
+ default?: ErrorHandler;
62
+ }
63
+ export interface ErrorHandler {
64
+ message?: string;
65
+ redirect?: string;
66
+ template?: string;
67
+ json?: boolean;
68
+ log?: boolean;
69
+ }
70
+ export interface LoggerConfig {
71
+ enabled: boolean;
72
+ level: LogLevel;
73
+ format?: 'json' | 'text';
74
+ output?: 'console' | 'file' | 'both';
75
+ filePath?: string;
76
+ }
77
+ export interface DockerConfig {
78
+ enabled: boolean;
79
+ compose?: string;
80
+ registry?: string;
81
+ imageName?: string;
82
+ }
83
+ //# sourceMappingURL=config.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ export interface DockerManagerConfig {
2
+ composePath?: string;
3
+ projectName?: string;
4
+ registry?: string;
5
+ imageName?: string;
6
+ tag?: string;
7
+ }
8
+ export interface DockerContainer {
9
+ id: string;
10
+ name: string;
11
+ image: string;
12
+ status: ContainerStatus;
13
+ ports: PortMapping[];
14
+ createdAt: Date;
15
+ startedAt?: Date;
16
+ }
17
+ export type ContainerStatus = 'created' | 'running' | 'paused' | 'restarting' | 'removing' | 'exited' | 'dead';
18
+ export interface PortMapping {
19
+ internal: number;
20
+ external: number;
21
+ protocol: 'tcp' | 'udp';
22
+ }
23
+ export interface DockerImage {
24
+ id: string;
25
+ name: string;
26
+ tag: string;
27
+ size: number;
28
+ createdAt: Date;
29
+ }
30
+ export interface DockerComposeConfig {
31
+ version?: string;
32
+ services: Record<string, DockerService>;
33
+ volumes?: Record<string, VolumeConfig>;
34
+ networks?: Record<string, NetworkConfig>;
35
+ }
36
+ export interface DockerService {
37
+ image?: string;
38
+ build?: BuildConfig;
39
+ ports?: string[];
40
+ volumes?: string[];
41
+ environment?: Record<string, string>;
42
+ depends_on?: string[];
43
+ restart?: RestartPolicy;
44
+ networks?: string[];
45
+ command?: string | string[];
46
+ healthcheck?: ServiceHealthCheck;
47
+ }
48
+ export interface BuildConfig {
49
+ context: string;
50
+ dockerfile?: string;
51
+ args?: Record<string, string>;
52
+ }
53
+ export type RestartPolicy = 'no' | 'always' | 'on-failure' | 'unless-stopped';
54
+ export interface VolumeConfig {
55
+ driver?: string;
56
+ driver_opts?: Record<string, string>;
57
+ external?: boolean;
58
+ }
59
+ export interface NetworkConfig {
60
+ driver?: string;
61
+ external?: boolean;
62
+ }
63
+ export interface ServiceHealthCheck {
64
+ test: string | string[];
65
+ interval?: string;
66
+ timeout?: string;
67
+ retries?: number;
68
+ start_period?: string;
69
+ }
70
+ export interface DockerManager {
71
+ listContainers: () => Promise<DockerContainer[]>;
72
+ listImages: () => Promise<DockerImage[]>;
73
+ startContainer: (nameOrId: string) => Promise<void>;
74
+ stopContainer: (nameOrId: string) => Promise<void>;
75
+ restartContainer: (nameOrId: string) => Promise<void>;
76
+ removeContainer: (nameOrId: string, force?: boolean) => Promise<void>;
77
+ buildImage: (name: string, tag?: string) => Promise<void>;
78
+ pushImage: (name: string, tag?: string) => Promise<void>;
79
+ pullImage: (name: string, tag?: string) => Promise<void>;
80
+ composeUp: (detach?: boolean) => Promise<void>;
81
+ composeDown: (removeVolumes?: boolean) => Promise<void>;
82
+ composeLogs: (service?: string, follow?: boolean) => Promise<string>;
83
+ exec: (container: string, command: string) => Promise<string>;
84
+ }
85
+ export interface DockerBuildOptions {
86
+ noCache?: boolean;
87
+ pull?: boolean;
88
+ buildArgs?: Record<string, string>;
89
+ target?: string;
90
+ platform?: string;
91
+ }
92
+ //# sourceMappingURL=docker.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.types.d.ts","sourceRoot":"","sources":["../../src/types/docker.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './config.types';
2
+ export * from './route.types';
3
+ export * from './validation.types';
4
+ export * from './server.types';
5
+ export * from './docker.types';
6
+ export * from './logger.types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,35 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
2
+ export interface LogEntry {
3
+ level: LogLevel;
4
+ message: string;
5
+ timestamp: Date;
6
+ context?: string;
7
+ data?: Record<string, unknown>;
8
+ error?: Error;
9
+ }
10
+ export interface Logger {
11
+ debug: (message: string, data?: Record<string, unknown>) => void;
12
+ info: (message: string, data?: Record<string, unknown>) => void;
13
+ warn: (message: string, data?: Record<string, unknown>) => void;
14
+ error: (message: string, error?: Error, data?: Record<string, unknown>) => void;
15
+ setLevel: (level: LogLevel) => void;
16
+ setContext: (context: string) => Logger;
17
+ child: (context: string) => Logger;
18
+ }
19
+ export interface LoggerOptions {
20
+ level: LogLevel;
21
+ format: 'json' | 'text';
22
+ output: 'console' | 'file' | 'both';
23
+ filePath?: string;
24
+ prefix?: string;
25
+ colorize?: boolean;
26
+ }
27
+ export interface LogFormatter {
28
+ format: (entry: LogEntry) => string;
29
+ }
30
+ export interface LogTransport {
31
+ log: (entry: LogEntry) => void;
32
+ flush?: () => Promise<void>;
33
+ close?: () => Promise<void>;
34
+ }
35
+ //# sourceMappingURL=logger.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.types.d.ts","sourceRoot":"","sources":["../../src/types/logger.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAChE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAChE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAChF,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B"}
@@ -0,0 +1,78 @@
1
+ import { Request, Response, NextFunction, RequestHandler } from 'express';
2
+
3
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
4
+ export interface RouteDefinition {
5
+ path: string;
6
+ method: HttpMethod;
7
+ handler: RouteHandler;
8
+ options?: RouteOptions;
9
+ }
10
+ export interface RouteOptions {
11
+ pre?: PreFunction[];
12
+ post?: PostFunction[];
13
+ validation?: RouteValidation;
14
+ timeout?: number;
15
+ rateLimit?: RateLimitConfig;
16
+ auth?: AuthConfig;
17
+ cache?: CacheConfig;
18
+ }
19
+ export type PreFunction = (req: HarborRequest, res: Response, next: NextFunction) => void | Promise<void>;
20
+ export type PostFunction = (req: HarborRequest, res: Response, result: unknown) => void | Promise<void>;
21
+ export type RouteHandler = (req: HarborRequest, res: HarborResponse) => unknown | Promise<unknown>;
22
+ export interface RouteValidation {
23
+ params?: ValidationSchema;
24
+ query?: ValidationSchema;
25
+ body?: ValidationSchema;
26
+ headers?: ValidationSchema;
27
+ }
28
+ export type ValidationSchema = Record<string, FieldValidation>;
29
+ export interface FieldValidation {
30
+ type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'date' | 'email' | 'objectId';
31
+ required?: boolean;
32
+ min?: number;
33
+ max?: number;
34
+ pattern?: string;
35
+ enum?: unknown[];
36
+ default?: unknown;
37
+ transform?: (value: unknown) => unknown;
38
+ }
39
+ export interface RateLimitConfig {
40
+ windowMs: number;
41
+ max: number;
42
+ message?: string;
43
+ }
44
+ export interface AuthConfig {
45
+ required: boolean;
46
+ roles?: string[];
47
+ permissions?: string[];
48
+ }
49
+ export interface CacheConfig {
50
+ ttl: number;
51
+ key?: string | ((req: HarborRequest) => string);
52
+ }
53
+ export interface HarborRequest extends Request {
54
+ validated?: {
55
+ params?: Record<string, unknown>;
56
+ query?: Record<string, unknown>;
57
+ body?: Record<string, unknown>;
58
+ headers?: Record<string, unknown>;
59
+ };
60
+ startTime?: number;
61
+ harborContext?: Record<string, unknown>;
62
+ }
63
+ export interface HarborResponse extends Response {
64
+ success: <T>(data: T, statusCode?: number) => void;
65
+ error: (message: string, statusCode?: number, details?: unknown) => void;
66
+ }
67
+ export interface RouteGroup {
68
+ prefix: string;
69
+ middleware?: RequestHandler[];
70
+ routes: RouteDefinition[];
71
+ }
72
+ export interface RouterConfig {
73
+ prefix?: string;
74
+ middleware?: RequestHandler[];
75
+ errorHandler?: ErrorHandlerFunction;
76
+ }
77
+ export type ErrorHandlerFunction = (error: Error, req: HarborRequest, res: Response, next: NextFunction) => void;
78
+ //# sourceMappingURL=route.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../src/types/route.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE/E,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,OAAO,KACZ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,cAAc,KAChB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC3F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,aAAc,SAAQ,OAAO;IAC5C,SAAS,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1E;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,IAAI,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { Express, RequestHandler } from 'express';
2
+ import { Server as HttpServer } from 'http';
3
+ import { HarborConfig } from './config.types';
4
+ import { RouteDefinition, RouteGroup } from './route.types';
5
+
6
+ export interface HarborServer {
7
+ app: Express;
8
+ server: HttpServer | null;
9
+ config: HarborConfig;
10
+ start: () => Promise<ServerInfo>;
11
+ stop: () => Promise<void>;
12
+ restart: () => Promise<ServerInfo>;
13
+ addRoute: (route: RouteDefinition) => void;
14
+ addRouteGroup: (group: RouteGroup) => void;
15
+ addMiddleware: (middleware: RequestHandler) => void;
16
+ getInfo: () => ServerInfo;
17
+ }
18
+ export interface ServerInfo {
19
+ port: number;
20
+ host: string;
21
+ uptime: number;
22
+ startedAt: Date | null;
23
+ routes: RouteInfo[];
24
+ status: ServerStatus;
25
+ }
26
+ export interface RouteInfo {
27
+ path: string;
28
+ method: string;
29
+ middleware: string[];
30
+ }
31
+ export type ServerStatus = 'stopped' | 'starting' | 'running' | 'stopping' | 'error';
32
+ export interface CreateServerOptions {
33
+ port?: number;
34
+ host?: string;
35
+ configPath?: string;
36
+ autoStart?: boolean;
37
+ onReady?: (info: ServerInfo) => void;
38
+ onError?: (error: Error) => void;
39
+ }
40
+ export interface ServerMiddleware {
41
+ name: string;
42
+ handler: RequestHandler;
43
+ priority?: number;
44
+ paths?: string[];
45
+ }
46
+ export interface HealthCheckConfig {
47
+ enabled: boolean;
48
+ path?: string;
49
+ interval?: number;
50
+ checks?: HealthCheck[];
51
+ }
52
+ export interface HealthCheck {
53
+ name: string;
54
+ check: () => Promise<HealthCheckResult>;
55
+ }
56
+ export interface HealthCheckResult {
57
+ healthy: boolean;
58
+ message?: string;
59
+ latency?: number;
60
+ }
61
+ export interface GracefulShutdownConfig {
62
+ enabled: boolean;
63
+ timeout?: number;
64
+ signals?: string[];
65
+ onShutdown?: () => Promise<void>;
66
+ }
67
+ //# sourceMappingURL=server.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.types.d.ts","sourceRoot":"","sources":["../../src/types/server.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,OAAO,EAAE,MAAM,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAErF,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC"}