@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
@@ -1,77 +1,57 @@
1
- import { Request, Response } from 'express';
1
+ import type { HarborRequest } from '@forgestack/harbor';
2
+ import { User } from '../models';
2
3
  import { UserService } from '../services';
3
- import { CreateUserDto, UpdateUserDto } from '../types';
4
4
 
5
- export class UserController {
6
- /**
7
- * Get all users
8
- */
9
- static async getAll(req: Request, res: Response) {
10
- const { page = 1, limit = 10 } = req.query;
11
-
12
- const result = await UserService.findAll({
13
- page: Number(page),
14
- limit: Number(limit),
15
- });
16
-
17
- return res.json(result);
18
- }
5
+ export const UserController = {
6
+ async getAll() {
7
+ const users = await User.find();
8
+ return { users };
9
+ },
19
10
 
20
- /**
21
- * Get user by ID
22
- */
23
- static async getById(req: Request, res: Response) {
24
- const { id } = req.params;
25
-
26
- const user = await UserService.findById(id);
27
-
11
+ async getById(req: HarborRequest) {
12
+ const user = await User.findById(req.params.id);
28
13
  if (!user) {
29
- return res.status(404).json({ error: 'User not found' });
14
+ throw new Error('User not found');
30
15
  }
16
+ return { user };
17
+ },
31
18
 
32
- return res.json(user);
33
- }
34
-
35
- /**
36
- * Create new user
37
- */
38
- static async create(req: Request, res: Response) {
39
- const data: CreateUserDto = req.body;
19
+ async create(req: HarborRequest) {
20
+ const { email, name, password } = req.body;
40
21
 
41
- const user = await UserService.create(data);
42
-
43
- return res.status(201).json(user);
44
- }
45
-
46
- /**
47
- * Update user
48
- */
49
- static async update(req: Request, res: Response) {
50
- const { id } = req.params;
51
- const data: UpdateUserDto = req.body;
22
+ // Hash password and create user
23
+ const user = await UserService.createUser({ email, name, password });
24
+
25
+ return {
26
+ user: {
27
+ id: user._id,
28
+ email: user.email,
29
+ name: user.name,
30
+ },
31
+ };
32
+ },
33
+
34
+ async update(req: HarborRequest) {
35
+ const user = await User.findByIdAndUpdate(
36
+ req.params.id,
37
+ req.body,
38
+ { new: true }
39
+ );
52
40
 
53
- const user = await UserService.update(id, data);
54
-
55
41
  if (!user) {
56
- return res.status(404).json({ error: 'User not found' });
42
+ throw new Error('User not found');
57
43
  }
58
-
59
- return res.json(user);
60
- }
61
-
62
- /**
63
- * Delete user
64
- */
65
- static async delete(req: Request, res: Response) {
66
- const { id } = req.params;
67
44
 
68
- const deleted = await UserService.delete(id);
45
+ return { user };
46
+ },
69
47
 
70
- if (!deleted) {
71
- return res.status(404).json({ error: 'User not found' });
48
+ async delete(req: HarborRequest) {
49
+ const result = await User.findByIdAndDelete(req.params.id);
50
+
51
+ if (!result) {
52
+ throw new Error('User not found');
72
53
  }
73
-
74
- return res.status(204).send();
75
- }
76
- }
77
-
54
+
55
+ return { deleted: true };
56
+ },
57
+ };
@@ -1,44 +1,20 @@
1
1
  {
2
- "name": "{{PROJECT_NAME}}",
2
+ "name": "my-harbor-app",
3
3
  "version": "1.0.0",
4
- "description": "{{PROJECT_DESCRIPTION}}",
5
- "main": "dist/server.js",
4
+ "type": "module",
6
5
  "scripts": {
7
6
  "dev": "tsx watch server.ts",
8
- "build": "tsc",
9
7
  "start": "node dist/server.js",
10
- "lint": "eslint . --ext .ts",
11
- "lint:fix": "eslint . --ext .ts --fix",
12
- "test": "vitest",
13
- "test:coverage": "vitest --coverage"
8
+ "build": "tsc",
9
+ "lint": "eslint . --ext .ts"
14
10
  },
15
- "keywords": [
16
- "nodejs",
17
- "express",
18
- "mongodb",
19
- "harbor",
20
- "api"
21
- ],
22
- "author": "",
23
- "license": "MIT",
24
11
  "dependencies": {
25
- "dotenv": "^16.3.1",
26
- "express": "^4.18.2",
27
- "harbor": "^1.2.0",
28
- "mongodb": "^6.3.0"
12
+ "@forgestack/harbor": "^1.0.0"
29
13
  },
30
14
  "devDependencies": {
31
- "@types/express": "^4.17.21",
32
- "@types/node": "^20.10.0",
33
- "@typescript-eslint/eslint-plugin": "^6.13.0",
34
- "@typescript-eslint/parser": "^6.13.0",
35
- "eslint": "^8.55.0",
36
- "tsx": "^4.6.0",
37
- "typescript": "^5.3.0",
38
- "vitest": "^1.0.0"
39
- },
40
- "engines": {
41
- "node": ">=18.0.0"
15
+ "@types/node": "^20.0.0",
16
+ "eslint": "^8.0.0",
17
+ "tsx": "^4.0.0",
18
+ "typescript": "^5.0.0"
42
19
  }
43
20
  }
44
-
@@ -1,12 +1,2 @@
1
- import { Router } from 'express';
2
- import { userRoutes } from './user.routes';
3
-
4
- export const routes = Router();
5
-
6
- // Register all route modules
7
- routes.use('/users', userRoutes);
8
-
9
- // Add more routes here:
10
- // routes.use('/products', productRoutes);
11
- // routes.use('/orders', orderRoutes);
12
-
1
+ // Export all routes
2
+ export { userRoutes } from './user.routes';
@@ -1,21 +1,28 @@
1
- import { Router } from 'express';
2
- import { GET, POST, PUT, DELETE } from 'harbor';
1
+ import { router, GET, POST, PUT, DELETE } from '@forgestack/harbor';
3
2
  import { UserController } from '../controllers';
4
3
 
5
- export const userRoutes = Router();
6
-
7
- // GET /api/users - Get all users
8
- userRoutes.get('/', GET(UserController.getAll));
9
-
10
- // GET /api/users/:id - Get user by ID
11
- userRoutes.get('/:id', GET(UserController.getById));
12
-
13
- // POST /api/users - Create new user
14
- userRoutes.post('/', POST(UserController.create));
15
-
16
- // PUT /api/users/:id - Update user
17
- userRoutes.put('/:id', PUT(UserController.update));
18
-
19
- // DELETE /api/users/:id - Delete user
20
- userRoutes.delete('/:id', DELETE(UserController.delete));
21
-
4
+ // Create user routes - no express import needed!
5
+ export const userRoutes = router('/api/users', [
6
+ // GET /api/users - List all users
7
+ GET('/', UserController.getAll),
8
+
9
+ // GET /api/users/:id - Get user by ID
10
+ GET('/:id', UserController.getById),
11
+
12
+ // POST /api/users - Create new user
13
+ POST('/', UserController.create, {
14
+ validation: {
15
+ body: {
16
+ email: { type: 'email', required: true },
17
+ name: { type: 'string', required: true, min: 2, max: 100 },
18
+ password: { type: 'string', required: true, min: 8 },
19
+ },
20
+ },
21
+ }),
22
+
23
+ // PUT /api/users/:id - Update user
24
+ PUT('/:id', UserController.update),
25
+
26
+ // DELETE /api/users/:id - Delete user
27
+ DELETE('/:id', UserController.delete),
28
+ ]);
@@ -1,45 +1,26 @@
1
- import { createServer, connect, httpLogger } from 'harbor';
2
- import { routes } from './routes';
3
- import { config } from './constants';
1
+ import { createServer, connect, httpLogger } from '@forgestack/harbor';
2
+ import { userRoutes } from './routes';
3
+ import { CONFIG } from './constants';
4
4
 
5
5
  async function bootstrap() {
6
- // Create server with Harbor
7
- const app = createServer({
8
- port: config.PORT,
6
+ // Connect to MongoDB
7
+ await connect(CONFIG.MONGODB_URI);
8
+ console.log('Connected to MongoDB');
9
+
10
+ // Create server with minimal config
11
+ const server = createServer({
12
+ port: CONFIG.PORT,
9
13
  cors: true,
10
- helmet: true,
11
- json: true,
12
- urlencoded: true,
14
+ bodyParser: true,
13
15
  });
14
16
 
15
- // HTTP request logging
16
- app.use(httpLogger({
17
- format: 'dev',
18
- skip: (req) => req.path === '/health',
19
- }));
20
-
21
- // Connect to MongoDB (optional)
22
- if (config.MONGODB_URI) {
23
- await connect(config.MONGODB_URI, {
24
- dbName: config.DB_NAME,
25
- });
26
- console.log('📦 Connected to MongoDB');
27
- }
28
-
29
- // Register all routes
30
- app.use('/api', routes);
17
+ // Add HTTP request logger
18
+ server.use(httpLogger());
31
19
 
32
- // Health check endpoint
33
- app.get('/health', (req, res) => {
34
- res.json({ status: 'ok', timestamp: new Date().toISOString() });
35
- });
20
+ // Register routes
21
+ server.use(userRoutes);
36
22
 
37
- // Start server
38
- app.listen(config.PORT, () => {
39
- console.log(`🚀 Server running on http://localhost:${config.PORT}`);
40
- console.log(`📚 API Docs: http://localhost:${config.PORT}/api-docs`);
41
- });
23
+ console.log(`Server running at http://localhost:${CONFIG.PORT}`);
42
24
  }
43
25
 
44
26
  bootstrap().catch(console.error);
45
-
@@ -1,102 +0,0 @@
1
- const u = {
2
- debug: 0,
3
- info: 1,
4
- warn: 2,
5
- error: 3,
6
- silent: 4
7
- }, L = {
8
- debug: "\x1B[36m",
9
- info: "\x1B[32m",
10
- warn: "\x1B[33m",
11
- error: "\x1B[31m",
12
- silent: ""
13
- }, $ = "\x1B[0m";
14
- let x = "info";
15
- function v(s) {
16
- x = s;
17
- }
18
- function n(s, r) {
19
- const f = s ?? "harbor", t = {
20
- level: (r == null ? void 0 : r.level) ?? x,
21
- format: (r == null ? void 0 : r.format) ?? "text",
22
- output: (r == null ? void 0 : r.output) ?? "console",
23
- colorize: (r == null ? void 0 : r.colorize) ?? !0,
24
- prefix: r == null ? void 0 : r.prefix,
25
- filePath: r == null ? void 0 : r.filePath
26
- };
27
- function d(e) {
28
- return u[e] >= u[t.level];
29
- }
30
- function b(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 a = e.timestamp.toISOString(), c = e.level.toUpperCase().padEnd(5), m = e.context ? `[${e.context}]` : "";
45
- let l = `${a} ${c} ${m} ${e.message}`;
46
- return e.data && Object.keys(e.data).length > 0 && (l += ` ${JSON.stringify(e.data)}`), e.error && (l += `
47
- ${e.error.stack ?? e.error.message}`), t.colorize && (l = `${L[e.level]}${l}${$}`), l;
48
- }
49
- function o(e, a, c, m) {
50
- if (!d(e)) return;
51
- const g = b({
52
- level: e,
53
- message: a,
54
- timestamp: /* @__PURE__ */ new Date(),
55
- context: f,
56
- data: c,
57
- error: m
58
- });
59
- if (t.output === "console" || t.output === "both")
60
- switch (e) {
61
- case "debug":
62
- case "info":
63
- console.log(g);
64
- break;
65
- case "warn":
66
- console.warn(g);
67
- break;
68
- case "error":
69
- console.error(g);
70
- break;
71
- }
72
- }
73
- return {
74
- debug(e, a) {
75
- o("debug", e, a);
76
- },
77
- info(e, a) {
78
- o("info", e, a);
79
- },
80
- warn(e, a) {
81
- o("warn", e, a);
82
- },
83
- error(e, a, c) {
84
- o("error", e, c, a);
85
- },
86
- setLevel(e) {
87
- t.level = e;
88
- },
89
- setContext(e) {
90
- return n(e, t);
91
- },
92
- child(e) {
93
- const a = f ? `${f}:${e}` : e;
94
- return n(a, t);
95
- }
96
- };
97
- }
98
- export {
99
- n as c,
100
- v as s
101
- };
102
- //# sourceMappingURL=logger-D7aJSi62.mjs.map
@@ -1,3 +0,0 @@
1
- "use strict";const n={debug:0,info:1,warn:2,error:3,silent:4},b={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m",silent:""},i="\x1B[0m";let x="info";function v(s){x=s}function u(s,r){const f=s??"harbor",a={level:(r==null?void 0:r.level)??x,format:(r==null?void 0:r.format)??"text",output:(r==null?void 0:r.output)??"console",colorize:(r==null?void 0:r.colorize)??!0,prefix:r==null?void 0:r.prefix,filePath:r==null?void 0:r.filePath};function d(e){return n[e]>=n[a.level]}function L(e){if(a.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 t=e.timestamp.toISOString(),c=e.level.toUpperCase().padEnd(5),m=e.context?`[${e.context}]`:"";let l=`${t} ${c} ${m} ${e.message}`;return e.data&&Object.keys(e.data).length>0&&(l+=` ${JSON.stringify(e.data)}`),e.error&&(l+=`
2
- ${e.error.stack??e.error.message}`),a.colorize&&(l=`${b[e.level]}${l}${i}`),l}function o(e,t,c,m){if(!d(e))return;const g=L({level:e,message:t,timestamp:new Date,context:f,data:c,error:m});if(a.output==="console"||a.output==="both")switch(e){case"debug":case"info":console.log(g);break;case"warn":console.warn(g);break;case"error":console.error(g);break}}return{debug(e,t){o("debug",e,t)},info(e,t){o("info",e,t)},warn(e,t){o("warn",e,t)},error(e,t,c){o("error",e,c,t)},setLevel(e){a.level=e},setContext(e){return u(e,a)},child(e){const t=f?`${f}:${e}`:e;return u(t,a)}}}exports.createLogger=u;exports.setGlobalLogLevel=v;
3
- //# sourceMappingURL=logger-DEnWXtpk.js.map
@@ -1,4 +0,0 @@
1
- "use strict";var $=Object.defineProperty;var h=(s,e,n)=>e in s?$(s,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):s[e]=n;var c=(s,e,n)=>h(s,typeof e!="symbol"?e+"":e,n);const C=require("child_process"),w=require("util"),k=require("./logger-DEnWXtpk.js"),y=w.promisify(C.exec),i=k.createLogger("docker");function g(s={}){const e=s.composePath??"./docker-compose.yml",n=s.projectName;async function o(r){try{i.debug(`Executing: ${r}`);const{stdout:t,stderr:a}=await y(r);return a&&i.warn(`Command stderr: ${a}`),t.trim()}catch(t){throw i.error(`Command failed: ${r}`,t),t}}function f(r){const t=r.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 r=await o('docker ps -a --format "{{.ID}}|{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.CreatedAt}}"');return r?r.split(`
2
- `).map(t=>{const[a,u,m,l,d,p]=t.split("|");return{id:a,name:u,image:m,status:f(l),ports:I(d),createdAt:new Date(p)}}):[]},async listImages(){const r=await o('docker images --format "{{.ID}}|{{.Repository}}|{{.Tag}}|{{.Size}}|{{.CreatedAt}}"');return r?r.split(`
3
- `).map(t=>{const[a,u,m,l,d]=t.split("|");return{id:a,name:u,tag:m,size:D(l),createdAt:new Date(d)}}):[]},async startContainer(r){await o(`docker start ${r}`),i.info(`Container started: ${r}`)},async stopContainer(r){await o(`docker stop ${r}`),i.info(`Container stopped: ${r}`)},async restartContainer(r){await o(`docker restart ${r}`),i.info(`Container restarted: ${r}`)},async removeContainer(r,t=!1){await o(`docker rm ${t?"-f":""} ${r}`),i.info(`Container removed: ${r}`)},async buildImage(r,t="latest",a){let u=`docker build -t ${r}:${t}`;if(a!=null&&a.noCache&&(u+=" --no-cache"),a!=null&&a.pull&&(u+=" --pull"),a!=null&&a.target&&(u+=` --target ${a.target}`),a!=null&&a.platform&&(u+=` --platform ${a.platform}`),a!=null&&a.buildArgs)for(const[m,l]of Object.entries(a.buildArgs))u+=` --build-arg ${m}=${l}`;u+=" .",await o(u),i.info(`Image built: ${r}:${t}`)},async pushImage(r,t="latest"){const a=s.registry?`${s.registry}/${r}:${t}`:`${r}:${t}`;await o(`docker push ${a}`),i.info(`Image pushed: ${a}`)},async pullImage(r,t="latest"){await o(`docker pull ${r}:${t}`),i.info(`Image pulled: ${r}:${t}`)},async composeUp(r=!0){let t=`docker-compose -f ${e}`;n&&(t+=` -p ${n}`),t+=" up",r&&(t+=" -d"),await o(t),i.info("Docker Compose up completed")},async composeDown(r=!1){let t=`docker-compose -f ${e}`;n&&(t+=` -p ${n}`),t+=" down",r&&(t+=" -v"),await o(t),i.info("Docker Compose down completed")},async composeLogs(r,t=!1){let a=`docker-compose -f ${e}`;return n&&(a+=` -p ${n}`),a+=" logs",t&&(a+=" -f"),r&&(a+=` ${r}`),o(a)},async exec(r,t){return o(`docker exec ${r} ${t}`)}}}function I(s){return s?s.split(",").map(e=>{const n=e.match(/(\d+):(\d+)\/(\w+)/);return n?{external:parseInt(n[1],10),internal:parseInt(n[2],10),protocol:n[3]}:{external:0,internal:0,protocol:"tcp"}}).filter(e=>e.internal>0):[]}function D(s){const e=s.match(/([\d.]+)\s*(GB|MB|KB|B)/i);if(!e)return 0;const n=parseFloat(e[1]);switch(e[2].toUpperCase()){case"GB":return n*1024*1024*1024;case"MB":return n*1024*1024;case"KB":return n*1024;default:return n}}class x{constructor(e={}){c(this,"manager");c(this,"listContainers",()=>this.manager.listContainers());c(this,"listImages",()=>this.manager.listImages());c(this,"startContainer",e=>this.manager.startContainer(e));c(this,"stopContainer",e=>this.manager.stopContainer(e));c(this,"restartContainer",e=>this.manager.restartContainer(e));c(this,"removeContainer",(e,n)=>this.manager.removeContainer(e,n));c(this,"buildImage",(e,n)=>this.manager.buildImage(e,n));c(this,"pushImage",(e,n)=>this.manager.pushImage(e,n));c(this,"pullImage",(e,n)=>this.manager.pullImage(e,n));c(this,"composeUp",e=>this.manager.composeUp(e));c(this,"composeDown",e=>this.manager.composeDown(e));c(this,"composeLogs",(e,n)=>this.manager.composeLogs(e,n));c(this,"exec",(e,n)=>this.manager.exec(e,n));this.manager=g(e)}}exports.DockerManager=x;exports.createDockerManager=g;
4
- //# sourceMappingURL=manager-B1UKMjXW.js.map
@@ -1,152 +0,0 @@
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
package/dist/portal.d.ts DELETED
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}