hostfn 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/core/backup.test.d.ts +2 -0
- package/dist/__tests__/core/backup.test.d.ts.map +1 -0
- package/dist/__tests__/core/backup.test.js +108 -0
- package/dist/__tests__/core/backup.test.js.map +1 -0
- package/dist/__tests__/core/health.test.d.ts +2 -0
- package/dist/__tests__/core/health.test.d.ts.map +1 -0
- package/dist/__tests__/core/health.test.js +97 -0
- package/dist/__tests__/core/health.test.js.map +1 -0
- package/dist/__tests__/core/lock.test.d.ts +2 -0
- package/dist/__tests__/core/lock.test.d.ts.map +1 -0
- package/dist/__tests__/core/lock.test.js +136 -0
- package/dist/__tests__/core/lock.test.js.map +1 -0
- package/dist/__tests__/core/nginx-multi-domain.test.d.ts +2 -0
- package/dist/__tests__/core/nginx-multi-domain.test.d.ts.map +1 -0
- package/dist/__tests__/core/nginx-multi-domain.test.js +158 -0
- package/dist/__tests__/core/nginx-multi-domain.test.js.map +1 -0
- package/dist/__tests__/runtimes/pm2.test.d.ts +2 -0
- package/dist/__tests__/runtimes/pm2.test.d.ts.map +1 -0
- package/dist/__tests__/runtimes/pm2.test.js +111 -0
- package/dist/__tests__/runtimes/pm2.test.js.map +1 -0
- package/dist/__tests__/utils/validation.test.d.ts +2 -0
- package/dist/__tests__/utils/validation.test.d.ts.map +1 -0
- package/dist/__tests__/utils/validation.test.js +136 -0
- package/dist/__tests__/utils/validation.test.js.map +1 -0
- package/dist/commands/deploy.d.ts +11 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +636 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/env.d.ts +21 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +317 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/expose.d.ts +6 -0
- package/dist/commands/expose.d.ts.map +1 -0
- package/dist/commands/expose.js +379 -0
- package/dist/commands/expose.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +175 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +10 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +75 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/rollback.d.ts +6 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +113 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/server/info.d.ts +2 -0
- package/dist/commands/server/info.d.ts.map +1 -0
- package/dist/commands/server/info.js +104 -0
- package/dist/commands/server/info.js.map +1 -0
- package/dist/commands/server/setup.d.ts +11 -0
- package/dist/commands/server/setup.d.ts.map +1 -0
- package/dist/commands/server/setup.js +161 -0
- package/dist/commands/server/setup.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +120 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +54 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +323 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +108 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/backup.d.ts +34 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +95 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/health.d.ts +31 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +78 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/local.d.ts +19 -0
- package/dist/core/local.d.ts.map +1 -0
- package/dist/core/local.js +50 -0
- package/dist/core/local.js.map +1 -0
- package/dist/core/lock.d.ts +28 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +89 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/nginx.d.ts +43 -0
- package/dist/core/nginx.d.ts.map +1 -0
- package/dist/core/nginx.js +131 -0
- package/dist/core/nginx.js.map +1 -0
- package/dist/core/ssh.d.ts +79 -0
- package/dist/core/ssh.d.ts.map +1 -0
- package/dist/core/ssh.js +264 -0
- package/dist/core/ssh.js.map +1 -0
- package/dist/core/sync.d.ts +25 -0
- package/dist/core/sync.d.ts.map +1 -0
- package/dist/core/sync.js +117 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/workspace.d.ts +13 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +141 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +232 -0
- package/dist/index.js.map +1 -0
- package/dist/runtimes/base.d.ts +115 -0
- package/dist/runtimes/base.d.ts.map +1 -0
- package/dist/runtimes/base.js +16 -0
- package/dist/runtimes/base.js.map +1 -0
- package/dist/runtimes/nodejs/detector.d.ts +47 -0
- package/dist/runtimes/nodejs/detector.d.ts.map +1 -0
- package/dist/runtimes/nodejs/detector.js +143 -0
- package/dist/runtimes/nodejs/detector.js.map +1 -0
- package/dist/runtimes/nodejs/index.d.ts +14 -0
- package/dist/runtimes/nodejs/index.d.ts.map +1 -0
- package/dist/runtimes/nodejs/index.js +213 -0
- package/dist/runtimes/nodejs/index.js.map +1 -0
- package/dist/runtimes/nodejs/pm2.d.ts +17 -0
- package/dist/runtimes/nodejs/pm2.d.ts.map +1 -0
- package/dist/runtimes/nodejs/pm2.js +60 -0
- package/dist/runtimes/nodejs/pm2.js.map +1 -0
- package/dist/runtimes/registry.d.ts +34 -0
- package/dist/runtimes/registry.d.ts.map +1 -0
- package/dist/runtimes/registry.js +58 -0
- package/dist/runtimes/registry.js.map +1 -0
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +76 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +32 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +125 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +34 -20
- package/{packages/cli/src → src}/__tests__/runtimes/pm2.test.ts +2 -2
- package/{packages/cli/src → src}/commands/deploy.ts +39 -23
- package/{packages/cli/src → src}/commands/env.ts +19 -6
- package/{packages/cli/src → src}/commands/expose.ts +20 -6
- package/{packages/cli/src → src}/commands/logs.ts +8 -4
- package/{packages/cli/src → src}/commands/rollback.ts +8 -6
- package/{packages/cli/src → src}/commands/status.ts +7 -3
- package/LICENSE +0 -21
- package/README.md +0 -1136
- package/_conduct/specs/1.v0.spec.md +0 -1041
- package/examples/express-api/package.json +0 -22
- package/examples/express-api/src/index.ts +0 -16
- package/examples/express-api/tsconfig.json +0 -11
- package/examples/github-actions-deploy.yml +0 -40
- package/examples/monorepo-config.json +0 -76
- package/examples/monorepo-multi-server-config.json +0 -74
- package/packages/cli/package.json +0 -40
- package/turbo.json +0 -24
- /package/{packages/cli/src → src}/__tests__/core/backup.test.ts +0 -0
- /package/{packages/cli/src → src}/__tests__/core/health.test.ts +0 -0
- /package/{packages/cli/src → src}/__tests__/core/lock.test.ts +0 -0
- /package/{packages/cli/src → src}/__tests__/core/nginx-multi-domain.test.ts +0 -0
- /package/{packages/cli/src → src}/__tests__/utils/validation.test.ts +0 -0
- /package/{packages/cli/src → src}/commands/init.ts +0 -0
- /package/{packages/cli/src → src}/commands/server/info.ts +0 -0
- /package/{packages/cli/src → src}/commands/server/setup.ts +0 -0
- /package/{packages/cli/src → src}/config/loader.ts +0 -0
- /package/{packages/cli/src → src}/config/schema.ts +0 -0
- /package/{packages/cli/src → src}/core/backup.ts +0 -0
- /package/{packages/cli/src → src}/core/health.ts +0 -0
- /package/{packages/cli/src → src}/core/local.ts +0 -0
- /package/{packages/cli/src → src}/core/lock.ts +0 -0
- /package/{packages/cli/src → src}/core/nginx.ts +0 -0
- /package/{packages/cli/src → src}/core/ssh.ts +0 -0
- /package/{packages/cli/src → src}/core/sync.ts +0 -0
- /package/{packages/cli/src → src}/core/workspace.ts +0 -0
- /package/{packages/cli/src → src}/index.ts +0 -0
- /package/{packages/cli/src → src}/runtimes/base.ts +0 -0
- /package/{packages/cli/src → src}/runtimes/nodejs/detector.ts +0 -0
- /package/{packages/cli/src → src}/runtimes/nodejs/index.ts +0 -0
- /package/{packages/cli/src → src}/runtimes/nodejs/pm2.ts +0 -0
- /package/{packages/cli/src → src}/runtimes/registry.ts +0 -0
- /package/{packages/cli/src → src}/utils/logger.ts +0 -0
- /package/{packages/cli/src → src}/utils/validation.ts +0 -0
- /package/{packages/cli/tsconfig.json → tsconfig.json} +0 -0
- /package/{packages/cli/vitest.config.ts → vitest.config.ts} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { BaseRuntimeAdapter, } from '../base.js';
|
|
2
|
+
import { NodeJSDetector } from './detector.js';
|
|
3
|
+
import { PM2Manager } from './pm2.js';
|
|
4
|
+
/**
|
|
5
|
+
* Node.js runtime adapter
|
|
6
|
+
*/
|
|
7
|
+
export class NodeJSAdapter extends BaseRuntimeAdapter {
|
|
8
|
+
name = 'nodejs';
|
|
9
|
+
pm2Manager = new PM2Manager();
|
|
10
|
+
async detect(cwd) {
|
|
11
|
+
return NodeJSDetector.detect(cwd);
|
|
12
|
+
}
|
|
13
|
+
async getDefaultConfig(cwd) {
|
|
14
|
+
const pkg = NodeJSDetector.readPackageJson(cwd);
|
|
15
|
+
if (!pkg) {
|
|
16
|
+
throw new Error('package.json not found');
|
|
17
|
+
}
|
|
18
|
+
const buildCommand = NodeJSDetector.getBuildCommand(pkg);
|
|
19
|
+
const startCommand = NodeJSDetector.getStartCommand(pkg);
|
|
20
|
+
return {
|
|
21
|
+
name: pkg.name || 'my-app',
|
|
22
|
+
runtime: 'nodejs',
|
|
23
|
+
version: pkg.engines?.node?.match(/\d+/)?.[0] || '18',
|
|
24
|
+
build: buildCommand ? {
|
|
25
|
+
command: buildCommand,
|
|
26
|
+
directory: 'dist',
|
|
27
|
+
} : undefined,
|
|
28
|
+
start: {
|
|
29
|
+
command: startCommand,
|
|
30
|
+
entry: 'dist/index.js',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
generateSetupScript(version, options = {}) {
|
|
35
|
+
const port = options.port || 3000;
|
|
36
|
+
const env = options.environment || 'production';
|
|
37
|
+
const installRedis = options.installRedis ?? false;
|
|
38
|
+
return `#!/bin/bash
|
|
39
|
+
set -e
|
|
40
|
+
|
|
41
|
+
# Log everything to file
|
|
42
|
+
LOG_FILE="/tmp/hostfn-setup.log"
|
|
43
|
+
exec > >(tee -a "$LOG_FILE") 2>&1
|
|
44
|
+
echo "[$(date)] Starting hostfn setup..."
|
|
45
|
+
|
|
46
|
+
echo "=========================================="
|
|
47
|
+
echo "Node.js Server Setup (hostfn)"
|
|
48
|
+
echo "Environment: ${env}"
|
|
49
|
+
echo "=========================================="
|
|
50
|
+
|
|
51
|
+
# Detect OS
|
|
52
|
+
if [ -f /etc/os-release ]; then
|
|
53
|
+
. /etc/os-release
|
|
54
|
+
OS=$NAME
|
|
55
|
+
VER=$VERSION_ID
|
|
56
|
+
echo "Detected OS: $OS $VER"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# 1. Install Node.js via nvm
|
|
60
|
+
echo ""
|
|
61
|
+
echo "[1/7] Installing Node.js v${version} via nvm..."
|
|
62
|
+
if [ ! -d "$HOME/.nvm" ]; then
|
|
63
|
+
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
|
64
|
+
export NVM_DIR="$HOME/.nvm"
|
|
65
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh"
|
|
66
|
+
|
|
67
|
+
nvm install ${version}
|
|
68
|
+
nvm use ${version}
|
|
69
|
+
nvm alias default ${version}
|
|
70
|
+
echo "Node.js $(node --version) installed"
|
|
71
|
+
else
|
|
72
|
+
echo "nvm already installed"
|
|
73
|
+
source "$HOME/.nvm/nvm.sh"
|
|
74
|
+
nvm install ${version}
|
|
75
|
+
nvm use ${version}
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# 2. Install PM2
|
|
79
|
+
echo ""
|
|
80
|
+
echo "[2/7] Installing PM2 process manager..."
|
|
81
|
+
npm install -g pm2
|
|
82
|
+
pm2 --version
|
|
83
|
+
|
|
84
|
+
# 3. Install system dependencies
|
|
85
|
+
echo ""
|
|
86
|
+
echo "[3/7] Installing system dependencies..."
|
|
87
|
+
if command -v apt-get &> /dev/null; then
|
|
88
|
+
sudo apt-get update
|
|
89
|
+
sudo apt-get install -y nginx certbot python3-certbot-nginx rsync curl git build-essential
|
|
90
|
+
elif command -v yum &> /dev/null; then
|
|
91
|
+
sudo yum install -y nginx certbot python3-certbot-nginx rsync git gcc-c++ make
|
|
92
|
+
elif command -v dnf &> /dev/null; then
|
|
93
|
+
sudo dnf install -y nginx certbot python3-certbot-nginx rsync curl git gcc-c++ make
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# 4. Configure Nginx
|
|
97
|
+
echo ""
|
|
98
|
+
echo "[4/7] Configuring Nginx..."
|
|
99
|
+
if [ -d "/etc/nginx/sites-available" ]; then
|
|
100
|
+
NGINX_CONFIG="/etc/nginx/sites-available/hostfn-${env}"
|
|
101
|
+
sudo tee $NGINX_CONFIG > /dev/null <<'EOF'
|
|
102
|
+
server {
|
|
103
|
+
listen 80;
|
|
104
|
+
server_name _;
|
|
105
|
+
|
|
106
|
+
location / {
|
|
107
|
+
proxy_pass http://localhost:${port};
|
|
108
|
+
proxy_http_version 1.1;
|
|
109
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
110
|
+
proxy_set_header Connection 'upgrade';
|
|
111
|
+
proxy_set_header Host $host;
|
|
112
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
113
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
114
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
115
|
+
proxy_cache_bypass $http_upgrade;
|
|
116
|
+
proxy_read_timeout 60s;
|
|
117
|
+
proxy_connect_timeout 60s;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
EOF
|
|
121
|
+
sudo ln -sf $NGINX_CONFIG /etc/nginx/sites-enabled/hostfn-${env}
|
|
122
|
+
elif [ -d "/etc/nginx/conf.d" ]; then
|
|
123
|
+
NGINX_CONFIG="/etc/nginx/conf.d/hostfn-${env}.conf"
|
|
124
|
+
sudo tee $NGINX_CONFIG > /dev/null <<'EOF'
|
|
125
|
+
server {
|
|
126
|
+
listen 80 default_server;
|
|
127
|
+
server_name _;
|
|
128
|
+
|
|
129
|
+
location / {
|
|
130
|
+
proxy_pass http://localhost:${port};
|
|
131
|
+
proxy_http_version 1.1;
|
|
132
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
133
|
+
proxy_set_header Connection 'upgrade';
|
|
134
|
+
proxy_set_header Host $host;
|
|
135
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
136
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
137
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
138
|
+
proxy_cache_bypass $http_upgrade;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
EOF
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
sudo nginx -t
|
|
145
|
+
sudo systemctl restart nginx
|
|
146
|
+
sudo systemctl enable nginx
|
|
147
|
+
|
|
148
|
+
${installRedis ? `
|
|
149
|
+
# 5. Install Redis (optional)
|
|
150
|
+
echo ""
|
|
151
|
+
echo "[5/7] Installing Redis..."
|
|
152
|
+
if command -v apt-get &> /dev/null; then
|
|
153
|
+
sudo apt-get install -y redis-server
|
|
154
|
+
sudo systemctl enable redis-server
|
|
155
|
+
sudo systemctl start redis-server
|
|
156
|
+
elif command -v yum &> /dev/null; then
|
|
157
|
+
sudo yum install -y redis
|
|
158
|
+
sudo systemctl enable redis
|
|
159
|
+
sudo systemctl start redis
|
|
160
|
+
fi
|
|
161
|
+
` : `
|
|
162
|
+
# 5. Skip Redis installation
|
|
163
|
+
echo ""
|
|
164
|
+
echo "[5/7] Skipping Redis installation..."
|
|
165
|
+
`}
|
|
166
|
+
|
|
167
|
+
# 6. Create deployment directories
|
|
168
|
+
echo ""
|
|
169
|
+
echo "[6/7] Creating deployment directories..."
|
|
170
|
+
sudo mkdir -p /var/www
|
|
171
|
+
sudo chown -R $USER:$USER /var/www
|
|
172
|
+
mkdir -p /var/log/pm2
|
|
173
|
+
|
|
174
|
+
# 7. Configure PM2 startup
|
|
175
|
+
echo ""
|
|
176
|
+
echo "[7/7] Configuring PM2 startup..."
|
|
177
|
+
PM2_STARTUP_CMD=$(pm2 startup | grep 'sudo' | tail -n 1)
|
|
178
|
+
if [ -n "$PM2_STARTUP_CMD" ]; then
|
|
179
|
+
eval "$PM2_STARTUP_CMD" || echo "PM2 startup configured"
|
|
180
|
+
else
|
|
181
|
+
echo "PM2 startup already configured or not needed"
|
|
182
|
+
fi
|
|
183
|
+
pm2 save
|
|
184
|
+
|
|
185
|
+
# 8. Firewall setup
|
|
186
|
+
echo ""
|
|
187
|
+
echo "[8/7] Configuring firewall..."
|
|
188
|
+
if command -v ufw &> /dev/null; then
|
|
189
|
+
sudo ufw allow 22/tcp
|
|
190
|
+
sudo ufw allow 80/tcp
|
|
191
|
+
sudo ufw allow 443/tcp
|
|
192
|
+
sudo ufw --force enable
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
echo ""
|
|
196
|
+
echo "=========================================="
|
|
197
|
+
echo "✅ Server setup complete!"
|
|
198
|
+
echo "=========================================="
|
|
199
|
+
echo "Node.js: $(node --version)"
|
|
200
|
+
echo "npm: $(npm --version)"
|
|
201
|
+
echo "PM2: $(pm2 --version)"
|
|
202
|
+
echo "Nginx: Running"
|
|
203
|
+
echo "Port: ${port}"
|
|
204
|
+
echo "=========================================="
|
|
205
|
+
echo "[$(date)] Setup completed successfully"
|
|
206
|
+
echo "Log saved to: $LOG_FILE"
|
|
207
|
+
`;
|
|
208
|
+
}
|
|
209
|
+
getProcessManager() {
|
|
210
|
+
return this.pm2Manager;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtimes/nodejs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAKnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,kBAAkB;IAC1C,IAAI,GAAY,QAAQ,CAAC;IAC1B,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAEtC,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,OAAO,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAW;QAChC,MAAM,GAAG,GAAG,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEzD,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ;YAC1B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;YACrD,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;gBACpB,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,MAAM;aAClB,CAAC,CAAC,CAAC,SAAS;YACb,KAAK,EAAE;gBACL,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE,eAAe;aACvB;SACF,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,OAAe,EAAE,UAAwB,EAAE;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;QAClC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;QAChD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;QAEnD,OAAO;;;;;;;;;;qBAUU,GAAG;;;;;;;;;;;;;kCAaU,OAAO;;;;;;kBAMvB,OAAO;cACX,OAAO;wBACG,OAAO;;;;;kBAKb,OAAO;cACX,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;sDAyBiC,GAAG;;;;;;;sCAOnB,IAAI;;;;;;;;;;;;;;gEAcsB,GAAG;;6CAEtB,GAAG;;;;;;;sCAOV,IAAI;;;;;;;;;;;;;;;;;;EAkBxC,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;;CAahB,CAAC,CAAC,CAAC;;;;CAIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAsCa,IAAI;;;;CAIjB,CAAC;IACA,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ProcessManager, RuntimeConfig } from '../base.js';
|
|
2
|
+
/**
|
|
3
|
+
* PM2 process manager for Node.js
|
|
4
|
+
*/
|
|
5
|
+
export declare class PM2Manager implements ProcessManager {
|
|
6
|
+
readonly name = "pm2";
|
|
7
|
+
generateStartCommand(config: RuntimeConfig, environment: string): string;
|
|
8
|
+
generateReloadCommand(serviceName: string): string;
|
|
9
|
+
generateStopCommand(serviceName: string): string;
|
|
10
|
+
generateStatusCommand(serviceName: string): string;
|
|
11
|
+
generateLogsCommand(serviceName: string, lines?: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate PM2 ecosystem config file content
|
|
14
|
+
*/
|
|
15
|
+
generateEcosystemConfig(config: RuntimeConfig, environment: string, envVars?: Record<string, string>): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=pm2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../../../src/runtimes/nodejs/pm2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,qBAAa,UAAW,YAAW,cAAc;IAC/C,QAAQ,CAAC,IAAI,SAAS;IAEtB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAOxE,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIlD,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIhD,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIlD,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,MAAM;IAIrE;;OAEG;IACH,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM;CAoClH"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM2 process manager for Node.js
|
|
3
|
+
*/
|
|
4
|
+
export class PM2Manager {
|
|
5
|
+
name = 'pm2';
|
|
6
|
+
generateStartCommand(config, environment) {
|
|
7
|
+
const serviceName = `${config.name}-${environment}`;
|
|
8
|
+
const entry = config.start.entry || 'dist/index.js';
|
|
9
|
+
return `pm2 start ${entry} --name ${serviceName} -i max --env ${environment}`;
|
|
10
|
+
}
|
|
11
|
+
generateReloadCommand(serviceName) {
|
|
12
|
+
return `pm2 reload ${serviceName} --update-env`;
|
|
13
|
+
}
|
|
14
|
+
generateStopCommand(serviceName) {
|
|
15
|
+
return `pm2 stop ${serviceName}`;
|
|
16
|
+
}
|
|
17
|
+
generateStatusCommand(serviceName) {
|
|
18
|
+
return `pm2 list | grep ${serviceName}`;
|
|
19
|
+
}
|
|
20
|
+
generateLogsCommand(serviceName, lines = 100) {
|
|
21
|
+
return `pm2 logs ${serviceName} --lines ${lines}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate PM2 ecosystem config file content
|
|
25
|
+
*/
|
|
26
|
+
generateEcosystemConfig(config, environment, envVars = {}) {
|
|
27
|
+
const serviceName = `${config.name}-${environment}`;
|
|
28
|
+
const entry = config.start.entry || 'dist/index.js';
|
|
29
|
+
// Merge base env with provided env vars
|
|
30
|
+
const allEnv = {
|
|
31
|
+
NODE_ENV: environment,
|
|
32
|
+
PORT: config.port || 3000,
|
|
33
|
+
...envVars
|
|
34
|
+
};
|
|
35
|
+
// Generate env object string
|
|
36
|
+
const envString = Object.entries(allEnv)
|
|
37
|
+
.map(([key, value]) => ` ${key}: ${JSON.stringify(value)}`)
|
|
38
|
+
.join(',\n');
|
|
39
|
+
return `module.exports = {
|
|
40
|
+
apps: [{
|
|
41
|
+
name: '${serviceName}',
|
|
42
|
+
script: '${entry}',
|
|
43
|
+
instances: 'max',
|
|
44
|
+
exec_mode: 'cluster',
|
|
45
|
+
env: {
|
|
46
|
+
${envString}
|
|
47
|
+
},
|
|
48
|
+
error_file: './logs/err.log',
|
|
49
|
+
out_file: './logs/out.log',
|
|
50
|
+
time: true,
|
|
51
|
+
autorestart: true,
|
|
52
|
+
max_restarts: 10,
|
|
53
|
+
min_uptime: '10s',
|
|
54
|
+
max_memory_restart: '1G'
|
|
55
|
+
}]
|
|
56
|
+
};
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=pm2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2.js","sourceRoot":"","sources":["../../../src/runtimes/nodejs/pm2.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,UAAU;IACZ,IAAI,GAAG,KAAK,CAAC;IAEtB,oBAAoB,CAAC,MAAqB,EAAE,WAAmB;QAC7D,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,eAAe,CAAC;QAEpD,OAAO,aAAa,KAAK,WAAW,WAAW,iBAAiB,WAAW,EAAE,CAAC;IAChF,CAAC;IAED,qBAAqB,CAAC,WAAmB;QACvC,OAAO,cAAc,WAAW,eAAe,CAAC;IAClD,CAAC;IAED,mBAAmB,CAAC,WAAmB;QACrC,OAAO,YAAY,WAAW,EAAE,CAAC;IACnC,CAAC;IAED,qBAAqB,CAAC,WAAmB;QACvC,OAAO,mBAAmB,WAAW,EAAE,CAAC;IAC1C,CAAC;IAED,mBAAmB,CAAC,WAAmB,EAAE,QAAgB,GAAG;QAC1D,OAAO,YAAY,WAAW,YAAY,KAAK,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,MAAqB,EAAE,WAAmB,EAAE,UAAkC,EAAE;QACtG,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,eAAe,CAAC;QAEpD,wCAAwC;QACxC,MAAM,MAAM,GAAG;YACb,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;YACzB,GAAG,OAAO;SACX,CAAC;QAEF,6BAA6B;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aACrC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;aAC/D,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,OAAO;;aAEE,WAAW;eACT,KAAK;;;;EAIlB,SAAS;;;;;;;;;;;CAWV,CAAC;IACA,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Runtime } from '../config/schema.js';
|
|
2
|
+
import { RuntimeAdapter } from './base.js';
|
|
3
|
+
/**
|
|
4
|
+
* Runtime adapter registry
|
|
5
|
+
* Manages all available runtime adapters
|
|
6
|
+
*/
|
|
7
|
+
export declare class RuntimeRegistry {
|
|
8
|
+
private static adapters;
|
|
9
|
+
/**
|
|
10
|
+
* Register a runtime adapter
|
|
11
|
+
*/
|
|
12
|
+
static register(adapter: RuntimeAdapter): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get runtime adapter by name
|
|
15
|
+
*/
|
|
16
|
+
static get(runtime: Runtime): RuntimeAdapter;
|
|
17
|
+
/**
|
|
18
|
+
* Get all registered adapters
|
|
19
|
+
*/
|
|
20
|
+
static getAll(): RuntimeAdapter[];
|
|
21
|
+
/**
|
|
22
|
+
* Check if runtime is supported
|
|
23
|
+
*/
|
|
24
|
+
static has(runtime: Runtime): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Auto-detect runtime in project directory
|
|
27
|
+
*/
|
|
28
|
+
static detect(cwd: string): Promise<{
|
|
29
|
+
runtime: Runtime;
|
|
30
|
+
adapter: RuntimeAdapter;
|
|
31
|
+
confidence: number;
|
|
32
|
+
} | null>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/runtimes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsC;IAE7D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAI9C;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc;IAW5C;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,cAAc,EAAE;IAIjC;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAIrC;;OAEG;WACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACxC,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,cAAc,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CAuBV"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime adapter registry
|
|
3
|
+
* Manages all available runtime adapters
|
|
4
|
+
*/
|
|
5
|
+
export class RuntimeRegistry {
|
|
6
|
+
static adapters = new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Register a runtime adapter
|
|
9
|
+
*/
|
|
10
|
+
static register(adapter) {
|
|
11
|
+
this.adapters.set(adapter.name, adapter);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get runtime adapter by name
|
|
15
|
+
*/
|
|
16
|
+
static get(runtime) {
|
|
17
|
+
const adapter = this.adapters.get(runtime);
|
|
18
|
+
if (!adapter) {
|
|
19
|
+
throw new Error(`Runtime adapter not found: ${runtime}\n` +
|
|
20
|
+
`Available runtimes: ${Array.from(this.adapters.keys()).join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
return adapter;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get all registered adapters
|
|
26
|
+
*/
|
|
27
|
+
static getAll() {
|
|
28
|
+
return Array.from(this.adapters.values());
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if runtime is supported
|
|
32
|
+
*/
|
|
33
|
+
static has(runtime) {
|
|
34
|
+
return this.adapters.has(runtime);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Auto-detect runtime in project directory
|
|
38
|
+
*/
|
|
39
|
+
static async detect(cwd) {
|
|
40
|
+
const results = await Promise.all(Array.from(this.adapters.values()).map(async (adapter) => {
|
|
41
|
+
const result = await adapter.detect(cwd);
|
|
42
|
+
return {
|
|
43
|
+
runtime: adapter.name,
|
|
44
|
+
adapter,
|
|
45
|
+
...result,
|
|
46
|
+
};
|
|
47
|
+
}));
|
|
48
|
+
// Sort by confidence and get the best match
|
|
49
|
+
const sorted = results
|
|
50
|
+
.filter(r => r.detected)
|
|
51
|
+
.sort((a, b) => b.confidence - a.confidence);
|
|
52
|
+
if (sorted.length === 0) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return sorted[0];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/runtimes/registry.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE7D;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAuB;QACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAgB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,IAAI;gBACzC,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAgB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAW;QAK7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,OAAO;gBACP,GAAG,MAAM;aACV,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,4CAA4C;QAC5C,MAAM,MAAM,GAAG,OAAO;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare class Logger {
|
|
2
|
+
/**
|
|
3
|
+
* Log info message
|
|
4
|
+
*/
|
|
5
|
+
static info(message: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Log success message
|
|
8
|
+
*/
|
|
9
|
+
static success(message: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Log warning message
|
|
12
|
+
*/
|
|
13
|
+
static warn(message: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Log error message
|
|
16
|
+
*/
|
|
17
|
+
static error(message: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Log step message (with emoji)
|
|
20
|
+
*/
|
|
21
|
+
static step(emoji: string, message: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Log header/title
|
|
24
|
+
*/
|
|
25
|
+
static header(message: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Log section
|
|
28
|
+
*/
|
|
29
|
+
static section(message: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Log plain message
|
|
32
|
+
*/
|
|
33
|
+
static log(message: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Log empty line
|
|
36
|
+
*/
|
|
37
|
+
static br(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Log key-value pair
|
|
40
|
+
*/
|
|
41
|
+
static kv(key: string, value: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Log command to run
|
|
44
|
+
*/
|
|
45
|
+
static command(cmd: string): void;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACjB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjD;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMrC;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,IAAI;IAIjB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGlC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export class Logger {
|
|
3
|
+
/**
|
|
4
|
+
* Log info message
|
|
5
|
+
*/
|
|
6
|
+
static info(message) {
|
|
7
|
+
console.log(chalk.blue('ℹ'), message);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Log success message
|
|
11
|
+
*/
|
|
12
|
+
static success(message) {
|
|
13
|
+
console.log(chalk.green('✓'), message);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Log warning message
|
|
17
|
+
*/
|
|
18
|
+
static warn(message) {
|
|
19
|
+
console.log(chalk.yellow('⚠'), message);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Log error message
|
|
23
|
+
*/
|
|
24
|
+
static error(message) {
|
|
25
|
+
console.log(chalk.red('✗'), message);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log step message (with emoji)
|
|
29
|
+
*/
|
|
30
|
+
static step(emoji, message) {
|
|
31
|
+
console.log(emoji, chalk.bold(message));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Log header/title
|
|
35
|
+
*/
|
|
36
|
+
static header(message) {
|
|
37
|
+
console.log();
|
|
38
|
+
console.log(chalk.bold.cyan('='.repeat(50)));
|
|
39
|
+
console.log(chalk.bold.cyan(message));
|
|
40
|
+
console.log(chalk.bold.cyan('='.repeat(50)));
|
|
41
|
+
console.log();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Log section
|
|
45
|
+
*/
|
|
46
|
+
static section(message) {
|
|
47
|
+
console.log();
|
|
48
|
+
console.log(chalk.bold(message));
|
|
49
|
+
console.log(chalk.gray('-'.repeat(message.length)));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Log plain message
|
|
53
|
+
*/
|
|
54
|
+
static log(message) {
|
|
55
|
+
console.log(message);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Log empty line
|
|
59
|
+
*/
|
|
60
|
+
static br() {
|
|
61
|
+
console.log();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Log key-value pair
|
|
65
|
+
*/
|
|
66
|
+
static kv(key, value) {
|
|
67
|
+
console.log(` ${chalk.gray(key + ':')} ${value}`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Log command to run
|
|
71
|
+
*/
|
|
72
|
+
static command(cmd) {
|
|
73
|
+
console.log(chalk.gray(' $ ') + chalk.cyan(cmd));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,MAAM;IACjB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAa,EAAE,OAAe;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAe;QAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAe;QAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,OAAe;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,GAAW,EAAE,KAAa;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAW;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Validate SSH connection string format
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateSSHConnection(connectionString: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Validate HTTP URL format
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateHttpUrl(url: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Validate environment name
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateEnvironmentName(name: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Validate port number
|
|
18
|
+
*/
|
|
19
|
+
export declare function validatePort(port: number): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Validate Node.js version format
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateNodeVersion(version: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Validate application name
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateAppName(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Validate remote directory path
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateRemotePath(path: string): boolean;
|
|
32
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAavE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAcpD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAW7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYlD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAe5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBxD"}
|