@somewhere-tech/cli 0.21.2 → 0.22.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/auth.js +15 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/db.js +41 -28
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.js +137 -47
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/docs.js +21 -2
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/env.js +34 -4
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/exec.js +38 -2
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/logs.js +59 -15
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/project.js +51 -19
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/promote.js +14 -4
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/pull.js +17 -6
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/rollback.js +14 -4
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/status.js +39 -19
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/typecheck.js +19 -4
- package/dist/commands/typecheck.js.map +1 -1
- package/dist/lib/client.js +10 -1
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/output.js +6 -0
- package/dist/lib/output.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/project.js
CHANGED
|
@@ -2,7 +2,7 @@ import prompts from 'prompts';
|
|
|
2
2
|
import ora from '../lib/spinner.js';
|
|
3
3
|
import { ApiClient } from '../lib/client.js';
|
|
4
4
|
import { getToken } from '../lib/config.js';
|
|
5
|
-
import { dim, error, info, statusDot, success, table, teal, timeAgo, } from '../lib/output.js';
|
|
5
|
+
import { dim, error, info, printJson, statusDot, success, table, teal, timeAgo, } from '../lib/output.js';
|
|
6
6
|
export function registerProject(program) {
|
|
7
7
|
const proj = program
|
|
8
8
|
.command('project')
|
|
@@ -12,15 +12,20 @@ export function registerProject(program) {
|
|
|
12
12
|
.description('Create a new project')
|
|
13
13
|
.option('--subdomain <subdomain>', 'Custom subdomain')
|
|
14
14
|
.option('--draft', 'Create as draft without deploying')
|
|
15
|
+
.option('--json', 'Print the raw project response as JSON')
|
|
15
16
|
.action(async (name, opts) => {
|
|
16
17
|
const client = new ApiClient(getToken());
|
|
17
|
-
const spinner = ora('Creating project...').start();
|
|
18
|
+
const spinner = opts.json ? null : ora('Creating project...').start();
|
|
18
19
|
try {
|
|
19
20
|
const p = await client.call('POST', '/projects', {
|
|
20
21
|
name,
|
|
21
22
|
subdomain: opts.subdomain ?? name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),
|
|
22
23
|
});
|
|
23
|
-
spinner
|
|
24
|
+
spinner?.stop();
|
|
25
|
+
if (opts.json) {
|
|
26
|
+
printJson(p);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
24
29
|
success(`Project created: ${teal(p.name)}`);
|
|
25
30
|
info(`ID: ${dim(p.id)}`);
|
|
26
31
|
if (p.url)
|
|
@@ -28,7 +33,7 @@ export function registerProject(program) {
|
|
|
28
33
|
info(`Status: ${statusDot(p.status)}`);
|
|
29
34
|
}
|
|
30
35
|
catch (err) {
|
|
31
|
-
spinner
|
|
36
|
+
spinner?.fail('Failed');
|
|
32
37
|
error(err instanceof Error ? err.message : String(err));
|
|
33
38
|
process.exit(1);
|
|
34
39
|
}
|
|
@@ -37,20 +42,27 @@ export function registerProject(program) {
|
|
|
37
42
|
.command('list')
|
|
38
43
|
.alias('ls')
|
|
39
44
|
.description('List all projects')
|
|
45
|
+
.option('--json', 'Print the raw projects response as JSON')
|
|
40
46
|
.action(listProjects);
|
|
41
47
|
// Also register top-level `somewhere projects` alias
|
|
42
48
|
program
|
|
43
49
|
.command('projects')
|
|
44
50
|
.description('List all projects')
|
|
51
|
+
.option('--json', 'Print the raw projects response as JSON')
|
|
45
52
|
.action(listProjects);
|
|
46
53
|
proj
|
|
47
54
|
.command('view [name-or-id]')
|
|
48
55
|
.description('View project details')
|
|
49
|
-
.
|
|
56
|
+
.option('--json', 'Print the raw project response as JSON')
|
|
57
|
+
.action(async (nameOrId, opts) => {
|
|
50
58
|
const client = new ApiClient(getToken());
|
|
51
59
|
const id = nameOrId ?? 'default';
|
|
52
60
|
try {
|
|
53
61
|
const p = await client.call('GET', `/projects/${encodeURIComponent(id)}`);
|
|
62
|
+
if (opts.json) {
|
|
63
|
+
printJson(p);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
54
66
|
console.log(`\n ${teal(String(p.name))}`);
|
|
55
67
|
info(`Status: ${statusDot(String(p.status ?? ''))}`);
|
|
56
68
|
if (p.subdomain)
|
|
@@ -66,49 +78,71 @@ export function registerProject(program) {
|
|
|
66
78
|
proj
|
|
67
79
|
.command('delete <name-or-id>')
|
|
68
80
|
.description('Permanently delete a project and all its data')
|
|
69
|
-
.
|
|
81
|
+
.option('--json', 'Print the raw delete response as JSON')
|
|
82
|
+
.action(async (nameOrId, opts) => {
|
|
70
83
|
const client = new ApiClient(getToken());
|
|
84
|
+
const promptStdout = opts.json ? process.stderr : undefined;
|
|
71
85
|
const { confirm } = await prompts({
|
|
72
86
|
type: 'text',
|
|
73
87
|
name: 'confirm',
|
|
74
88
|
message: `This will permanently delete "${nameOrId}" and all its data.\n Type the project name to confirm`,
|
|
89
|
+
stdout: promptStdout,
|
|
75
90
|
});
|
|
76
91
|
if (confirm !== nameOrId) {
|
|
92
|
+
if (opts.json) {
|
|
93
|
+
printJson({ error: 'ABORTED', message: 'Name did not match. Aborted.' });
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
77
96
|
error('Name did not match. Aborted.');
|
|
78
97
|
process.exit(1);
|
|
79
98
|
}
|
|
80
|
-
const spinner = ora('Requesting deletion...').start();
|
|
99
|
+
const spinner = opts.json ? null : ora('Requesting deletion...').start();
|
|
81
100
|
try {
|
|
82
101
|
await client.call('POST', `/projects/${encodeURIComponent(nameOrId)}/request-delete`);
|
|
83
|
-
spinner
|
|
84
|
-
|
|
102
|
+
if (spinner) {
|
|
103
|
+
spinner.text = 'Confirmation code sent to your email. Enter it below.';
|
|
104
|
+
spinner.stop();
|
|
105
|
+
}
|
|
85
106
|
const { code } = await prompts({
|
|
86
107
|
type: 'text',
|
|
87
108
|
name: 'code',
|
|
88
109
|
message: 'Confirmation code (from email)',
|
|
110
|
+
stdout: promptStdout,
|
|
89
111
|
});
|
|
90
112
|
if (!code) {
|
|
113
|
+
if (opts.json) {
|
|
114
|
+
printJson({ error: 'ABORTED', message: 'No code entered. Aborted.' });
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
91
117
|
error('No code entered. Aborted.');
|
|
92
118
|
process.exit(1);
|
|
93
119
|
}
|
|
94
|
-
const delSpinner = ora('Deleting...').start();
|
|
95
|
-
await client.call('DELETE', `/projects/${encodeURIComponent(nameOrId)}`, { code });
|
|
96
|
-
delSpinner
|
|
120
|
+
const delSpinner = opts.json ? null : ora('Deleting...').start();
|
|
121
|
+
const deleted = await client.call('DELETE', `/projects/${encodeURIComponent(nameOrId)}`, { code });
|
|
122
|
+
delSpinner?.stop();
|
|
123
|
+
if (opts.json) {
|
|
124
|
+
printJson(deleted);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
97
127
|
success('Deleted.');
|
|
98
128
|
}
|
|
99
129
|
catch (err) {
|
|
100
|
-
spinner
|
|
130
|
+
spinner?.stop();
|
|
101
131
|
error(err instanceof Error ? err.message : String(err));
|
|
102
132
|
process.exit(1);
|
|
103
133
|
}
|
|
104
134
|
});
|
|
105
135
|
}
|
|
106
|
-
async function listProjects() {
|
|
136
|
+
async function listProjects(opts = {}) {
|
|
107
137
|
const client = new ApiClient(getToken());
|
|
108
|
-
const spinner = ora('Fetching projects...').start();
|
|
138
|
+
const spinner = opts.json ? null : ora('Fetching projects...').start();
|
|
109
139
|
try {
|
|
110
140
|
const result = await client.call('GET', '/projects');
|
|
111
|
-
spinner
|
|
141
|
+
spinner?.stop();
|
|
142
|
+
if (opts.json) {
|
|
143
|
+
printJson(result);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
112
146
|
if (!result.projects.length) {
|
|
113
147
|
info('No projects yet. Create one: somewhere project create <name>');
|
|
114
148
|
return;
|
|
@@ -123,11 +157,9 @@ async function listProjects() {
|
|
|
123
157
|
: '',
|
|
124
158
|
p.updated_at ? timeAgo(p.updated_at) : '',
|
|
125
159
|
]));
|
|
126
|
-
console.log('');
|
|
127
|
-
info(dim(`${result.deployed_count} of ${result.deploy_limit} deploy slots used (${result.tier === 'builder' ? 'Builder' : 'Free'})`));
|
|
128
160
|
}
|
|
129
161
|
catch (err) {
|
|
130
|
-
spinner
|
|
162
|
+
spinner?.fail('Failed');
|
|
131
163
|
error(err instanceof Error ? err.message : String(err));
|
|
132
164
|
process.exit(1);
|
|
133
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAe,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,GAAG,EACH,KAAK,EACL,IAAI,EACJ,SAAS,EACT,OAAO,EACP,KAAK,EACL,IAAI,EACJ,OAAO,GACR,MAAM,kBAAkB,CAAC;AAE1B,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAElC,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,yBAAyB,EAAE,kBAAkB,CAAC;SACrD,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/promote.js
CHANGED
|
@@ -2,7 +2,7 @@ import ora from '../lib/spinner.js';
|
|
|
2
2
|
import prompts from 'prompts';
|
|
3
3
|
import { ApiClient } from '../lib/client.js';
|
|
4
4
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
5
|
-
import { dim, error, info, success, teal, warn } from '../lib/output.js';
|
|
5
|
+
import { dim, error, info, printJson, success, teal, warn } from '../lib/output.js';
|
|
6
6
|
export function registerPromote(program) {
|
|
7
7
|
program
|
|
8
8
|
.command('promote [draft_id]')
|
|
@@ -12,6 +12,7 @@ export function registerPromote(program) {
|
|
|
12
12
|
.option('-p, --project <id>', 'Project ID (defaults to the linked project)')
|
|
13
13
|
.option('-m, --message <msg>', 'Release notes for this version')
|
|
14
14
|
.option('-y, --yes', 'Skip confirmation prompt')
|
|
15
|
+
.option('--json', 'Print the raw promote response as JSON')
|
|
15
16
|
.action(async (draftId, opts) => {
|
|
16
17
|
const client = new ApiClient(getToken());
|
|
17
18
|
let projectId = opts.project;
|
|
@@ -31,21 +32,30 @@ export function registerPromote(program) {
|
|
|
31
32
|
? `Promote draft ${teal(draftId)} of ${teal(projectId)} → prod?`
|
|
32
33
|
: `Promote ${teal(projectId)} dev → prod?`,
|
|
33
34
|
initial: true,
|
|
35
|
+
stdout: opts.json ? process.stderr : undefined,
|
|
34
36
|
});
|
|
35
37
|
if (!ok) {
|
|
36
38
|
// Non-zero: an abort (or auto-declined non-TTY prompt) is not a promote.
|
|
39
|
+
if (opts.json) {
|
|
40
|
+
printJson({ error: 'ABORTED', message: 'Aborted.' });
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
37
43
|
warn('Aborted.');
|
|
38
44
|
process.exit(1);
|
|
39
45
|
}
|
|
40
46
|
}
|
|
41
|
-
const spinner = ora('Promoting...').start();
|
|
47
|
+
const spinner = opts.json ? null : ora('Promoting...').start();
|
|
42
48
|
try {
|
|
43
49
|
const r = await client.call('POST', '/promote', {
|
|
44
50
|
project_id: projectId,
|
|
45
51
|
message: opts.message,
|
|
46
52
|
draft_id: draftId,
|
|
47
53
|
});
|
|
48
|
-
spinner
|
|
54
|
+
spinner?.stop();
|
|
55
|
+
if (opts.json) {
|
|
56
|
+
printJson(r);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
49
59
|
success(`Promoted v${r.version} (${r.files_promoted} file${r.files_promoted === 1 ? '' : 's'}${r.has_functions ? ' + functions' : ''})`);
|
|
50
60
|
// Name the preview/draft this version was promoted from, when known —
|
|
51
61
|
// closes the loop on "what exactly went live" at the highest-trust moment.
|
|
@@ -66,7 +76,7 @@ export function registerPromote(program) {
|
|
|
66
76
|
info(dim(`Notes: ${opts.message}`));
|
|
67
77
|
}
|
|
68
78
|
catch (err) {
|
|
69
|
-
spinner
|
|
79
|
+
spinner?.fail('Promote failed');
|
|
70
80
|
error(err instanceof Error ? err.message : String(err));
|
|
71
81
|
process.exit(1);
|
|
72
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pull.js
CHANGED
|
@@ -3,7 +3,7 @@ import { basename, dirname, join, resolve } from 'node:path';
|
|
|
3
3
|
import ora from '../lib/spinner.js';
|
|
4
4
|
import { ApiClient, CliApiError, LONG_CALL_TIMEOUT_MS } from '../lib/client.js';
|
|
5
5
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
6
|
-
import { dim, error, info, success, teal, warn } from '../lib/output.js';
|
|
6
|
+
import { dim, error, info, printJson, success, teal, warn } from '../lib/output.js';
|
|
7
7
|
import { SCAFFOLD_PACKAGE_FILENAME, SCAFFOLD_TSCONFIG_FILENAME, buildScaffoldPackageJson, buildScaffoldTsconfig, extractDeps, } from '../lib/scaffold.js';
|
|
8
8
|
export function registerPull(program) {
|
|
9
9
|
program
|
|
@@ -14,6 +14,7 @@ export function registerPull(program) {
|
|
|
14
14
|
.option('--env <env>', 'Environment to pull from (dev or prod)', 'dev')
|
|
15
15
|
.option('--out <dir>', 'Output directory', '.')
|
|
16
16
|
.option('--force', 'Overwrite existing files without prompting')
|
|
17
|
+
.option('--json', 'Print the raw source response as JSON')
|
|
17
18
|
.action(async (projectArg, opts) => {
|
|
18
19
|
const token = getToken();
|
|
19
20
|
const client = new ApiClient(token);
|
|
@@ -34,13 +35,13 @@ export function registerPull(program) {
|
|
|
34
35
|
const outDir = resolve(process.cwd(), String(opts.out));
|
|
35
36
|
if (!existsSync(outDir))
|
|
36
37
|
mkdirSync(outDir, { recursive: true });
|
|
37
|
-
const spinner = ora(`Fetching ${envSlot} source...`).start();
|
|
38
|
+
const spinner = opts.json ? null : ora(`Fetching ${envSlot} source...`).start();
|
|
38
39
|
let body;
|
|
39
40
|
try {
|
|
40
41
|
body = await client.call('GET', '/deploy/source', undefined, { project_id: projectId, env: envSlot }, { timeoutMs: LONG_CALL_TIMEOUT_MS });
|
|
41
42
|
}
|
|
42
43
|
catch (err) {
|
|
43
|
-
spinner
|
|
44
|
+
spinner?.fail('Pull failed');
|
|
44
45
|
if (err instanceof CliApiError) {
|
|
45
46
|
error(`${err.message} ${dim(err.statusCode ? `[${err.code}, HTTP ${err.statusCode}]` : `[${err.code}]`)}`);
|
|
46
47
|
}
|
|
@@ -49,9 +50,13 @@ export function registerPull(program) {
|
|
|
49
50
|
}
|
|
50
51
|
process.exit(1);
|
|
51
52
|
}
|
|
52
|
-
spinner
|
|
53
|
+
spinner?.stop();
|
|
53
54
|
const total = body.counts.static_files + body.counts.binary_files + body.counts.functions;
|
|
54
55
|
if (total === 0) {
|
|
56
|
+
if (opts.json) {
|
|
57
|
+
printJson(body);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
55
60
|
warn(`No files in ${envSlot} for this project.`);
|
|
56
61
|
return;
|
|
57
62
|
}
|
|
@@ -76,8 +81,10 @@ export function registerPull(program) {
|
|
|
76
81
|
for (const [path, content] of Object.entries(body.functions)) {
|
|
77
82
|
writeOne(join('functions', path), content);
|
|
78
83
|
}
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
if (!opts.json) {
|
|
85
|
+
success(`Pulled ${written.length} file${written.length === 1 ? '' : 's'} from ${teal(envSlot)} (v${body.version}) to ${teal(outDir)}`);
|
|
86
|
+
}
|
|
87
|
+
if (skipped.length > 0 && !opts.json) {
|
|
81
88
|
warn(`Skipped ${skipped.length} existing file${skipped.length === 1 ? '' : 's'} (use --force to overwrite):`);
|
|
82
89
|
for (const p of skipped.slice(0, 10))
|
|
83
90
|
info(dim(` ${p}`));
|
|
@@ -90,6 +97,10 @@ export function registerPull(program) {
|
|
|
90
97
|
// own config, even with --force (that flag is for source files, not
|
|
91
98
|
// local tooling we're adding on top).
|
|
92
99
|
const scaffolded = scaffoldTypecheckFiles(outDir, body.static_files);
|
|
100
|
+
if (opts.json) {
|
|
101
|
+
printJson(body);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
93
104
|
if (scaffolded.length) {
|
|
94
105
|
info(dim(`Added ${scaffolded.join(' + ')} for local typechecking.`));
|
|
95
106
|
info(`Run ${teal('somewhere typecheck')} before deploy to catch undefined symbols.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import ora from '../lib/spinner.js';
|
|
|
2
2
|
import prompts from 'prompts';
|
|
3
3
|
import { ApiClient, CliApiError } from '../lib/client.js';
|
|
4
4
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
5
|
-
import { dim, error, info, success, teal, warn } from '../lib/output.js';
|
|
5
|
+
import { dim, error, info, printJson, success, teal, warn } from '../lib/output.js';
|
|
6
6
|
export function registerRollback(program) {
|
|
7
7
|
program
|
|
8
8
|
.command('rollback [project]')
|
|
@@ -10,6 +10,7 @@ export function registerRollback(program) {
|
|
|
10
10
|
'promote shipped a bad build — it restores the version that was live ' +
|
|
11
11
|
'before, including its functions. (Requires at least two promotes.)')
|
|
12
12
|
.option('-y, --yes', 'Skip the confirmation prompt')
|
|
13
|
+
.option('--json', 'Print the raw rollback response as JSON')
|
|
13
14
|
.action(async (projectArg, opts) => {
|
|
14
15
|
const client = new ApiClient(getToken());
|
|
15
16
|
let projectId = projectArg;
|
|
@@ -27,26 +28,35 @@ export function registerRollback(program) {
|
|
|
27
28
|
name: 'ok',
|
|
28
29
|
message: `Roll ${teal(projectId)} production back to the previous version?`,
|
|
29
30
|
initial: true,
|
|
31
|
+
stdout: opts.json ? process.stderr : undefined,
|
|
30
32
|
});
|
|
31
33
|
if (!ok) {
|
|
32
34
|
// Non-zero so a script/agent can't mistake an abort (incl. a non-TTY
|
|
33
35
|
// prompt that auto-declines) for a completed rollback.
|
|
36
|
+
if (opts.json) {
|
|
37
|
+
printJson({ error: 'ABORTED', message: 'Aborted.' });
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
34
40
|
warn('Aborted.');
|
|
35
41
|
process.exit(1);
|
|
36
42
|
}
|
|
37
43
|
}
|
|
38
|
-
const spinner = ora('Rolling back...').start();
|
|
44
|
+
const spinner = opts.json ? null : ora('Rolling back...').start();
|
|
39
45
|
try {
|
|
40
46
|
const r = await client.call('POST', '/promote/rollback', {
|
|
41
47
|
project_id: projectId,
|
|
42
48
|
});
|
|
43
|
-
spinner
|
|
49
|
+
spinner?.stop();
|
|
50
|
+
if (opts.json) {
|
|
51
|
+
printJson(r);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
44
54
|
success(`Rolled back to v${r.version} (${r.files_restored} file${r.files_restored === 1 ? '' : 's'} restored)`);
|
|
45
55
|
if (r.message)
|
|
46
56
|
info(dim(`Version notes: ${r.message}`));
|
|
47
57
|
}
|
|
48
58
|
catch (err) {
|
|
49
|
-
spinner
|
|
59
|
+
spinner?.fail('Rollback failed');
|
|
50
60
|
if (err instanceof CliApiError) {
|
|
51
61
|
error(`${err.message} ${dim(`[${err.code}${err.statusCode ? `, HTTP ${err.statusCode}` : ''}]`)}`);
|
|
52
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { ApiClient } from '../lib/client.js';
|
|
2
2
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
3
|
-
import { dim, error, info, statusDot, teal, timeAgo } from '../lib/output.js';
|
|
3
|
+
import { dim, error, info, printJson, statusDot, teal, timeAgo } from '../lib/output.js';
|
|
4
4
|
export function registerStatus(program) {
|
|
5
5
|
program
|
|
6
6
|
.command('status [project]')
|
|
7
7
|
.description('Show project and workspace status')
|
|
8
|
-
.
|
|
8
|
+
.option('--json', 'Print the raw status responses as JSON')
|
|
9
|
+
.action(async (projectArg, opts) => {
|
|
9
10
|
const token = getToken();
|
|
10
11
|
const client = new ApiClient(token);
|
|
11
12
|
let projectId = projectArg;
|
|
@@ -17,37 +18,56 @@ export function registerStatus(program) {
|
|
|
17
18
|
}
|
|
18
19
|
projectId = config.project_id;
|
|
19
20
|
}
|
|
21
|
+
let projectStatus = null;
|
|
22
|
+
let projectError = null;
|
|
23
|
+
let workspaceStatus = null;
|
|
20
24
|
try {
|
|
21
25
|
const p = await client.call('GET', `/projects/${encodeURIComponent(projectId)}`);
|
|
22
|
-
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
projectStatus = p;
|
|
27
|
+
if (!opts.json) {
|
|
28
|
+
console.log(`\n Project: ${teal(p.name)} (${statusDot(p.status)})`);
|
|
29
|
+
if (p.subdomain) {
|
|
30
|
+
info(`URL: https://${p.subdomain}.somewhere.tech`);
|
|
31
|
+
}
|
|
32
|
+
if (p.updated_at) {
|
|
33
|
+
info(`Last deploy: ${timeAgo(p.updated_at)}`);
|
|
34
|
+
}
|
|
28
35
|
}
|
|
29
36
|
}
|
|
30
37
|
catch (err) {
|
|
31
|
-
|
|
38
|
+
projectError = err instanceof Error ? err.message : String(err);
|
|
39
|
+
error(`Project: ${projectError}`);
|
|
32
40
|
process.exitCode = 1; // a failed status must not report success to a script
|
|
33
41
|
}
|
|
34
42
|
try {
|
|
35
43
|
const ws = await client.call('GET', '/hosted/status');
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
info(`
|
|
44
|
+
workspaceStatus = ws;
|
|
45
|
+
if (!opts.json) {
|
|
46
|
+
console.log('');
|
|
47
|
+
// The hosted code workspace is OPTIONAL and separate from the deployed
|
|
48
|
+
// app — a non-'ready' status here (e.g. "waking") NEVER means the live
|
|
49
|
+
// site is down (audit #8 / tsk_30633bb3). Label it as the dev workspace
|
|
50
|
+
// and say so, so "waking" doesn't read as an outage.
|
|
51
|
+
const wsStatus = ws.status === 'ready' ? 'running' : `${ws.status} (starting)`;
|
|
52
|
+
info(`Dev workspace: ${wsStatus} ${dim('— optional code workspace; your deployed app serves regardless')}`);
|
|
53
|
+
if (ws.terminal_url) {
|
|
54
|
+
info(`Terminal: ${dim(ws.terminal_url)}`);
|
|
55
|
+
}
|
|
45
56
|
}
|
|
46
57
|
}
|
|
47
58
|
catch {
|
|
48
59
|
// No workspace or not configured — just skip
|
|
49
60
|
}
|
|
50
|
-
|
|
61
|
+
if (opts.json) {
|
|
62
|
+
printJson({
|
|
63
|
+
project: projectStatus,
|
|
64
|
+
workspace: workspaceStatus,
|
|
65
|
+
project_error: projectError,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log('');
|
|
70
|
+
}
|
|
51
71
|
});
|
|
52
72
|
}
|
|
53
73
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join, resolve } from 'node:path';
|
|
3
3
|
import ora from '../lib/spinner.js';
|
|
4
|
-
import { bold, dim, error, info, red, success, teal, warn } from '../lib/output.js';
|
|
4
|
+
import { bold, dim, error, info, printJson, red, success, teal, warn } from '../lib/output.js';
|
|
5
5
|
import { runTypecheck } from '../lib/typecheck.js';
|
|
6
6
|
export function registerTypecheck(program) {
|
|
7
7
|
program
|
|
@@ -9,16 +9,31 @@ export function registerTypecheck(program) {
|
|
|
9
9
|
.description('Typecheck a pulled project with `tsc --noEmit` — the "is this safe to deploy?" gate. ' +
|
|
10
10
|
'Catches undefined symbols (a dropped import) and type errors with file:line BEFORE they 500 in production. ' +
|
|
11
11
|
'Run after `somewhere pull`, which scaffolds the tsconfig this uses.')
|
|
12
|
-
.
|
|
12
|
+
.option('--json', 'Print the raw typecheck result as JSON')
|
|
13
|
+
.action(async (dirArg, opts) => {
|
|
13
14
|
const dir = resolve(process.cwd(), dirArg ?? '.');
|
|
14
15
|
if (!existsSync(join(dir, 'tsconfig.json'))) {
|
|
16
|
+
if (opts.json) {
|
|
17
|
+
printJson({
|
|
18
|
+
ok: false,
|
|
19
|
+
errors: [],
|
|
20
|
+
via: 'bundled',
|
|
21
|
+
raw: '',
|
|
22
|
+
spawnError: 'No tsconfig.json here to typecheck against.',
|
|
23
|
+
});
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
15
26
|
error('No tsconfig.json here to typecheck against.');
|
|
16
27
|
info(dim('Run `somewhere pull` in this directory first — it scaffolds the tsconfig + package.json that this gate needs.'));
|
|
17
28
|
process.exit(1);
|
|
18
29
|
}
|
|
19
|
-
const spinner = ora('Typechecking (tsc --noEmit)...').start();
|
|
30
|
+
const spinner = opts.json ? null : ora('Typechecking (tsc --noEmit)...').start();
|
|
20
31
|
const result = await runTypecheck(dir);
|
|
21
|
-
spinner
|
|
32
|
+
spinner?.stop();
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
printJson(result);
|
|
35
|
+
process.exit(result.ok ? 0 : 1);
|
|
36
|
+
}
|
|
22
37
|
reportTypecheck(result);
|
|
23
38
|
process.exit(result.ok ? 0 : 1);
|
|
24
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typecheck.js","sourceRoot":"","sources":["../../src/commands/typecheck.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"typecheck.js","sourceRoot":"","sources":["../../src/commands/typecheck.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/client.js
CHANGED
|
@@ -219,7 +219,16 @@ export class ApiClient {
|
|
|
219
219
|
const detail = cause?.code ?? cause?.message ?? (err instanceof Error ? err.message : String(err));
|
|
220
220
|
throw new CliApiError('NETWORK_ERROR', `Could not reach ${method} ${url} — ${detail}. No HTTP response was received.`, 0);
|
|
221
221
|
}
|
|
222
|
-
|
|
222
|
+
const responseHeaders = {};
|
|
223
|
+
res.headers.forEach((value, key) => {
|
|
224
|
+
responseHeaders[key.toLowerCase()] = value;
|
|
225
|
+
});
|
|
226
|
+
return {
|
|
227
|
+
status: res.status,
|
|
228
|
+
ok: res.status < 400,
|
|
229
|
+
body: await res.text(),
|
|
230
|
+
headers: responseHeaders,
|
|
231
|
+
};
|
|
223
232
|
}
|
|
224
233
|
}
|
|
225
234
|
export class CliApiError extends Error {
|