@somewhere-tech/cli 0.21.3 → 0.22.1
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 +45 -22
- package/dist/commands/deploy.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 +102 -16
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/project.js +51 -17
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/promote.js +28 -5
- 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 +27 -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 +9 -0
- package/dist/lib/output.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/exec.js
CHANGED
|
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import { isAbsolute, relative, resolve } from 'node:path';
|
|
3
3
|
import { ApiClient } from '../lib/client.js';
|
|
4
4
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
5
|
-
import { bold, dim, error, green, red, yellow } from '../lib/output.js';
|
|
5
|
+
import { bold, dim, error, green, printJson, red, yellow } from '../lib/output.js';
|
|
6
6
|
import { assertNodeSupport, installLoader } from '../local/loader.js';
|
|
7
7
|
import { compileRoutePattern, isRoutable } from '../local/router.js';
|
|
8
8
|
import { dispatchRequest, loadVendoredRuntime, prepareLocalProject, } from '../local/runtime.js';
|
|
@@ -17,6 +17,7 @@ export function registerExec(program) {
|
|
|
17
17
|
.option('-H, --header <header...>', 'Request header ("Name: value"), repeatable', [])
|
|
18
18
|
.option('--path <urlPath>', 'URL path for the synthetic request — required for parametric routes like api/sites/[id].ts')
|
|
19
19
|
.option('-q, --query <querystring>', 'Query string to append (a=1&b=2)')
|
|
20
|
+
.option('--json', 'Print the invocation result as JSON')
|
|
20
21
|
.action(async (file, opts) => {
|
|
21
22
|
try {
|
|
22
23
|
assertNodeSupport();
|
|
@@ -85,9 +86,25 @@ export function registerExec(program) {
|
|
|
85
86
|
const result = await dispatchRequest(request, state);
|
|
86
87
|
const ms = Date.now() - t0;
|
|
87
88
|
const status = result.response.status;
|
|
89
|
+
const text = await result.response.text();
|
|
90
|
+
if (opts.json) {
|
|
91
|
+
printJson({
|
|
92
|
+
request: {
|
|
93
|
+
method,
|
|
94
|
+
path: `${urlPath}${qs}`,
|
|
95
|
+
},
|
|
96
|
+
response: {
|
|
97
|
+
status,
|
|
98
|
+
headers: Object.fromEntries(result.response.headers.entries()),
|
|
99
|
+
body: parseResponseBody(text),
|
|
100
|
+
},
|
|
101
|
+
duration_ms: ms,
|
|
102
|
+
error: serializeDispatchError(result.error),
|
|
103
|
+
});
|
|
104
|
+
process.exit(status >= 500 ? 1 : 0);
|
|
105
|
+
}
|
|
88
106
|
const color = status >= 500 ? red : status >= 400 ? yellow : green;
|
|
89
107
|
console.log(`${bold(method)} ${urlPath}${qs} ${color(String(status))} ${dim(`${ms}ms`)}`);
|
|
90
|
-
const text = await result.response.text();
|
|
91
108
|
try {
|
|
92
109
|
console.log(JSON.stringify(JSON.parse(text), null, 2));
|
|
93
110
|
}
|
|
@@ -106,4 +123,23 @@ export function registerExec(program) {
|
|
|
106
123
|
}
|
|
107
124
|
});
|
|
108
125
|
}
|
|
126
|
+
function parseResponseBody(text) {
|
|
127
|
+
try {
|
|
128
|
+
return JSON.parse(text);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return text;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function serializeDispatchError(err) {
|
|
135
|
+
if (!err)
|
|
136
|
+
return null;
|
|
137
|
+
if (err instanceof Error) {
|
|
138
|
+
return {
|
|
139
|
+
message: err.message,
|
|
140
|
+
stack: err.stack,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return { message: String(err) };
|
|
144
|
+
}
|
|
109
145
|
//# sourceMappingURL=exec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAQ,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logs.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { ApiClient } from '../lib/client.js';
|
|
2
2
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
3
|
-
import { dim, error, red, teal, yellow } from '../lib/output.js';
|
|
3
|
+
import { dim, error, printJsonLine, red, teal, yellow } from '../lib/output.js';
|
|
4
4
|
export function registerLogs(program) {
|
|
5
5
|
program
|
|
6
6
|
.command('logs [project]')
|
|
7
7
|
.description('Show recent logs')
|
|
8
8
|
.option('--level <level>', 'Filter by level (debug, info, warn, error)')
|
|
9
9
|
.option('--source <source>', 'Filter by source (server, client, job, cron, queue, function, …)')
|
|
10
|
-
.option('--function <route>', 'Filter to one function route (e.g. /api/checkout)')
|
|
10
|
+
.option('--function <route>', 'Filter to one function route path (e.g. /api/checkout)')
|
|
11
|
+
.option('--endpoint <path>', 'Filter to one endpoint path (e.g. /api/checkout)')
|
|
12
|
+
.option('--since <duration>', 'Only show logs since a duration or timestamp (e.g. 15m, 1h, 24h)')
|
|
11
13
|
.option('--tail <n>', 'Number of lines', '20')
|
|
12
14
|
.option('--follow', 'Keep polling for new logs')
|
|
15
|
+
.option('--json', 'Print logs as newline-delimited JSON objects')
|
|
13
16
|
.action(async (project, opts) => {
|
|
14
17
|
const token = getToken();
|
|
15
18
|
const client = new ApiClient(token);
|
|
@@ -22,31 +25,46 @@ export function registerLogs(program) {
|
|
|
22
25
|
}
|
|
23
26
|
projectId = config.project_id;
|
|
24
27
|
}
|
|
28
|
+
if (opts.function && opts.endpoint && opts.function !== opts.endpoint) {
|
|
29
|
+
error('--function and --endpoint cannot specify different paths.');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const after = parseSinceOption(opts.since);
|
|
33
|
+
const functionRoute = opts.function ?? opts.endpoint;
|
|
25
34
|
const query = {
|
|
26
35
|
project_id: projectId,
|
|
27
36
|
limit: parseInt(String(opts.tail), 10) || 20,
|
|
28
37
|
level: opts.level,
|
|
29
|
-
// `source` is filtered server-side today. `function` is forwarded
|
|
30
|
-
// forward-compatibly: GET /logs does not yet filter by a specific
|
|
31
|
-
// function route (only by `source`), so the worker ignores it until a
|
|
32
|
-
// matching filter ships.
|
|
33
38
|
source: opts.source,
|
|
34
|
-
function:
|
|
39
|
+
function: functionRoute,
|
|
40
|
+
after,
|
|
35
41
|
};
|
|
36
42
|
try {
|
|
37
43
|
const result = await client.call('GET', '/logs', undefined, query);
|
|
38
44
|
if (!result.logs?.length) {
|
|
45
|
+
if (opts.json)
|
|
46
|
+
return;
|
|
39
47
|
console.log(dim(' No logs yet.'));
|
|
40
48
|
return;
|
|
41
49
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
const initialLogs = result.logs ?? [];
|
|
51
|
+
const seenLogKeys = new Set();
|
|
52
|
+
rememberLogKeys(initialLogs, seenLogKeys);
|
|
53
|
+
let lastSeen = newestCreatedAt(initialLogs);
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
for (const log of initialLogs)
|
|
56
|
+
printJsonLine(log);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
for (const log of [...initialLogs].reverse()) {
|
|
60
|
+
const time = new Date(log.created_at).toLocaleTimeString();
|
|
61
|
+
const levelStr = formatLevel(log.level);
|
|
62
|
+
console.log(` ${dim(`[${levelStr}]`)} ${dim(time)} ${log.message}`);
|
|
63
|
+
}
|
|
46
64
|
}
|
|
47
65
|
if (opts.follow) {
|
|
48
|
-
|
|
49
|
-
|
|
66
|
+
if (!opts.json)
|
|
67
|
+
console.log(dim('\n Polling for new logs... (Ctrl+C to stop)\n'));
|
|
50
68
|
const poll = async () => {
|
|
51
69
|
try {
|
|
52
70
|
const fresh = await client.call('GET', '/logs', undefined, {
|
|
@@ -54,14 +72,21 @@ export function registerLogs(program) {
|
|
|
54
72
|
limit: 50,
|
|
55
73
|
level: opts.level,
|
|
56
74
|
source: opts.source,
|
|
57
|
-
function:
|
|
75
|
+
function: functionRoute,
|
|
58
76
|
after: lastSeen,
|
|
59
77
|
});
|
|
60
|
-
|
|
78
|
+
const freshLogs = fresh.logs ?? [];
|
|
79
|
+
const unseenLogs = takeUnseenLogs(freshLogs, seenLogKeys);
|
|
80
|
+
lastSeen = newestCreatedAt(freshLogs, lastSeen);
|
|
81
|
+
if (opts.json) {
|
|
82
|
+
for (const log of unseenLogs)
|
|
83
|
+
printJsonLine(log);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
for (const log of [...unseenLogs].reverse()) {
|
|
61
87
|
const time = new Date(log.created_at).toLocaleTimeString();
|
|
62
88
|
const levelStr = formatLevel(log.level);
|
|
63
89
|
console.log(` ${dim(`[${levelStr}]`)} ${dim(time)} ${log.message}`);
|
|
64
|
-
lastSeen = log.created_at;
|
|
65
90
|
}
|
|
66
91
|
}
|
|
67
92
|
catch { }
|
|
@@ -76,6 +101,25 @@ export function registerLogs(program) {
|
|
|
76
101
|
}
|
|
77
102
|
});
|
|
78
103
|
}
|
|
104
|
+
function parseSinceOption(value) {
|
|
105
|
+
if (!value)
|
|
106
|
+
return undefined;
|
|
107
|
+
const trimmed = value.trim();
|
|
108
|
+
const duration = /^(\d+)(m|h|d)$/.exec(trimmed);
|
|
109
|
+
if (duration) {
|
|
110
|
+
const amount = Number(duration[1]);
|
|
111
|
+
const unit = duration[2];
|
|
112
|
+
const unitMs = unit === 'm' ? 60_000 :
|
|
113
|
+
unit === 'h' ? 3_600_000 :
|
|
114
|
+
86_400_000;
|
|
115
|
+
return new Date(Date.now() - amount * unitMs).toISOString();
|
|
116
|
+
}
|
|
117
|
+
const parsed = new Date(trimmed).getTime();
|
|
118
|
+
if (Number.isFinite(parsed))
|
|
119
|
+
return new Date(parsed).toISOString();
|
|
120
|
+
error('--since must be a duration like 15m, 1h, or 24h, or an ISO timestamp.');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
79
123
|
function formatLevel(level) {
|
|
80
124
|
switch (level) {
|
|
81
125
|
case 'error':
|
|
@@ -88,4 +132,46 @@ function formatLevel(level) {
|
|
|
88
132
|
return dim(level);
|
|
89
133
|
}
|
|
90
134
|
}
|
|
135
|
+
function logDedupeKey(log) {
|
|
136
|
+
if (log.id)
|
|
137
|
+
return `id:${log.id}`;
|
|
138
|
+
if (log.created_at && log.level && log.message) {
|
|
139
|
+
return `fallback:${log.created_at}:${log.level}:${log.message}`;
|
|
140
|
+
}
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
function rememberLogKeys(logs, seen) {
|
|
144
|
+
for (const log of logs) {
|
|
145
|
+
const key = logDedupeKey(log);
|
|
146
|
+
if (key)
|
|
147
|
+
seen.add(key);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function takeUnseenLogs(logs, seen) {
|
|
151
|
+
const out = [];
|
|
152
|
+
for (const log of logs) {
|
|
153
|
+
const key = logDedupeKey(log);
|
|
154
|
+
if (key) {
|
|
155
|
+
if (seen.has(key))
|
|
156
|
+
continue;
|
|
157
|
+
seen.add(key);
|
|
158
|
+
}
|
|
159
|
+
out.push(log);
|
|
160
|
+
}
|
|
161
|
+
return out;
|
|
162
|
+
}
|
|
163
|
+
function newestCreatedAt(logs, fallback) {
|
|
164
|
+
let newest = fallback;
|
|
165
|
+
let newestMs = newest ? Date.parse(newest) : Number.NEGATIVE_INFINITY;
|
|
166
|
+
if (!Number.isFinite(newestMs))
|
|
167
|
+
newestMs = Number.NEGATIVE_INFINITY;
|
|
168
|
+
for (const log of logs) {
|
|
169
|
+
const ms = Date.parse(log.created_at);
|
|
170
|
+
if (Number.isFinite(ms) && ms > newestMs) {
|
|
171
|
+
newestMs = ms;
|
|
172
|
+
newest = log.created_at;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return newest;
|
|
176
|
+
}
|
|
91
177
|
//# sourceMappingURL=logs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.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,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
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;
|
|
@@ -125,7 +159,7 @@ async function listProjects() {
|
|
|
125
159
|
]));
|
|
126
160
|
}
|
|
127
161
|
catch (err) {
|
|
128
|
-
spinner
|
|
162
|
+
spinner?.fail('Failed');
|
|
129
163
|
error(err instanceof Error ? err.message : String(err));
|
|
130
164
|
process.exit(1);
|
|
131
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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import ora from '../lib/spinner.js';
|
|
2
2
|
import prompts from 'prompts';
|
|
3
|
-
import { ApiClient } from '../lib/client.js';
|
|
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, printJsonError, success, teal, warn } from '../lib/output.js';
|
|
6
6
|
export function registerPromote(program) {
|
|
7
7
|
program
|
|
8
8
|
.command('promote [draft_id]')
|
|
@@ -12,12 +12,17 @@ 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;
|
|
18
19
|
if (!projectId) {
|
|
19
20
|
const config = loadProjectConfig();
|
|
20
21
|
if (!config) {
|
|
22
|
+
if (opts.json) {
|
|
23
|
+
printJsonError('NO_PROJECT', 'No project linked and no --project given. Run `somewhere init` or pass --project <id>.');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
21
26
|
error('No project linked and no --project given. Run `somewhere init` or pass --project <id>.');
|
|
22
27
|
process.exit(1);
|
|
23
28
|
}
|
|
@@ -31,21 +36,30 @@ export function registerPromote(program) {
|
|
|
31
36
|
? `Promote draft ${teal(draftId)} of ${teal(projectId)} → prod?`
|
|
32
37
|
: `Promote ${teal(projectId)} dev → prod?`,
|
|
33
38
|
initial: true,
|
|
39
|
+
stdout: opts.json ? process.stderr : undefined,
|
|
34
40
|
});
|
|
35
41
|
if (!ok) {
|
|
36
42
|
// Non-zero: an abort (or auto-declined non-TTY prompt) is not a promote.
|
|
43
|
+
if (opts.json) {
|
|
44
|
+
printJsonError('ABORTED', 'Aborted.');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
37
47
|
warn('Aborted.');
|
|
38
48
|
process.exit(1);
|
|
39
49
|
}
|
|
40
50
|
}
|
|
41
|
-
const spinner = ora('Promoting...').start();
|
|
51
|
+
const spinner = opts.json ? null : ora('Promoting...').start();
|
|
42
52
|
try {
|
|
43
53
|
const r = await client.call('POST', '/promote', {
|
|
44
54
|
project_id: projectId,
|
|
45
55
|
message: opts.message,
|
|
46
56
|
draft_id: draftId,
|
|
47
57
|
});
|
|
48
|
-
spinner
|
|
58
|
+
spinner?.stop();
|
|
59
|
+
if (opts.json) {
|
|
60
|
+
printJson(r);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
49
63
|
success(`Promoted v${r.version} (${r.files_promoted} file${r.files_promoted === 1 ? '' : 's'}${r.has_functions ? ' + functions' : ''})`);
|
|
50
64
|
// Name the preview/draft this version was promoted from, when known —
|
|
51
65
|
// closes the loop on "what exactly went live" at the highest-trust moment.
|
|
@@ -66,7 +80,16 @@ export function registerPromote(program) {
|
|
|
66
80
|
info(dim(`Notes: ${opts.message}`));
|
|
67
81
|
}
|
|
68
82
|
catch (err) {
|
|
69
|
-
spinner
|
|
83
|
+
spinner?.fail('Promote failed');
|
|
84
|
+
if (opts.json) {
|
|
85
|
+
if (err instanceof CliApiError) {
|
|
86
|
+
printJsonError(err.code, err.message);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
printJsonError('ERROR', err instanceof Error ? err.message : String(err));
|
|
90
|
+
}
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
70
93
|
error(err instanceof Error ? err.message : String(err));
|
|
71
94
|
process.exit(1);
|
|
72
95
|
}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"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"}
|