@seamapi/cli 0.8.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 +61 -15
- package/bin/cli.js.map +1 -1
- package/lib/blueprint.d.ts +2 -1
- package/lib/blueprint.js +171 -26
- package/lib/blueprint.js.map +1 -1
- package/lib/get-api-blueprint.d.ts +4 -1
- package/lib/get-api-blueprint.js +3 -4
- package/lib/get-api-blueprint.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 +3 -1
- package/lib/version.js +4 -1
- package/lib/version.js.map +1 -1
- package/package.json +4 -3
- package/src/bin/cli.ts +88 -16
- package/src/lib/blueprint.ts +228 -28
- package/src/lib/get-api-blueprint.ts +7 -3
- 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 +4 -1
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import type { Blueprint } from '@seamapi/blueprint';
|
|
2
2
|
export type ApiBlueprint = Blueprint;
|
|
3
|
-
export
|
|
3
|
+
export interface GetApiBlueprintOptions {
|
|
4
|
+
update?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const getApiBlueprint: (useRemoteDefinitions: boolean, options?: GetApiBlueprintOptions) => Promise<ApiBlueprint>;
|
package/lib/get-api-blueprint.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import getBlueprint from './blueprint.js';
|
|
2
2
|
import { getServer } from './get-server.js';
|
|
3
|
-
export const getApiBlueprint = async (useRemoteDefinitions) => {
|
|
3
|
+
export const getApiBlueprint = async (useRemoteDefinitions, options = {}) => {
|
|
4
4
|
// Remote definitions describe whatever the server is currently running, so
|
|
5
|
-
// build them directly from the server's OpenAPI document.
|
|
6
|
-
// does not load @seamapi/types.
|
|
5
|
+
// build them directly from the server's OpenAPI document.
|
|
7
6
|
if (useRemoteDefinitions)
|
|
8
7
|
return await createRemoteBlueprint();
|
|
9
|
-
return await getBlueprint();
|
|
8
|
+
return await getBlueprint(options);
|
|
10
9
|
};
|
|
11
10
|
const createRemoteBlueprint = async () => {
|
|
12
11
|
const [{ createBlueprint }, { getOpenapiSchema }] = await Promise.all([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-api-blueprint.js","sourceRoot":"","sources":["../src/lib/get-api-blueprint.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"get-api-blueprint.js","sourceRoot":"","sources":["../src/lib/get-api-blueprint.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,oBAA6B,EAC7B,UAAkC,EAAE,EACb,EAAE;IACzB,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,oBAAoB;QAAE,OAAO,MAAM,qBAAqB,EAAE,CAAA;IAE9D,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,KAAK,IAAwB,EAAE;IAC3D,MAAM,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpE,MAAM,CAAC,oBAAoB,CAAC;QAC5B,MAAM,CAAC,uBAAuB,CAAC;KAChC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAA;IAEnD,OAAO,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;AACvE,CAAC,CAAA"}
|
|
@@ -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
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
// Versions are replaced with generated values when the package is packed.
|
|
2
|
+
const seamapiCliVersion = '0.10.0';
|
|
3
|
+
const seamapiBlueprintVersion = '1.2.0';
|
|
4
|
+
export { seamapiBlueprintVersion };
|
|
2
5
|
export default seamapiCliVersion;
|
|
3
6
|
//# sourceMappingURL=version.js.map
|
package/lib/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/lib/version.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,OAAO,CAAA;
|
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seamapi/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "A command line interface (CLI) for interacting with the Seam API.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
}
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@seamapi/blueprint": "
|
|
92
|
+
"@seamapi/blueprint": "1.2.0",
|
|
93
93
|
"@seamapi/http": "2.2.0",
|
|
94
94
|
"@seamapi/wizard": "0.5.2",
|
|
95
95
|
"chalk": "^6.0.0",
|
|
@@ -99,7 +99,8 @@
|
|
|
99
99
|
"minimist": "^1.2.8",
|
|
100
100
|
"nanospinner": "^1.2.2",
|
|
101
101
|
"open": "^11.0.0",
|
|
102
|
-
"prompts": "^2.4.2"
|
|
102
|
+
"prompts": "^2.4.2",
|
|
103
|
+
"tar": "^7.5.22"
|
|
103
104
|
},
|
|
104
105
|
"devDependencies": {
|
|
105
106
|
"@seamapi/types": "1.985.0",
|
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,25 @@ 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
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'update',
|
|
63
|
+
description: 'Force an update of the cached Seam API definitions.',
|
|
64
|
+
type: Boolean,
|
|
65
|
+
},
|
|
40
66
|
],
|
|
41
67
|
},
|
|
42
68
|
{
|
|
@@ -54,6 +80,14 @@ const sections = [
|
|
|
54
80
|
summary: 'Create a connect webview to connect devices.',
|
|
55
81
|
},
|
|
56
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
|
+
},
|
|
57
91
|
{
|
|
58
92
|
name: 'seam locks unlock-door {bold --device-id} $MY_DOOR',
|
|
59
93
|
summary: 'Unlock a lock.',
|
|
@@ -117,26 +151,30 @@ async function cli(args: ParsedArgs) {
|
|
|
117
151
|
const use_remote_api_defs =
|
|
118
152
|
args['remote_api_defs'] ?? config.get('use_remote_api_defs')
|
|
119
153
|
|
|
120
|
-
const
|
|
154
|
+
const update = args['update'] === true
|
|
155
|
+
delete args['update']
|
|
121
156
|
|
|
122
|
-
const
|
|
157
|
+
const blueprint = await getApiBlueprint(use_remote_api_defs ?? false, {
|
|
158
|
+
update,
|
|
159
|
+
})
|
|
123
160
|
|
|
124
|
-
|
|
125
|
-
* Whether or not to auto-select first option
|
|
126
|
-
*/
|
|
127
|
-
const is_interactive = args['y'] !== true
|
|
161
|
+
const commandParams: Record<string, any> = {}
|
|
128
162
|
|
|
129
163
|
const ctx: ContextHelpers = {
|
|
130
164
|
blueprint,
|
|
131
|
-
|
|
165
|
+
interactivity: getInteractivity(args),
|
|
132
166
|
}
|
|
133
167
|
|
|
168
|
+
const isNonInteractive = ctx.interactivity === 'non-interactive'
|
|
169
|
+
|
|
134
170
|
for (const k in args) {
|
|
135
171
|
if (k === '_') continue
|
|
136
172
|
const v = args[k]
|
|
137
173
|
delete args[k]
|
|
138
|
-
|
|
139
|
-
|
|
174
|
+
const key = k.replace(/-/g, '_')
|
|
175
|
+
args[key] = v
|
|
176
|
+
if (interactivityFlags.includes(key)) continue
|
|
177
|
+
commandParams[key] = v
|
|
140
178
|
}
|
|
141
179
|
|
|
142
180
|
const selectedCommand = await interactForCommandSelection(args._, ctx)
|
|
@@ -157,6 +195,11 @@ async function cli(args: ParsedArgs) {
|
|
|
157
195
|
if (args['token'] || args['workspace_id'] || args['server']) {
|
|
158
196
|
return
|
|
159
197
|
}
|
|
198
|
+
if (isNonInteractive) {
|
|
199
|
+
throw new NonInteractiveError(
|
|
200
|
+
'Missing required parameter for login: --token',
|
|
201
|
+
)
|
|
202
|
+
}
|
|
160
203
|
await interactForLogin()
|
|
161
204
|
return
|
|
162
205
|
} else if (isEqual(selectedCommand, ['logout'])) {
|
|
@@ -167,9 +210,19 @@ async function cli(args: ParsedArgs) {
|
|
|
167
210
|
console.log(config.path)
|
|
168
211
|
return
|
|
169
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
|
+
}
|
|
170
218
|
await interactForUseRemoteApiDefs()
|
|
171
219
|
return
|
|
172
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
|
+
}
|
|
173
226
|
await interactForWorkspaceId()
|
|
174
227
|
return
|
|
175
228
|
} else if (isEqual(selectedCommand, ['events', 'list'])) {
|
|
@@ -184,6 +237,11 @@ async function cli(args: ParsedArgs) {
|
|
|
184
237
|
config.delete('current_workspace_id')
|
|
185
238
|
return
|
|
186
239
|
}
|
|
240
|
+
if (isNonInteractive) {
|
|
241
|
+
throw new NonInteractiveError(
|
|
242
|
+
'Missing required parameter for select server: --server',
|
|
243
|
+
)
|
|
244
|
+
}
|
|
187
245
|
await interactForServerSelection()
|
|
188
246
|
return
|
|
189
247
|
} else if (isEqual(selectedCommand, ['health', 'get-health'])) {
|
|
@@ -236,18 +294,27 @@ async function cli(args: ParsedArgs) {
|
|
|
236
294
|
})
|
|
237
295
|
|
|
238
296
|
if (response.data?.connect_webview) {
|
|
239
|
-
await handleConnectWebviewResponse(
|
|
297
|
+
await handleConnectWebviewResponse(
|
|
298
|
+
response.data.connect_webview,
|
|
299
|
+
ctx.interactivity,
|
|
300
|
+
)
|
|
240
301
|
}
|
|
241
302
|
|
|
242
|
-
if (response.data?.action_attempt) {
|
|
303
|
+
if (response.data?.action_attempt && !isNonInteractive) {
|
|
243
304
|
interactForActionAttemptPoll(response.data.action_attempt)
|
|
244
305
|
}
|
|
245
306
|
}
|
|
246
307
|
|
|
247
|
-
const handleConnectWebviewResponse = async (
|
|
308
|
+
const handleConnectWebviewResponse = async (
|
|
309
|
+
connect_webview: any,
|
|
310
|
+
interactivity: Interactivity,
|
|
311
|
+
) => {
|
|
248
312
|
const url = connect_webview.url
|
|
249
313
|
|
|
250
|
-
if (
|
|
314
|
+
if (
|
|
315
|
+
interactivity !== 'non-interactive' &&
|
|
316
|
+
process.env['INSIDE_WEB_BROWSER'] !== '1'
|
|
317
|
+
) {
|
|
251
318
|
const { action } = await prompts({
|
|
252
319
|
type: 'confirm',
|
|
253
320
|
name: 'action',
|
|
@@ -271,10 +338,15 @@ const run = async (argv: string[]) => {
|
|
|
271
338
|
return
|
|
272
339
|
}
|
|
273
340
|
|
|
274
|
-
await cli(
|
|
341
|
+
await cli(parseCliArgs(argv))
|
|
275
342
|
}
|
|
276
343
|
|
|
277
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
|
+
|
|
278
350
|
console.log(chalk.red(`CLI Error: ${e.toString()}\n${e.stack}`))
|
|
279
351
|
if (e.toString().includes('object Object')) {
|
|
280
352
|
console.log(e)
|