@seamapi/cli 0.9.0 → 0.10.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/README.md +25 -6
- package/bin/cli.js +51 -14
- package/bin/cli.js.map +1 -1
- package/lib/interact-for-blueprint-object.js +12 -2
- package/lib/interact-for-blueprint-object.js.map +1 -1
- package/lib/interact-for-command-selection.js +15 -0
- package/lib/interact-for-command-selection.js.map +1 -1
- package/lib/types.d.ts +2 -1
- package/lib/util/cli-args.d.ts +30 -0
- package/lib/util/cli-args.js +42 -0
- package/lib/util/cli-args.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
- package/src/bin/cli.ts +77 -15
- package/src/lib/interact-for-blueprint-object.ts +18 -2
- package/src/lib/interact-for-command-selection.ts +21 -0
- package/src/lib/types.ts +2 -1
- package/src/lib/util/cli-args.ts +62 -0
- package/src/lib/version.ts +1 -1
package/README.md
CHANGED
|
@@ -9,9 +9,9 @@ A command line interface (CLI) for interacting with the Seam API.
|
|
|
9
9
|
|
|
10
10
|
## Description
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
Commands run as soon as every required parameter is given. Anything missing is
|
|
13
|
+
prompted for, with suggestions pulled from your workspace. Pass
|
|
14
|
+
`--non-interactive` (or `-y`) to never be prompted: the command fails instead.
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
@@ -37,9 +37,19 @@ $ paru -S seam-bin
|
|
|
37
37
|
|
|
38
38
|
## Usage
|
|
39
39
|
|
|
40
|
-
Every `seam` command
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
Every `seam` command makes its request as soon as every required property is
|
|
41
|
+
given. When something is missing, the CLI prompts you for it with helpful
|
|
42
|
+
suggestions.
|
|
43
|
+
|
|
44
|
+
Pass `--interactive` (or `-i`) to always be prompted to review and edit
|
|
45
|
+
properties before the request is made. The prompt is prefilled with whatever
|
|
46
|
+
you passed as arguments, so this is the way to add optional properties, or to
|
|
47
|
+
check a request before making it.
|
|
48
|
+
|
|
49
|
+
For scripts and CI, pass `--non-interactive` (or `-y`) to never be prompted.
|
|
50
|
+
The command must then be complete: if the command itself is ambiguous, or any
|
|
51
|
+
required property is missing, the CLI exits with an error naming what is
|
|
52
|
+
missing instead of asking for it.
|
|
43
53
|
|
|
44
54
|
To take a project from zero to a working Seam integration, run the
|
|
45
55
|
[Seam Wizard] from the project's root:
|
|
@@ -66,6 +76,15 @@ seam connect-webviews create
|
|
|
66
76
|
# List devices in your workspace
|
|
67
77
|
seam devices list
|
|
68
78
|
|
|
79
|
+
# Review and edit filters before listing devices
|
|
80
|
+
seam devices list --interactive
|
|
81
|
+
|
|
82
|
+
# List devices, failing instead of prompting
|
|
83
|
+
seam devices list --non-interactive
|
|
84
|
+
|
|
85
|
+
# Fails with: Missing required parameter for /locks/unlock_door: --device-id
|
|
86
|
+
seam locks unlock-door --non-interactive
|
|
87
|
+
|
|
69
88
|
MY_DOOR=$(seam devices get --name "Front Door" --id-only)
|
|
70
89
|
|
|
71
90
|
# Unlock a lock
|
package/bin/cli.js
CHANGED
|
@@ -3,7 +3,6 @@ import { randomBytes } from 'node:crypto';
|
|
|
3
3
|
import { isDeepStrictEqual as isEqual } from 'node:util';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import commandLineUsage from 'command-line-usage';
|
|
6
|
-
import parseArgs, {} from 'minimist';
|
|
7
6
|
import prompts from 'prompts';
|
|
8
7
|
import { getConfigStore } from '../lib/config/index.js';
|
|
9
8
|
import { getApiBlueprint } from '../lib/get-api-blueprint.js';
|
|
@@ -15,13 +14,14 @@ import { interactForLogin } from '../lib/interact-for-login.js';
|
|
|
15
14
|
import { interactForServerSelection } from '../lib/interact-for-server-selection.js';
|
|
16
15
|
import { interactForUseRemoteApiDefs } from '../lib/interact-for-use-remote-api-defs.js';
|
|
17
16
|
import { interactForWorkspaceId } from '../lib/interact-for-workspace-id.js';
|
|
17
|
+
import { getInteractivity, interactivityFlags, NonInteractiveError, parseCliArgs, } from '../lib/util/cli-args.js';
|
|
18
18
|
import { RequestSeamApi } from '../lib/util/request-seam-api.js';
|
|
19
19
|
import { validateToken } from '../lib/validate-token.js';
|
|
20
20
|
import seamapiCliVersion from '../lib/version.js';
|
|
21
21
|
const sections = [
|
|
22
22
|
{
|
|
23
23
|
header: 'Seam CLI',
|
|
24
|
-
content: 'Every seam command is
|
|
24
|
+
content: 'Every seam command runs as soon as every required property is given, and otherwise prompts you for what is missing with helpful suggestions. Pass -i to always review properties first, or -y to never be prompted. ',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
header: 'Options',
|
|
@@ -32,6 +32,18 @@ const sections = [
|
|
|
32
32
|
alias: 'h',
|
|
33
33
|
type: Boolean,
|
|
34
34
|
},
|
|
35
|
+
{
|
|
36
|
+
name: 'interactive',
|
|
37
|
+
description: 'Always prompt to review and edit properties, prefilled with the given arguments.',
|
|
38
|
+
alias: 'i',
|
|
39
|
+
type: Boolean,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'non-interactive',
|
|
43
|
+
description: 'Never prompt: exit with an error if the command or any required property is missing.',
|
|
44
|
+
alias: 'y',
|
|
45
|
+
type: Boolean,
|
|
46
|
+
},
|
|
35
47
|
{
|
|
36
48
|
name: 'update',
|
|
37
49
|
description: 'Force an update of the cached Seam API definitions.',
|
|
@@ -54,6 +66,14 @@ const sections = [
|
|
|
54
66
|
summary: 'Create a connect webview to connect devices.',
|
|
55
67
|
},
|
|
56
68
|
{ name: 'seam devices list', summary: 'List devices in your workspace.' },
|
|
69
|
+
{
|
|
70
|
+
name: 'seam devices list {bold --interactive}',
|
|
71
|
+
summary: 'Review and edit filters before listing devices.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'seam devices list {bold --non-interactive}',
|
|
75
|
+
summary: 'List devices, failing instead of prompting.',
|
|
76
|
+
},
|
|
57
77
|
{
|
|
58
78
|
name: 'seam locks unlock-door {bold --device-id} $MY_DOOR',
|
|
59
79
|
summary: 'Unlock a lock.',
|
|
@@ -108,21 +128,21 @@ async function cli(args) {
|
|
|
108
128
|
update,
|
|
109
129
|
});
|
|
110
130
|
const commandParams = {};
|
|
111
|
-
/**
|
|
112
|
-
* Whether or not to auto-select first option
|
|
113
|
-
*/
|
|
114
|
-
const is_interactive = args['y'] !== true;
|
|
115
131
|
const ctx = {
|
|
116
132
|
blueprint,
|
|
117
|
-
|
|
133
|
+
interactivity: getInteractivity(args),
|
|
118
134
|
};
|
|
135
|
+
const isNonInteractive = ctx.interactivity === 'non-interactive';
|
|
119
136
|
for (const k in args) {
|
|
120
137
|
if (k === '_')
|
|
121
138
|
continue;
|
|
122
139
|
const v = args[k];
|
|
123
140
|
delete args[k];
|
|
124
|
-
|
|
125
|
-
|
|
141
|
+
const key = k.replace(/-/g, '_');
|
|
142
|
+
args[key] = v;
|
|
143
|
+
if (interactivityFlags.includes(key))
|
|
144
|
+
continue;
|
|
145
|
+
commandParams[key] = v;
|
|
126
146
|
}
|
|
127
147
|
const selectedCommand = await interactForCommandSelection(args._, ctx);
|
|
128
148
|
if (isEqual(selectedCommand, ['login'])) {
|
|
@@ -142,6 +162,9 @@ async function cli(args) {
|
|
|
142
162
|
if (args['token'] || args['workspace_id'] || args['server']) {
|
|
143
163
|
return;
|
|
144
164
|
}
|
|
165
|
+
if (isNonInteractive) {
|
|
166
|
+
throw new NonInteractiveError('Missing required parameter for login: --token');
|
|
167
|
+
}
|
|
145
168
|
await interactForLogin();
|
|
146
169
|
return;
|
|
147
170
|
}
|
|
@@ -155,10 +178,16 @@ async function cli(args) {
|
|
|
155
178
|
return;
|
|
156
179
|
}
|
|
157
180
|
else if (isEqual(selectedCommand, ['config', 'use-remote-api-defs'])) {
|
|
181
|
+
if (isNonInteractive) {
|
|
182
|
+
throw new NonInteractiveError('Cannot select whether to use remote API definitions in non-interactive mode');
|
|
183
|
+
}
|
|
158
184
|
await interactForUseRemoteApiDefs();
|
|
159
185
|
return;
|
|
160
186
|
}
|
|
161
187
|
else if (isEqual(selectedCommand, ['select', 'workspace'])) {
|
|
188
|
+
if (isNonInteractive) {
|
|
189
|
+
throw new NonInteractiveError('Cannot select a workspace in non-interactive mode: pass --workspace-id to "seam login"');
|
|
190
|
+
}
|
|
162
191
|
await interactForWorkspaceId();
|
|
163
192
|
return;
|
|
164
193
|
}
|
|
@@ -175,6 +204,9 @@ async function cli(args) {
|
|
|
175
204
|
config.delete('current_workspace_id');
|
|
176
205
|
return;
|
|
177
206
|
}
|
|
207
|
+
if (isNonInteractive) {
|
|
208
|
+
throw new NonInteractiveError('Missing required parameter for select server: --server');
|
|
209
|
+
}
|
|
178
210
|
await interactForServerSelection();
|
|
179
211
|
return;
|
|
180
212
|
}
|
|
@@ -217,15 +249,16 @@ async function cli(args) {
|
|
|
217
249
|
params,
|
|
218
250
|
});
|
|
219
251
|
if (response.data?.connect_webview) {
|
|
220
|
-
await handleConnectWebviewResponse(response.data.connect_webview);
|
|
252
|
+
await handleConnectWebviewResponse(response.data.connect_webview, ctx.interactivity);
|
|
221
253
|
}
|
|
222
|
-
if (response.data?.action_attempt) {
|
|
254
|
+
if (response.data?.action_attempt && !isNonInteractive) {
|
|
223
255
|
interactForActionAttemptPoll(response.data.action_attempt);
|
|
224
256
|
}
|
|
225
257
|
}
|
|
226
|
-
const handleConnectWebviewResponse = async (connect_webview) => {
|
|
258
|
+
const handleConnectWebviewResponse = async (connect_webview, interactivity) => {
|
|
227
259
|
const url = connect_webview.url;
|
|
228
|
-
if (
|
|
260
|
+
if (interactivity !== 'non-interactive' &&
|
|
261
|
+
process.env['INSIDE_WEB_BROWSER'] !== '1') {
|
|
229
262
|
const { action } = await prompts({
|
|
230
263
|
type: 'confirm',
|
|
231
264
|
name: 'action',
|
|
@@ -246,9 +279,13 @@ const run = async (argv) => {
|
|
|
246
279
|
});
|
|
247
280
|
return;
|
|
248
281
|
}
|
|
249
|
-
await cli(
|
|
282
|
+
await cli(parseCliArgs(argv));
|
|
250
283
|
};
|
|
251
284
|
run(process.argv.slice(2)).catch((e) => {
|
|
285
|
+
if (e instanceof NonInteractiveError) {
|
|
286
|
+
console.log(chalk.red(e.message));
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
252
289
|
console.log(chalk.red(`CLI Error: ${e.toString()}\n${e.stack}`));
|
|
253
290
|
if (e.toString().includes('object Object')) {
|
|
254
291
|
console.log(e);
|
package/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAExD,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { interactForCustomMetadata } from './interact-for-custom-metadata.js';
|
|
|
9
9
|
import { interactForDevice } from './interact-for-device.js';
|
|
10
10
|
import { interactForTimestamp } from './interact-for-timestamp.js';
|
|
11
11
|
import { interactForUserIdentity } from './interact-for-user-identity.js';
|
|
12
|
+
import { NonInteractiveError, toArgName } from './util/cli-args.js';
|
|
12
13
|
import { ellipsis } from './util/ellipsis.js';
|
|
13
14
|
const ergonomicPropOrder = [
|
|
14
15
|
'name',
|
|
@@ -28,10 +29,20 @@ export const interactForBlueprintObject = async (args, ctx) => {
|
|
|
28
29
|
.filter((parameter) => parameter.isRequired)
|
|
29
30
|
.map((parameter) => parameter.name);
|
|
30
31
|
const haveAllRequiredParams = required.every((k) => args.params[k]);
|
|
31
|
-
const
|
|
32
|
+
const cmdPath = `/${args.command.join('/').replace(/-/g, '_')}`;
|
|
33
|
+
const should_auto_submit = ctx.interactivity !== 'interactive' &&
|
|
34
|
+
haveAllRequiredParams &&
|
|
35
|
+
!args.isSubProperty;
|
|
32
36
|
if (should_auto_submit) {
|
|
33
37
|
return args.params;
|
|
34
38
|
}
|
|
39
|
+
if (ctx.interactivity === 'non-interactive') {
|
|
40
|
+
const missing = required.filter((k) => !args.params[k]);
|
|
41
|
+
const target = args.isSubProperty ? `"${args.subPropertyPath}"` : cmdPath;
|
|
42
|
+
throw new NonInteractiveError(missing.length > 0
|
|
43
|
+
? `Missing required ${missing.length === 1 ? 'parameter' : 'parameters'} for ${target}: ${missing.map(toArgName).join(' ')}`
|
|
44
|
+
: `Cannot prompt for ${target} in non-interactive mode`);
|
|
45
|
+
}
|
|
35
46
|
const propSortScore = (prop) => {
|
|
36
47
|
if (required.includes(prop))
|
|
37
48
|
return 100 - ergonomicPropOrder.indexOf(prop);
|
|
@@ -40,7 +51,6 @@ export const interactForBlueprintObject = async (args, ctx) => {
|
|
|
40
51
|
}
|
|
41
52
|
return ergonomicPropOrder.indexOf(prop);
|
|
42
53
|
};
|
|
43
|
-
const cmdPath = `/${args.command.join('/').replace(/-/g, '_')}`;
|
|
44
54
|
const parameterSelectionMessage = args.isSubProperty
|
|
45
55
|
? `Editing "${args.subPropertyPath}"`
|
|
46
56
|
: `[${cmdPath}] Parameters`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interact-for-blueprint-object.js","sourceRoot":"","sources":["../src/lib/interact-for-blueprint-object.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,MAAM,kBAAkB,GAAG;IACzB,MAAM;IACN,sBAAsB;IACtB,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,MAAM;IACN,WAAW;IACX,SAAS;CACV,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAC7C,IAMC,EACD,GAAmB,EACL,EAAE;IAChB,sDAAsD;IACtD,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAA;IAE9C,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAChE,CAAA;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;SAC7B,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC;SAC3C,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAErC,MAAM,qBAAqB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAEnE,MAAM,
|
|
1
|
+
{"version":3,"file":"interact-for-blueprint-object.js","sourceRoot":"","sources":["../src/lib/interact-for-blueprint-object.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isDeepStrictEqual as isEqual } from 'node:util';
|
|
2
2
|
import prompts from 'prompts';
|
|
3
|
+
import { NonInteractiveError } from './util/cli-args.js';
|
|
3
4
|
const uniqBy = (items, keyOf) => {
|
|
4
5
|
const seen = new Set();
|
|
5
6
|
return items.filter((item) => {
|
|
@@ -43,6 +44,20 @@ export async function interactForCommandSelection(commandPath, helpers) {
|
|
|
43
44
|
possibleCommands[0]?.length === commandPath.length) {
|
|
44
45
|
return commandPath;
|
|
45
46
|
}
|
|
47
|
+
if (helpers.interactivity === 'non-interactive') {
|
|
48
|
+
// The command path is itself a command, so call it directly rather than
|
|
49
|
+
// prompting to select one of its sub-commands.
|
|
50
|
+
if (possibleCommands.some((cmd) => cmd.length === commandPath.length)) {
|
|
51
|
+
return commandPath;
|
|
52
|
+
}
|
|
53
|
+
const subcommands = possibleCommands
|
|
54
|
+
.map((cmd) => cmd[commandPath.length])
|
|
55
|
+
.filter((subcommand) => subcommand != null)
|
|
56
|
+
.sort(ergonomicSort);
|
|
57
|
+
throw new NonInteractiveError(`${commandPath.length === 0
|
|
58
|
+
? 'Missing command'
|
|
59
|
+
: `Incomplete command "seam ${commandPath.join(' ')}"`}: expected one of ${subcommands.join(', ')}`);
|
|
60
|
+
}
|
|
46
61
|
// Add dynamic 'back' command for sub-commands to allow returning
|
|
47
62
|
// to previous level.
|
|
48
63
|
if (commandPath.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interact-for-command-selection.js","sourceRoot":"","sources":["../src/lib/interact-for-command-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAExD,OAAO,OAAO,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"interact-for-command-selection.js","sourceRoot":"","sources":["../src/lib/interact-for-command-selection.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ParsedArgs } from 'minimist';
|
|
2
|
+
/**
|
|
3
|
+
* How the CLI should behave when properties are not given as arguments.
|
|
4
|
+
*
|
|
5
|
+
* - `auto`: make the request as soon as every required property is given,
|
|
6
|
+
* otherwise prompt for what is missing. This is the default.
|
|
7
|
+
* - `interactive`: always prompt to review and edit properties, prefilled
|
|
8
|
+
* with the given arguments. Selected with `--interactive` or `-i`.
|
|
9
|
+
* - `non-interactive`: never prompt: anything missing is an error.
|
|
10
|
+
* Selected with `--non-interactive` or `-y`.
|
|
11
|
+
*/
|
|
12
|
+
export type Interactivity = 'auto' | 'interactive' | 'non-interactive';
|
|
13
|
+
/**
|
|
14
|
+
* Argument keys that select the interactivity
|
|
15
|
+
* and are therefore not command parameters.
|
|
16
|
+
*/
|
|
17
|
+
export declare const interactivityFlags: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when the CLI needs input it cannot prompt for.
|
|
20
|
+
*/
|
|
21
|
+
export declare class NonInteractiveError extends Error {
|
|
22
|
+
name: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const parseCliArgs: (argv: string[]) => ParsedArgs;
|
|
25
|
+
export declare const getInteractivity: (args: ParsedArgs) => Interactivity;
|
|
26
|
+
/**
|
|
27
|
+
* Render a parameter name as the argument used to set it,
|
|
28
|
+
* e.g., `device_id` as `--device-id`.
|
|
29
|
+
*/
|
|
30
|
+
export declare const toArgName: (parameterName: string) => string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import parseArgs, {} from 'minimist';
|
|
2
|
+
/**
|
|
3
|
+
* Argument keys that select the interactivity
|
|
4
|
+
* and are therefore not command parameters.
|
|
5
|
+
*/
|
|
6
|
+
export const interactivityFlags = [
|
|
7
|
+
'non_interactive',
|
|
8
|
+
'y',
|
|
9
|
+
'interactive',
|
|
10
|
+
'i',
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Thrown when the CLI needs input it cannot prompt for.
|
|
14
|
+
*/
|
|
15
|
+
export class NonInteractiveError extends Error {
|
|
16
|
+
name = 'NonInteractiveError';
|
|
17
|
+
}
|
|
18
|
+
export const parseCliArgs = (argv) => parseArgs(argv, {
|
|
19
|
+
string: ['code'],
|
|
20
|
+
boolean: ['non-interactive', 'interactive'],
|
|
21
|
+
// Deliberately not aliased to -n, which is reserved for a future
|
|
22
|
+
// --dry-run flag.
|
|
23
|
+
alias: { 'non-interactive': 'y', interactive: 'i' },
|
|
24
|
+
});
|
|
25
|
+
export const getInteractivity = (args) => {
|
|
26
|
+
const isNonInteractive = args['non_interactive'] === true || args['y'] === true;
|
|
27
|
+
const isInteractive = args['interactive'] === true || args['i'] === true;
|
|
28
|
+
if (isNonInteractive && isInteractive) {
|
|
29
|
+
throw new Error('The --interactive and --non-interactive flags cannot be used together');
|
|
30
|
+
}
|
|
31
|
+
if (isNonInteractive)
|
|
32
|
+
return 'non-interactive';
|
|
33
|
+
if (isInteractive)
|
|
34
|
+
return 'interactive';
|
|
35
|
+
return 'auto';
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Render a parameter name as the argument used to set it,
|
|
39
|
+
* e.g., `device_id` as `--device-id`.
|
|
40
|
+
*/
|
|
41
|
+
export const toArgName = (parameterName) => `--${parameterName.replace(/_/g, '-')}`;
|
|
42
|
+
//# sourceMappingURL=cli-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../../src/lib/util/cli-args.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAmB,MAAM,UAAU,CAAA;AAcrD;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,iBAAiB;IACjB,GAAG;IACH,aAAa;IACb,GAAG;CACJ,CAAA;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,GAAG,qBAAqB,CAAA;CACtC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAc,EAAc,EAAE,CACzD,SAAS,CAAC,IAAI,EAAE;IACd,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC;IAC3C,iEAAiE;IACjE,kBAAkB;IAClB,KAAK,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;CACpD,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAgB,EAAiB,EAAE;IAClE,MAAM,gBAAgB,GACpB,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IAExE,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAA;IACH,CAAC;IACD,IAAI,gBAAgB;QAAE,OAAO,iBAAiB,CAAA;IAC9C,IAAI,aAAa;QAAE,OAAO,aAAa,CAAA;IACvC,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAU,EAAE,CACzD,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAA"}
|
package/lib/version.d.ts
CHANGED
package/lib/version.js
CHANGED
package/lib/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/lib/version.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/lib/version.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,QAAQ,CAAA;AAClC,MAAM,uBAAuB,GAAG,OAAO,CAAA;AAEvC,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAClC,eAAe,iBAAiB,CAAA"}
|
package/package.json
CHANGED
package/src/bin/cli.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { isDeepStrictEqual as isEqual } from 'node:util'
|
|
|
4
4
|
|
|
5
5
|
import chalk from 'chalk'
|
|
6
6
|
import commandLineUsage from 'command-line-usage'
|
|
7
|
-
import
|
|
7
|
+
import type { ParsedArgs } from 'minimist'
|
|
8
8
|
import prompts from 'prompts'
|
|
9
9
|
|
|
10
10
|
import { getConfigStore } from 'lib/config/index.js'
|
|
@@ -18,6 +18,13 @@ import { interactForServerSelection } from 'lib/interact-for-server-selection.js
|
|
|
18
18
|
import { interactForUseRemoteApiDefs } from 'lib/interact-for-use-remote-api-defs.js'
|
|
19
19
|
import { interactForWorkspaceId } from 'lib/interact-for-workspace-id.js'
|
|
20
20
|
import type { ContextHelpers } from 'lib/types.js'
|
|
21
|
+
import {
|
|
22
|
+
getInteractivity,
|
|
23
|
+
type Interactivity,
|
|
24
|
+
interactivityFlags,
|
|
25
|
+
NonInteractiveError,
|
|
26
|
+
parseCliArgs,
|
|
27
|
+
} from 'lib/util/cli-args.js'
|
|
21
28
|
import { RequestSeamApi } from 'lib/util/request-seam-api.js'
|
|
22
29
|
import { validateToken } from 'lib/validate-token.js'
|
|
23
30
|
import seamapiCliVersion from 'lib/version.js'
|
|
@@ -26,7 +33,7 @@ const sections = [
|
|
|
26
33
|
{
|
|
27
34
|
header: 'Seam CLI',
|
|
28
35
|
content:
|
|
29
|
-
'Every seam command is
|
|
36
|
+
'Every seam command runs as soon as every required property is given, and otherwise prompts you for what is missing with helpful suggestions. Pass -i to always review properties first, or -y to never be prompted. ',
|
|
30
37
|
},
|
|
31
38
|
{
|
|
32
39
|
header: 'Options',
|
|
@@ -37,6 +44,20 @@ const sections = [
|
|
|
37
44
|
alias: 'h',
|
|
38
45
|
type: Boolean,
|
|
39
46
|
},
|
|
47
|
+
{
|
|
48
|
+
name: 'interactive',
|
|
49
|
+
description:
|
|
50
|
+
'Always prompt to review and edit properties, prefilled with the given arguments.',
|
|
51
|
+
alias: 'i',
|
|
52
|
+
type: Boolean,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'non-interactive',
|
|
56
|
+
description:
|
|
57
|
+
'Never prompt: exit with an error if the command or any required property is missing.',
|
|
58
|
+
alias: 'y',
|
|
59
|
+
type: Boolean,
|
|
60
|
+
},
|
|
40
61
|
{
|
|
41
62
|
name: 'update',
|
|
42
63
|
description: 'Force an update of the cached Seam API definitions.',
|
|
@@ -59,6 +80,14 @@ const sections = [
|
|
|
59
80
|
summary: 'Create a connect webview to connect devices.',
|
|
60
81
|
},
|
|
61
82
|
{ name: 'seam devices list', summary: 'List devices in your workspace.' },
|
|
83
|
+
{
|
|
84
|
+
name: 'seam devices list {bold --interactive}',
|
|
85
|
+
summary: 'Review and edit filters before listing devices.',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'seam devices list {bold --non-interactive}',
|
|
89
|
+
summary: 'List devices, failing instead of prompting.',
|
|
90
|
+
},
|
|
62
91
|
{
|
|
63
92
|
name: 'seam locks unlock-door {bold --device-id} $MY_DOOR',
|
|
64
93
|
summary: 'Unlock a lock.',
|
|
@@ -131,22 +160,21 @@ async function cli(args: ParsedArgs) {
|
|
|
131
160
|
|
|
132
161
|
const commandParams: Record<string, any> = {}
|
|
133
162
|
|
|
134
|
-
/**
|
|
135
|
-
* Whether or not to auto-select first option
|
|
136
|
-
*/
|
|
137
|
-
const is_interactive = args['y'] !== true
|
|
138
|
-
|
|
139
163
|
const ctx: ContextHelpers = {
|
|
140
164
|
blueprint,
|
|
141
|
-
|
|
165
|
+
interactivity: getInteractivity(args),
|
|
142
166
|
}
|
|
143
167
|
|
|
168
|
+
const isNonInteractive = ctx.interactivity === 'non-interactive'
|
|
169
|
+
|
|
144
170
|
for (const k in args) {
|
|
145
171
|
if (k === '_') continue
|
|
146
172
|
const v = args[k]
|
|
147
173
|
delete args[k]
|
|
148
|
-
|
|
149
|
-
|
|
174
|
+
const key = k.replace(/-/g, '_')
|
|
175
|
+
args[key] = v
|
|
176
|
+
if (interactivityFlags.includes(key)) continue
|
|
177
|
+
commandParams[key] = v
|
|
150
178
|
}
|
|
151
179
|
|
|
152
180
|
const selectedCommand = await interactForCommandSelection(args._, ctx)
|
|
@@ -167,6 +195,11 @@ async function cli(args: ParsedArgs) {
|
|
|
167
195
|
if (args['token'] || args['workspace_id'] || args['server']) {
|
|
168
196
|
return
|
|
169
197
|
}
|
|
198
|
+
if (isNonInteractive) {
|
|
199
|
+
throw new NonInteractiveError(
|
|
200
|
+
'Missing required parameter for login: --token',
|
|
201
|
+
)
|
|
202
|
+
}
|
|
170
203
|
await interactForLogin()
|
|
171
204
|
return
|
|
172
205
|
} else if (isEqual(selectedCommand, ['logout'])) {
|
|
@@ -177,9 +210,19 @@ async function cli(args: ParsedArgs) {
|
|
|
177
210
|
console.log(config.path)
|
|
178
211
|
return
|
|
179
212
|
} else if (isEqual(selectedCommand, ['config', 'use-remote-api-defs'])) {
|
|
213
|
+
if (isNonInteractive) {
|
|
214
|
+
throw new NonInteractiveError(
|
|
215
|
+
'Cannot select whether to use remote API definitions in non-interactive mode',
|
|
216
|
+
)
|
|
217
|
+
}
|
|
180
218
|
await interactForUseRemoteApiDefs()
|
|
181
219
|
return
|
|
182
220
|
} else if (isEqual(selectedCommand, ['select', 'workspace'])) {
|
|
221
|
+
if (isNonInteractive) {
|
|
222
|
+
throw new NonInteractiveError(
|
|
223
|
+
'Cannot select a workspace in non-interactive mode: pass --workspace-id to "seam login"',
|
|
224
|
+
)
|
|
225
|
+
}
|
|
183
226
|
await interactForWorkspaceId()
|
|
184
227
|
return
|
|
185
228
|
} else if (isEqual(selectedCommand, ['events', 'list'])) {
|
|
@@ -194,6 +237,11 @@ async function cli(args: ParsedArgs) {
|
|
|
194
237
|
config.delete('current_workspace_id')
|
|
195
238
|
return
|
|
196
239
|
}
|
|
240
|
+
if (isNonInteractive) {
|
|
241
|
+
throw new NonInteractiveError(
|
|
242
|
+
'Missing required parameter for select server: --server',
|
|
243
|
+
)
|
|
244
|
+
}
|
|
197
245
|
await interactForServerSelection()
|
|
198
246
|
return
|
|
199
247
|
} else if (isEqual(selectedCommand, ['health', 'get-health'])) {
|
|
@@ -246,18 +294,27 @@ async function cli(args: ParsedArgs) {
|
|
|
246
294
|
})
|
|
247
295
|
|
|
248
296
|
if (response.data?.connect_webview) {
|
|
249
|
-
await handleConnectWebviewResponse(
|
|
297
|
+
await handleConnectWebviewResponse(
|
|
298
|
+
response.data.connect_webview,
|
|
299
|
+
ctx.interactivity,
|
|
300
|
+
)
|
|
250
301
|
}
|
|
251
302
|
|
|
252
|
-
if (response.data?.action_attempt) {
|
|
303
|
+
if (response.data?.action_attempt && !isNonInteractive) {
|
|
253
304
|
interactForActionAttemptPoll(response.data.action_attempt)
|
|
254
305
|
}
|
|
255
306
|
}
|
|
256
307
|
|
|
257
|
-
const handleConnectWebviewResponse = async (
|
|
308
|
+
const handleConnectWebviewResponse = async (
|
|
309
|
+
connect_webview: any,
|
|
310
|
+
interactivity: Interactivity,
|
|
311
|
+
) => {
|
|
258
312
|
const url = connect_webview.url
|
|
259
313
|
|
|
260
|
-
if (
|
|
314
|
+
if (
|
|
315
|
+
interactivity !== 'non-interactive' &&
|
|
316
|
+
process.env['INSIDE_WEB_BROWSER'] !== '1'
|
|
317
|
+
) {
|
|
261
318
|
const { action } = await prompts({
|
|
262
319
|
type: 'confirm',
|
|
263
320
|
name: 'action',
|
|
@@ -281,10 +338,15 @@ const run = async (argv: string[]) => {
|
|
|
281
338
|
return
|
|
282
339
|
}
|
|
283
340
|
|
|
284
|
-
await cli(
|
|
341
|
+
await cli(parseCliArgs(argv))
|
|
285
342
|
}
|
|
286
343
|
|
|
287
344
|
run(process.argv.slice(2)).catch((e) => {
|
|
345
|
+
if (e instanceof NonInteractiveError) {
|
|
346
|
+
console.log(chalk.red(e.message))
|
|
347
|
+
process.exit(1)
|
|
348
|
+
}
|
|
349
|
+
|
|
288
350
|
console.log(chalk.red(`CLI Error: ${e.toString()}\n${e.stack}`))
|
|
289
351
|
if (e.toString().includes('object Object')) {
|
|
290
352
|
console.log(e)
|
|
@@ -12,6 +12,7 @@ import { interactForDevice } from './interact-for-device.js'
|
|
|
12
12
|
import { interactForTimestamp } from './interact-for-timestamp.js'
|
|
13
13
|
import { interactForUserIdentity } from './interact-for-user-identity.js'
|
|
14
14
|
import type { ContextHelpers } from './types.js'
|
|
15
|
+
import { NonInteractiveError, toArgName } from './util/cli-args.js'
|
|
15
16
|
import { ellipsis } from './util/ellipsis.js'
|
|
16
17
|
|
|
17
18
|
const ergonomicPropOrder = [
|
|
@@ -47,12 +48,28 @@ export const interactForBlueprintObject = async (
|
|
|
47
48
|
|
|
48
49
|
const haveAllRequiredParams = required.every((k) => args.params[k])
|
|
49
50
|
|
|
51
|
+
const cmdPath = `/${args.command.join('/').replace(/-/g, '_')}`
|
|
52
|
+
|
|
50
53
|
const should_auto_submit =
|
|
51
|
-
|
|
54
|
+
ctx.interactivity !== 'interactive' &&
|
|
55
|
+
haveAllRequiredParams &&
|
|
56
|
+
!args.isSubProperty
|
|
52
57
|
if (should_auto_submit) {
|
|
53
58
|
return args.params
|
|
54
59
|
}
|
|
55
60
|
|
|
61
|
+
if (ctx.interactivity === 'non-interactive') {
|
|
62
|
+
const missing = required.filter((k) => !args.params[k])
|
|
63
|
+
const target = args.isSubProperty ? `"${args.subPropertyPath}"` : cmdPath
|
|
64
|
+
throw new NonInteractiveError(
|
|
65
|
+
missing.length > 0
|
|
66
|
+
? `Missing required ${
|
|
67
|
+
missing.length === 1 ? 'parameter' : 'parameters'
|
|
68
|
+
} for ${target}: ${missing.map(toArgName).join(' ')}`
|
|
69
|
+
: `Cannot prompt for ${target} in non-interactive mode`,
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
56
73
|
const propSortScore = (prop: string) => {
|
|
57
74
|
if (required.includes(prop)) return 100 - ergonomicPropOrder.indexOf(prop)
|
|
58
75
|
if (args.params[prop] !== undefined) {
|
|
@@ -61,7 +78,6 @@ export const interactForBlueprintObject = async (
|
|
|
61
78
|
return ergonomicPropOrder.indexOf(prop)
|
|
62
79
|
}
|
|
63
80
|
|
|
64
|
-
const cmdPath = `/${args.command.join('/').replace(/-/g, '_')}`
|
|
65
81
|
const parameterSelectionMessage = args.isSubProperty
|
|
66
82
|
? `Editing "${args.subPropertyPath}"`
|
|
67
83
|
: `[${cmdPath}] Parameters`
|
|
@@ -3,6 +3,7 @@ import { isDeepStrictEqual as isEqual } from 'node:util'
|
|
|
3
3
|
import prompts from 'prompts'
|
|
4
4
|
|
|
5
5
|
import type { ContextHelpers } from './types.js'
|
|
6
|
+
import { NonInteractiveError } from './util/cli-args.js'
|
|
6
7
|
|
|
7
8
|
const uniqBy = <T>(items: T[], keyOf: (item: T) => unknown): T[] => {
|
|
8
9
|
const seen = new Set<unknown>()
|
|
@@ -64,6 +65,26 @@ export async function interactForCommandSelection(
|
|
|
64
65
|
return commandPath
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
if (helpers.interactivity === 'non-interactive') {
|
|
69
|
+
// The command path is itself a command, so call it directly rather than
|
|
70
|
+
// prompting to select one of its sub-commands.
|
|
71
|
+
if (possibleCommands.some((cmd) => cmd.length === commandPath.length)) {
|
|
72
|
+
return commandPath
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const subcommands = possibleCommands
|
|
76
|
+
.map((cmd) => cmd[commandPath.length])
|
|
77
|
+
.filter((subcommand) => subcommand != null)
|
|
78
|
+
.sort(ergonomicSort)
|
|
79
|
+
throw new NonInteractiveError(
|
|
80
|
+
`${
|
|
81
|
+
commandPath.length === 0
|
|
82
|
+
? 'Missing command'
|
|
83
|
+
: `Incomplete command "seam ${commandPath.join(' ')}"`
|
|
84
|
+
}: expected one of ${subcommands.join(', ')}`,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
67
88
|
// Add dynamic 'back' command for sub-commands to allow returning
|
|
68
89
|
// to previous level.
|
|
69
90
|
if (commandPath.length > 0) {
|
package/src/lib/types.ts
CHANGED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import parseArgs, { type ParsedArgs } from 'minimist'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* How the CLI should behave when properties are not given as arguments.
|
|
5
|
+
*
|
|
6
|
+
* - `auto`: make the request as soon as every required property is given,
|
|
7
|
+
* otherwise prompt for what is missing. This is the default.
|
|
8
|
+
* - `interactive`: always prompt to review and edit properties, prefilled
|
|
9
|
+
* with the given arguments. Selected with `--interactive` or `-i`.
|
|
10
|
+
* - `non-interactive`: never prompt: anything missing is an error.
|
|
11
|
+
* Selected with `--non-interactive` or `-y`.
|
|
12
|
+
*/
|
|
13
|
+
export type Interactivity = 'auto' | 'interactive' | 'non-interactive'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Argument keys that select the interactivity
|
|
17
|
+
* and are therefore not command parameters.
|
|
18
|
+
*/
|
|
19
|
+
export const interactivityFlags: string[] = [
|
|
20
|
+
'non_interactive',
|
|
21
|
+
'y',
|
|
22
|
+
'interactive',
|
|
23
|
+
'i',
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Thrown when the CLI needs input it cannot prompt for.
|
|
28
|
+
*/
|
|
29
|
+
export class NonInteractiveError extends Error {
|
|
30
|
+
override name = 'NonInteractiveError'
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const parseCliArgs = (argv: string[]): ParsedArgs =>
|
|
34
|
+
parseArgs(argv, {
|
|
35
|
+
string: ['code'],
|
|
36
|
+
boolean: ['non-interactive', 'interactive'],
|
|
37
|
+
// Deliberately not aliased to -n, which is reserved for a future
|
|
38
|
+
// --dry-run flag.
|
|
39
|
+
alias: { 'non-interactive': 'y', interactive: 'i' },
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
export const getInteractivity = (args: ParsedArgs): Interactivity => {
|
|
43
|
+
const isNonInteractive =
|
|
44
|
+
args['non_interactive'] === true || args['y'] === true
|
|
45
|
+
const isInteractive = args['interactive'] === true || args['i'] === true
|
|
46
|
+
|
|
47
|
+
if (isNonInteractive && isInteractive) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
'The --interactive and --non-interactive flags cannot be used together',
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
if (isNonInteractive) return 'non-interactive'
|
|
53
|
+
if (isInteractive) return 'interactive'
|
|
54
|
+
return 'auto'
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Render a parameter name as the argument used to set it,
|
|
59
|
+
* e.g., `device_id` as `--device-id`.
|
|
60
|
+
*/
|
|
61
|
+
export const toArgName = (parameterName: string): string =>
|
|
62
|
+
`--${parameterName.replace(/_/g, '-')}`
|
package/src/lib/version.ts
CHANGED