@heramb1/cli 0.1.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.
- package/dist/commands/deploy.d.ts +9 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +82 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +52 -0
- package/dist/commands/env.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 +82 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +27 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/migrate.d.ts +8 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +84 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +55 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +36 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/ws.d.ts +2 -0
- package/dist/commands/ws.d.ts.map +1 -0
- package/dist/commands/ws.js +37 -0
- package/dist/commands/ws.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +6 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +23 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/connect.d.ts +7 -0
- package/dist/utils/connect.d.ts.map +1 -0
- package/dist/utils/connect.js +101 -0
- package/dist/utils/connect.js.map +1 -0
- package/dist/utils/credentials.d.ts +8 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +56 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/gitignore.d.ts +5 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +35 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/output.d.ts +23 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +53 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/preview.d.ts +7 -0
- package/dist/utils/preview.d.ts.map +1 -0
- package/dist/utils/preview.js +31 -0
- package/dist/utils/preview.js.map +1 -0
- package/dist/utils/provider-pick.d.ts +5 -0
- package/dist/utils/provider-pick.d.ts.map +1 -0
- package/dist/utils/provider-pick.js +110 -0
- package/dist/utils/provider-pick.js.map +1 -0
- package/dist/utils/registry.d.ts +3 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +42 -0
- package/dist/utils/registry.js.map +1 -0
- package/dist/utils/stack-detector.d.ts +4 -0
- package/dist/utils/stack-detector.d.ts.map +1 -0
- package/dist/utils/stack-detector.js +141 -0
- package/dist/utils/stack-detector.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type DeployEnv } from '../utils/preview.js';
|
|
2
|
+
export interface DeployCommandOptions {
|
|
3
|
+
backendOnly?: boolean;
|
|
4
|
+
frontendOnly?: boolean;
|
|
5
|
+
env?: DeployEnv;
|
|
6
|
+
branch?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function deployCommand(options?: DeployCommandOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAWzF,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ErF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { Orchestrator, isProviderConfig } from '@heramb1/core';
|
|
4
|
+
import { loadHerambConfig, saveHerambConfig } from '../utils/config.js';
|
|
5
|
+
import { createRegistry } from '../utils/registry.js';
|
|
6
|
+
import { applyPreviewContext, resolveBranch } from '../utils/preview.js';
|
|
7
|
+
import { formatStepFailure, formatStepLabel, formatStepSuccess, printBanner, printError, printPreviewReady, printUnlock, } from '../utils/output.js';
|
|
8
|
+
export async function deployCommand(options = {}) {
|
|
9
|
+
printBanner();
|
|
10
|
+
const deployEnv = options.env ?? 'production';
|
|
11
|
+
let config = loadHerambConfig();
|
|
12
|
+
if (deployEnv === 'preview') {
|
|
13
|
+
const branch = resolveBranch(options.branch);
|
|
14
|
+
if (!branch) {
|
|
15
|
+
printError('Preview deploy requires --branch (or GITHUB_HEAD_REF in CI)');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
config = applyPreviewContext(config, branch);
|
|
19
|
+
console.log(chalk.dim(`Preview deploy for branch: ${chalk.cyan(branch)}\n`));
|
|
20
|
+
}
|
|
21
|
+
const registry = createRegistry(config);
|
|
22
|
+
let currentSpinner = null;
|
|
23
|
+
const orchestrator = new Orchestrator({
|
|
24
|
+
config,
|
|
25
|
+
registry,
|
|
26
|
+
credentials: {},
|
|
27
|
+
backendOnly: options.backendOnly,
|
|
28
|
+
frontendOnly: options.frontendOnly,
|
|
29
|
+
deployEnv,
|
|
30
|
+
branch: resolveBranch(options.branch),
|
|
31
|
+
corsWildcardFirstDeploy: deployEnv === 'production',
|
|
32
|
+
onStepStart: (step, index, total) => {
|
|
33
|
+
currentSpinner?.stop();
|
|
34
|
+
currentSpinner = ora(formatStepLabel(index, total, step.label)).start();
|
|
35
|
+
},
|
|
36
|
+
onStepComplete: (result, index, total) => {
|
|
37
|
+
currentSpinner?.stop();
|
|
38
|
+
const prefix = formatStepLabel(index, total, result.step.label);
|
|
39
|
+
if (result.success) {
|
|
40
|
+
console.log(`${prefix} ${formatStepSuccess(result.value)}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log(`${prefix} ${formatStepFailure(result.error)}`);
|
|
44
|
+
}
|
|
45
|
+
currentSpinner = null;
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const report = await orchestrator.run();
|
|
49
|
+
if (Object.keys(report.serviceIds).length > 0) {
|
|
50
|
+
let configUpdated = false;
|
|
51
|
+
for (const [key, id] of Object.entries(report.serviceIds)) {
|
|
52
|
+
const svc = config.services[key];
|
|
53
|
+
if (isProviderConfig(svc) && !svc.serviceId && !svc.projectId) {
|
|
54
|
+
svc.serviceId = id;
|
|
55
|
+
configUpdated = true;
|
|
56
|
+
}
|
|
57
|
+
else if (isProviderConfig(svc) && svc.provider === 'vercel' && !svc.projectId) {
|
|
58
|
+
svc.projectId = id;
|
|
59
|
+
configUpdated = true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (configUpdated) {
|
|
63
|
+
saveHerambConfig(config);
|
|
64
|
+
console.log(chalk.dim('Updated heramb.config.json with linked service IDs\n'));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (report.success) {
|
|
68
|
+
if (deployEnv === 'preview') {
|
|
69
|
+
printPreviewReady(report);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
printUnlock(report);
|
|
73
|
+
}
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const lastError = report.steps.find((s) => !s.success)?.error;
|
|
78
|
+
printError(lastError ?? 'Deploy failed');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AASA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCpD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import { isProviderConfig } from '@heramb1/core';
|
|
6
|
+
import { loadHerambConfig } from '../utils/config.js';
|
|
7
|
+
import { createRegistry } from '../utils/registry.js';
|
|
8
|
+
import { printBanner } from '../utils/output.js';
|
|
9
|
+
export async function envPushCommand() {
|
|
10
|
+
printBanner();
|
|
11
|
+
const config = loadHerambConfig();
|
|
12
|
+
const registry = createRegistry(config);
|
|
13
|
+
const envPath = resolve(process.cwd(), '.env');
|
|
14
|
+
if (!existsSync(envPath)) {
|
|
15
|
+
console.error(chalk.red('No .env file found'));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const vars = dotenv.parse(readFileSync(envPath));
|
|
19
|
+
let pushed = 0;
|
|
20
|
+
for (const [key, svc] of Object.entries(config.services)) {
|
|
21
|
+
if (!isProviderConfig(svc) || !svc.serviceId)
|
|
22
|
+
continue;
|
|
23
|
+
const lock = registry.getLock(svc.provider);
|
|
24
|
+
if (!lock)
|
|
25
|
+
continue;
|
|
26
|
+
const manual = config.env?.manual ?? [];
|
|
27
|
+
const toPush = {};
|
|
28
|
+
for (const [k, v] of Object.entries(vars)) {
|
|
29
|
+
if (v !== undefined)
|
|
30
|
+
toPush[k] = v;
|
|
31
|
+
}
|
|
32
|
+
for (const m of manual) {
|
|
33
|
+
if (vars[m])
|
|
34
|
+
toPush[m] = vars[m];
|
|
35
|
+
}
|
|
36
|
+
const result = await lock.setEnvVars(svc.serviceId, toPush);
|
|
37
|
+
if (result.ok) {
|
|
38
|
+
console.log(chalk.green('✓') + ` Pushed ${Object.keys(toPush).length} vars to ${key} (${svc.provider})`);
|
|
39
|
+
pushed++;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.log(chalk.red('✗') + ` ${key}: ${result.error}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
console.log(chalk.dim(`\n${pushed} service(s) updated\n`));
|
|
46
|
+
}
|
|
47
|
+
export async function envPullCommand() {
|
|
48
|
+
printBanner();
|
|
49
|
+
console.log(chalk.yellow('env pull requires provider-specific env list APIs — coming in v0.2'));
|
|
50
|
+
console.log(chalk.dim('Use `heramb status` to verify deployed URLs\n'));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAYA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAiFjD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { basename } from 'node:path';
|
|
4
|
+
import { buildDeployPlan, providersNeededForPlan } from '@heramb1/core';
|
|
5
|
+
import { detectStack } from '../utils/stack-detector.js';
|
|
6
|
+
import { saveHerambConfig, configExists } from '../utils/config.js';
|
|
7
|
+
import { getCredentialsPath } from '../utils/credentials.js';
|
|
8
|
+
import { ensureGitignore } from '../utils/gitignore.js';
|
|
9
|
+
import { connectProviders } from '../utils/connect.js';
|
|
10
|
+
import { pickProviders, generateConfigFromChoices } from '../utils/provider-pick.js';
|
|
11
|
+
import { printBanner } from '../utils/output.js';
|
|
12
|
+
export async function initCommand() {
|
|
13
|
+
printBanner();
|
|
14
|
+
if (configExists()) {
|
|
15
|
+
const { overwrite } = await inquirer.prompt([
|
|
16
|
+
{
|
|
17
|
+
type: 'confirm',
|
|
18
|
+
name: 'overwrite',
|
|
19
|
+
message: 'heramb.config.json already exists. Overwrite?',
|
|
20
|
+
default: false,
|
|
21
|
+
},
|
|
22
|
+
]);
|
|
23
|
+
if (!overwrite) {
|
|
24
|
+
console.log(chalk.dim('Init cancelled.'));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
console.log(chalk.dim('Scanning repo...\n'));
|
|
29
|
+
const stack = detectStack();
|
|
30
|
+
const plan = buildDeployPlan(stack);
|
|
31
|
+
if (stack.frontend) {
|
|
32
|
+
console.log(chalk.green('✓') + ` Frontend: ${stack.frontend.framework} at ${stack.frontend.path}`);
|
|
33
|
+
}
|
|
34
|
+
if (stack.backend) {
|
|
35
|
+
console.log(chalk.green('✓') + ` Backend: ${stack.backend.runtime} at ${stack.backend.path}`);
|
|
36
|
+
}
|
|
37
|
+
if (!stack.frontend && !stack.backend) {
|
|
38
|
+
console.log(chalk.yellow('⚠') + ' No frontend or backend detected — you can configure manually');
|
|
39
|
+
}
|
|
40
|
+
for (const line of plan.summary) {
|
|
41
|
+
console.log(chalk.cyan('→') + ` ${line}`);
|
|
42
|
+
}
|
|
43
|
+
for (const warning of stack.warnings) {
|
|
44
|
+
console.log(chalk.yellow('⚠') + ` ${warning}`);
|
|
45
|
+
if (warning.includes('hardcode port') || warning.includes('process.env.PORT')) {
|
|
46
|
+
console.log(chalk.dim(' Fix: app.listen(process.env.PORT || 3000)'));
|
|
47
|
+
}
|
|
48
|
+
if (warning.includes('Redis adapter')) {
|
|
49
|
+
console.log(chalk.dim(' Heramb will inject REDIS_URL — add @socket.io/redis-adapter to your app'));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const providerChoices = plan.services.length > 0 ? await pickProviders(plan) : {};
|
|
53
|
+
const providersNeeded = providersNeededForPlan(plan, providerChoices);
|
|
54
|
+
if (providersNeeded.length > 0) {
|
|
55
|
+
console.log(chalk.dim('\nConnect the platforms you chose — paste API keys or sign up on the fly:\n'));
|
|
56
|
+
await connectProviders(providersNeeded, { skipExisting: true });
|
|
57
|
+
}
|
|
58
|
+
const defaultName = basename(process.cwd()).replace(/[^a-z0-9-]/gi, '-').toLowerCase();
|
|
59
|
+
const { projectName } = await inquirer.prompt([
|
|
60
|
+
{
|
|
61
|
+
type: 'input',
|
|
62
|
+
name: 'projectName',
|
|
63
|
+
message: 'Project name:',
|
|
64
|
+
default: defaultName,
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
const config = plan.services.length > 0
|
|
68
|
+
? generateConfigFromChoices(projectName, stack, providerChoices, plan.requirements)
|
|
69
|
+
: { project: projectName, services: {}, env: { manual: ['JWT_SECRET'] } };
|
|
70
|
+
saveHerambConfig(config);
|
|
71
|
+
const gitignoreResult = ensureGitignore();
|
|
72
|
+
if (gitignoreResult === 'created') {
|
|
73
|
+
console.log(chalk.green('✓') + ' Created .gitignore (secrets excluded from git)');
|
|
74
|
+
}
|
|
75
|
+
else if (gitignoreResult === 'updated') {
|
|
76
|
+
console.log(chalk.green('✓') + ' Updated .gitignore with Heramb secret patterns');
|
|
77
|
+
}
|
|
78
|
+
console.log(chalk.green('\n✓') + ' Created heramb.config.json');
|
|
79
|
+
console.log(chalk.dim(`Credentials stored in ${getCredentialsPath()}`));
|
|
80
|
+
console.log(chalk.dim('\nNext: heramb deploy\n'));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBpE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { isProviderConfig } from '@heramb1/core';
|
|
3
|
+
import { loadHerambConfig } from '../utils/config.js';
|
|
4
|
+
import { createRegistry } from '../utils/registry.js';
|
|
5
|
+
import { printBanner } from '../utils/output.js';
|
|
6
|
+
export async function logsCommand(serviceName) {
|
|
7
|
+
printBanner();
|
|
8
|
+
const config = loadHerambConfig();
|
|
9
|
+
const registry = createRegistry(config);
|
|
10
|
+
const svc = config.services[serviceName];
|
|
11
|
+
if (!svc || !isProviderConfig(svc)) {
|
|
12
|
+
console.error(chalk.red(`Service "${serviceName}" not found in heramb.config.json`));
|
|
13
|
+
console.log(chalk.dim('\nAvailable: ' + Object.keys(config.services).join(', ')));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const lock = registry.getLock(svc.provider);
|
|
17
|
+
if (!lock || !svc.serviceId) {
|
|
18
|
+
console.error(chalk.red(`Service "${serviceName}" not linked — add serviceId in config`));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.dim(`Tailing logs for ${serviceName} (${svc.provider})...\n`));
|
|
22
|
+
for await (const line of lock.getLogs(svc.serviceId)) {
|
|
23
|
+
console.log(line);
|
|
24
|
+
}
|
|
25
|
+
console.log('');
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACnD,WAAW,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,WAAW,mCAAmC,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,WAAW,wCAAwC,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,WAAW,KAAK,GAAG,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC;IAEjF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FhF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { isProviderConfig } from '@heramb1/core';
|
|
4
|
+
import { loadHerambConfig, saveHerambConfig } from '../utils/config.js';
|
|
5
|
+
import { printBanner } from '../utils/output.js';
|
|
6
|
+
const IMPLEMENTED_PROVIDERS = ['railway', 'vercel', 'upstash'];
|
|
7
|
+
const PLANNED_PROVIDERS = ['render', 'netlify', 'fly', 'heroku', 'cloudflare-pages'];
|
|
8
|
+
export async function migrateCommand(options = {}) {
|
|
9
|
+
printBanner();
|
|
10
|
+
const config = loadHerambConfig();
|
|
11
|
+
let target = options.service;
|
|
12
|
+
if (!target) {
|
|
13
|
+
const services = Object.entries(config.services)
|
|
14
|
+
.filter(([, s]) => isProviderConfig(s))
|
|
15
|
+
.map(([k]) => k);
|
|
16
|
+
const { selected } = await inquirer.prompt([
|
|
17
|
+
{
|
|
18
|
+
type: 'list',
|
|
19
|
+
name: 'selected',
|
|
20
|
+
message: 'Which service to migrate?',
|
|
21
|
+
choices: services,
|
|
22
|
+
},
|
|
23
|
+
]);
|
|
24
|
+
target = selected;
|
|
25
|
+
}
|
|
26
|
+
const svc = config.services[target];
|
|
27
|
+
if (!svc || !isProviderConfig(svc)) {
|
|
28
|
+
console.error(chalk.red(`Service "${target}" not found`));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const fromProvider = options.from ?? svc.provider;
|
|
32
|
+
let toProvider = options.to;
|
|
33
|
+
if (!toProvider) {
|
|
34
|
+
const { selected } = await inquirer.prompt([
|
|
35
|
+
{
|
|
36
|
+
type: 'list',
|
|
37
|
+
name: 'selected',
|
|
38
|
+
message: `Migrate ${target} from ${fromProvider} to:`,
|
|
39
|
+
choices: PLANNED_PROVIDERS.filter((p) => p !== fromProvider),
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
toProvider = selected;
|
|
43
|
+
}
|
|
44
|
+
if (fromProvider === toProvider) {
|
|
45
|
+
console.error(chalk.red('Source and target providers must differ'));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
console.log(chalk.dim(`\nMigration plan: ${target} (${fromProvider} → ${toProvider})\n`));
|
|
49
|
+
const steps = [
|
|
50
|
+
`Read env vars from ${fromProvider}`,
|
|
51
|
+
`Deploy ${target} to ${toProvider}`,
|
|
52
|
+
'Run smoke tests on new deployment',
|
|
53
|
+
'Update frontend env vars (NEXT_PUBLIC_API_URL)',
|
|
54
|
+
'Patch CORS on new backend',
|
|
55
|
+
'Verify CORS + WebSocket end to end',
|
|
56
|
+
'Mark migration complete (old deployment untouched until verified)',
|
|
57
|
+
];
|
|
58
|
+
steps.forEach((step, i) => {
|
|
59
|
+
console.log(chalk.dim(` ${i + 1}.`) + ` ${step}`);
|
|
60
|
+
});
|
|
61
|
+
console.log('');
|
|
62
|
+
if (!IMPLEMENTED_PROVIDERS.includes(toProvider) && !IMPLEMENTED_PROVIDERS.includes(fromProvider)) {
|
|
63
|
+
console.log(chalk.yellow(`⚠ Provider locks for ${fromProvider} → ${toProvider} are planned.`));
|
|
64
|
+
console.log(chalk.dim(`Available locks today: ${IMPLEMENTED_PROVIDERS.join(', ')}\n`));
|
|
65
|
+
}
|
|
66
|
+
if (options.dryRun) {
|
|
67
|
+
console.log(chalk.dim('Dry run — config not modified.\n'));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const previousProvider = svc.provider;
|
|
71
|
+
svc.provider = toProvider;
|
|
72
|
+
svc.serviceId = undefined;
|
|
73
|
+
saveHerambConfig(config);
|
|
74
|
+
console.log(chalk.green('✓') + ` Updated heramb.config.json: ${target} → ${toProvider}`);
|
|
75
|
+
console.log(chalk.dim(`\nOld ${fromProvider} deployment remains live.`));
|
|
76
|
+
console.log(chalk.dim('Next steps:'));
|
|
77
|
+
console.log(chalk.dim(` 1. heramb init # add ${toProvider} credentials if needed`));
|
|
78
|
+
console.log(chalk.dim(` 2. heramb deploy # deploy + validate before DNS switch`));
|
|
79
|
+
console.log(chalk.dim(` 3. heramb status # confirm new URLs\n`));
|
|
80
|
+
if (previousProvider !== fromProvider) {
|
|
81
|
+
console.log(chalk.yellow(`Note: config had provider "${previousProvider}", migrated from "${fromProvider}" as specified.\n`));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC/D,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AASrF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA0B,EAAE;IAC/D,WAAW,EAAE,CAAC;IAEd,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;YAC/D;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,2BAA2B;gBACpC,OAAO,EAAE,QAAQ;aAClB;SACF,CAAC,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC;IACpB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAO,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,MAAM,aAAa,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;IAClD,IAAI,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;IAE5B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;YAC/D;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,WAAW,MAAM,SAAS,YAAY,MAAM;gBACrD,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC;aAC7D;SACF,CAAC,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,KAAK,YAAY,MAAM,UAAU,KAAK,CAAC,CAAC,CAAC;IAE1F,MAAM,KAAK,GAAG;QACZ,sBAAsB,YAAY,EAAE;QACpC,UAAU,MAAM,OAAO,UAAU,EAAE;QACnC,mCAAmC;QACnC,gDAAgD;QAChD,2BAA2B;QAC3B,oCAAoC;QACpC,mEAAmE;KACpE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,YAAY,MAAM,UAAU,eAAe,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,GAAG,CAAC,QAAQ,CAAC;IACtC,GAAG,CAAC,QAAQ,GAAG,UAAW,CAAC;IAC3B,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAE1B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,gCAAgC,MAAM,MAAM,UAAU,EAAE,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,YAAY,2BAA2B,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,UAAU,wBAAwB,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAEzE,IAAI,gBAAgB,KAAK,YAAY,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,gBAAgB,qBAAqB,YAAY,mBAAmB,CAAC,CAAC,CAAC;IAChI,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6DjD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { buildDeployPlan } from '@heramb1/core';
|
|
3
|
+
import { detectStack } from '../utils/stack-detector.js';
|
|
4
|
+
import { printBanner } from '../utils/output.js';
|
|
5
|
+
export async function planCommand() {
|
|
6
|
+
printBanner();
|
|
7
|
+
console.log(chalk.dim('Scanning repo...\n'));
|
|
8
|
+
const stack = detectStack();
|
|
9
|
+
const plan = buildDeployPlan(stack);
|
|
10
|
+
if (plan.summary.length > 0) {
|
|
11
|
+
for (const line of plan.summary) {
|
|
12
|
+
console.log(chalk.cyan('→') + ` ${line}`);
|
|
13
|
+
}
|
|
14
|
+
console.log('');
|
|
15
|
+
}
|
|
16
|
+
console.log(chalk.bold('Project requirements'));
|
|
17
|
+
const req = plan.requirements;
|
|
18
|
+
const flags = [
|
|
19
|
+
req.frontend && 'frontend',
|
|
20
|
+
req.backend && 'backend',
|
|
21
|
+
req.websocket && 'WebSockets',
|
|
22
|
+
req.redis && 'Redis',
|
|
23
|
+
req.longRunning && 'always-on server',
|
|
24
|
+
].filter(Boolean);
|
|
25
|
+
console.log(chalk.dim(` ${flags.join(' · ') || 'none detected'}\n`));
|
|
26
|
+
for (const svc of plan.services) {
|
|
27
|
+
console.log(chalk.bold(`${svc.label}${svc.path ? chalk.dim(` (${svc.path})`) : ''}`));
|
|
28
|
+
console.log(chalk.dim(` Needs: ${svc.requirements.join(', ')}`));
|
|
29
|
+
for (const warning of svc.warnings) {
|
|
30
|
+
console.log(chalk.yellow(' ⚠') + ` ${warning}`);
|
|
31
|
+
}
|
|
32
|
+
console.log(chalk.dim('\n Platform fit (best first):\n'));
|
|
33
|
+
for (const rec of svc.recommendations.slice(0, 6)) {
|
|
34
|
+
const status = rec.score > 0
|
|
35
|
+
? rec.implemented
|
|
36
|
+
? chalk.green('✓ ready')
|
|
37
|
+
: chalk.yellow('○ planned')
|
|
38
|
+
: chalk.red('✗ unsuitable');
|
|
39
|
+
console.log(` ${status} ${chalk.bold(rec.name)}${rec.score > 0 ? chalk.dim(` — score ${rec.score}`) : ''}`);
|
|
40
|
+
if (rec.reasons.length > 0 && rec.score > 0) {
|
|
41
|
+
console.log(chalk.dim(` ${rec.reasons.join(' · ')}`));
|
|
42
|
+
}
|
|
43
|
+
for (const blocker of rec.blockers) {
|
|
44
|
+
console.log(chalk.red(` ✗ ${blocker}`));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const best = svc.recommendations.find((r) => r.implemented && r.score > 0);
|
|
48
|
+
if (best) {
|
|
49
|
+
console.log(chalk.green(`\n Recommended: ${best.name}`));
|
|
50
|
+
}
|
|
51
|
+
console.log('');
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.dim('Run `heramb init` to pick platforms and connect accounts.\n'));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCnD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { isProviderConfig } from '@heramb1/core';
|
|
3
|
+
import { loadHerambConfig } from '../utils/config.js';
|
|
4
|
+
import { createRegistry } from '../utils/registry.js';
|
|
5
|
+
import { printBanner } from '../utils/output.js';
|
|
6
|
+
export async function statusCommand() {
|
|
7
|
+
printBanner();
|
|
8
|
+
const config = loadHerambConfig();
|
|
9
|
+
const registry = createRegistry(config);
|
|
10
|
+
console.log(chalk.bold(`Project: ${config.project}\n`));
|
|
11
|
+
for (const [key, svc] of Object.entries(config.services)) {
|
|
12
|
+
if (!isProviderConfig(svc))
|
|
13
|
+
continue;
|
|
14
|
+
const lock = registry.getLock(svc.provider);
|
|
15
|
+
const serviceId = svc.serviceId;
|
|
16
|
+
if (!lock || !serviceId) {
|
|
17
|
+
console.log(`${chalk.dim(key.padEnd(12))} ${chalk.yellow('not linked')} (${svc.provider})`);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const status = await lock.getStatus(serviceId);
|
|
22
|
+
const statusColor = status.status === 'live'
|
|
23
|
+
? chalk.green
|
|
24
|
+
: status.status === 'failed'
|
|
25
|
+
? chalk.red
|
|
26
|
+
: chalk.yellow;
|
|
27
|
+
console.log(`${chalk.dim(key.padEnd(12))} ${statusColor(status.status.padEnd(10))} ${status.url ?? chalk.dim('no url')}`);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
+
console.log(`${chalk.dim(key.padEnd(12))} ${chalk.red('error')} ${msg}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
console.log('');
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,WAAW,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAExD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAEhC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC5F,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,KAAK,MAAM;gBACtB,CAAC,CAAC,KAAK,CAAC,KAAK;gBACb,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ;oBAC1B,CAAC,CAAC,KAAK,CAAC,GAAG;oBACX,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAErB,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAC7G,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/commands/ws.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkClE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { testWebSocket } from '@heramb1/core';
|
|
3
|
+
import { loadHerambConfig } from '../utils/config.js';
|
|
4
|
+
import { printBanner } from '../utils/output.js';
|
|
5
|
+
export async function wsTestCommand(urlArg) {
|
|
6
|
+
printBanner();
|
|
7
|
+
let url = urlArg;
|
|
8
|
+
if (!url) {
|
|
9
|
+
try {
|
|
10
|
+
const config = loadHerambConfig();
|
|
11
|
+
const backend = config.services.backend;
|
|
12
|
+
if (backend && 'derives' in backend) {
|
|
13
|
+
console.log(chalk.dim('No URL provided — deploy first or pass a URL'));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
console.error(chalk.red('Provide a WebSocket URL: heramb ws test wss://...'));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (!url) {
|
|
23
|
+
console.error(chalk.red('WebSocket URL required'));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
process.stdout.write(chalk.dim(`Testing ${url}... `));
|
|
27
|
+
try {
|
|
28
|
+
const latency = await testWebSocket(url, 10000);
|
|
29
|
+
console.log(chalk.green(`✓ handshake OK (${latency}ms)\n`));
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
33
|
+
console.log(chalk.red(`✗ ${msg}\n`));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/commands/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAe;IACjD,WAAW,EAAE,CAAC;IAEd,IAAI,GAAG,GAAG,MAAM,CAAC;IAEjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxC,IAAI,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|