@seamapi/cli 0.18.0 → 0.18.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/lib/interact-for-array.js +37 -22
- package/lib/interact-for-array.js.map +1 -1
- package/lib/interact-for-blueprint-object.js +164 -146
- package/lib/interact-for-blueprint-object.js.map +1 -1
- package/lib/interact-for-command-selection.js +25 -10
- package/lib/interact-for-command-selection.js.map +1 -1
- package/lib/interact-for-custom-metadata.js +50 -35
- package/lib/interact-for-custom-metadata.js.map +1 -1
- package/lib/interact-for-resource.js +4 -2
- package/lib/interact-for-resource.js.map +1 -1
- package/lib/interact-for-timestamp.js +2 -2
- package/lib/interact-for-timestamp.js.map +1 -1
- package/lib/util/prompt.d.ts +9 -0
- package/lib/util/prompt.js +10 -0
- package/lib/util/prompt.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +1 -1
- package/src/lib/interact-for-array.ts +41 -24
- package/src/lib/interact-for-blueprint-object.ts +173 -155
- package/src/lib/interact-for-command-selection.ts +29 -11
- package/src/lib/interact-for-custom-metadata.ts +58 -36
- package/src/lib/interact-for-resource.ts +4 -2
- package/src/lib/interact-for-timestamp.ts +2 -2
- package/src/lib/util/prompt.ts +12 -0
- package/src/lib/version.ts +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getOutput } from './output/get-output.js';
|
|
2
|
-
import { promptSelect, promptText } from './util/prompt.js';
|
|
2
|
+
import { PromptCancelledError, promptSelect, promptText, withBackHint, } from './util/prompt.js';
|
|
3
3
|
export const interactForCustomMetadata = async (customMetadata) => {
|
|
4
4
|
const updatedCustomMetadata = { ...customMetadata };
|
|
5
5
|
const output = getOutput();
|
|
@@ -17,44 +17,59 @@ export const interactForCustomMetadata = async (customMetadata) => {
|
|
|
17
17
|
let action;
|
|
18
18
|
do {
|
|
19
19
|
displayCurrentCustomMetadata();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (action === 'add') {
|
|
29
|
-
const newKey = await promptText({
|
|
30
|
-
message: 'Enter a key to add or edit:',
|
|
20
|
+
try {
|
|
21
|
+
action = await promptSelect({
|
|
22
|
+
message: withBackHint('Choose an action:'),
|
|
23
|
+
choices: [
|
|
24
|
+
{ label: 'Add an item to params', value: 'add' },
|
|
25
|
+
{ label: 'Remove an item from params', value: 'remove' },
|
|
26
|
+
{ label: 'Finish editing params', value: 'done' },
|
|
27
|
+
],
|
|
31
28
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (!(error instanceof PromptCancelledError))
|
|
32
|
+
throw error;
|
|
33
|
+
// Dismissing the action menu finishes editing, keeping the changes.
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
if (action === 'add') {
|
|
38
|
+
const newKey = await promptText({
|
|
39
|
+
message: withBackHint('Enter a key to add or edit:'),
|
|
40
|
+
});
|
|
41
|
+
let newValue = await promptText({
|
|
42
|
+
message: withBackHint('Enter the new value to add or edit (or null to delete):'),
|
|
43
|
+
});
|
|
44
|
+
if (newKey) {
|
|
45
|
+
if (newValue === 'false' || newValue === 'true') {
|
|
46
|
+
newValue = newValue === 'true';
|
|
47
|
+
}
|
|
48
|
+
if (newValue === 'null') {
|
|
49
|
+
updatedCustomMetadata[newKey] = null;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
updatedCustomMetadata[newKey] = newValue;
|
|
53
|
+
}
|
|
44
54
|
}
|
|
45
55
|
}
|
|
56
|
+
else if (action === 'remove') {
|
|
57
|
+
const customKeyToRemove = await promptSelect({
|
|
58
|
+
message: withBackHint('Choose a key-value pair to remove from params:'),
|
|
59
|
+
choices: Object.keys(updatedCustomMetadata).map((customMetadataKey) => {
|
|
60
|
+
return {
|
|
61
|
+
label: `${customMetadataKey}: ${updatedCustomMetadata[customMetadataKey]}`,
|
|
62
|
+
value: customMetadataKey,
|
|
63
|
+
};
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
delete updatedCustomMetadata[customKeyToRemove];
|
|
67
|
+
}
|
|
46
68
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
label: `${customMetadataKey}: ${updatedCustomMetadata[customMetadataKey]}`,
|
|
53
|
-
value: customMetadataKey,
|
|
54
|
-
};
|
|
55
|
-
}),
|
|
56
|
-
});
|
|
57
|
-
delete updatedCustomMetadata[customKeyToRemove];
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (!(error instanceof PromptCancelledError))
|
|
71
|
+
throw error;
|
|
72
|
+
// Dismissing an inner prompt returns to the action menu.
|
|
58
73
|
}
|
|
59
74
|
} while (action !== 'done');
|
|
60
75
|
return updatedCustomMetadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interact-for-custom-metadata.js","sourceRoot":"","sources":["../src/lib/interact-for-custom-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"interact-for-custom-metadata.js","sourceRoot":"","sources":["../src/lib/interact-for-custom-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { promptAutocomplete } from './util/prompt.js';
|
|
1
|
+
import { promptAutocomplete, withBackHint } from './util/prompt.js';
|
|
2
2
|
import { withLoading } from './util/with-loading.js';
|
|
3
3
|
export const interactForResource = async ({ resourceName, fetchResources, toChoice, message = `Select a ${resourceName}:`, }) => {
|
|
4
4
|
const resources = await withLoading(`Fetching ${resourceName.replace(/_/g, ' ')}s...`, fetchResources);
|
|
5
5
|
return await promptAutocomplete({
|
|
6
|
-
|
|
6
|
+
// Resource pickers are only reached from the parameter flow, which
|
|
7
|
+
// returns to its menu when one is dismissed.
|
|
8
|
+
message: withBackHint(message),
|
|
7
9
|
choices: resources.map((resource) => {
|
|
8
10
|
const { title, value, description } = toChoice(resource);
|
|
9
11
|
return { label: title, value, hint: description };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interact-for-resource.js","sourceRoot":"","sources":["../src/lib/interact-for-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"interact-for-resource.js","sourceRoot":"","sources":["../src/lib/interact-for-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAQpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAY,EAClD,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,OAAO,GAAG,YAAY,YAAY,GAAG,GAMtC,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,MAAM,WAAW,CACjC,YAAY,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EACjD,cAAc,CACf,CAAA;IACD,OAAO,MAAM,kBAAkB,CAAC;QAC9B,mEAAmE;QACnE,6CAA6C;QAC7C,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;QAC9B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACxD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;QACnD,CAAC,CAAC;KACH,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { promptText } from './util/prompt.js';
|
|
1
|
+
import { promptText, withBackHint } from './util/prompt.js';
|
|
2
2
|
export const interactForTimestamp = async () => {
|
|
3
3
|
const now = new Date().toISOString();
|
|
4
4
|
const timestamp = await promptText({
|
|
5
|
-
message: 'Enter a timestamp:',
|
|
5
|
+
message: withBackHint('Enter a timestamp:'),
|
|
6
6
|
placeholder: now,
|
|
7
7
|
defaultValue: now,
|
|
8
8
|
validate: (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interact-for-timestamp.js","sourceRoot":"","sources":["../src/lib/interact-for-timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"interact-for-timestamp.js","sourceRoot":"","sources":["../src/lib/interact-for-timestamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAI,EAAE;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpC,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC;QACjC,OAAO,EAAE,YAAY,CAAC,oBAAoB,CAAC;QAC3C,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,GAAG;QACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;gBAAE,OAAO,SAAS,CAAA;YACnD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC5C,OAAO,iCAAiC,GAAG,EAAE,CAAA;YAC/C,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;AAC1C,CAAC,CAAA"}
|
package/lib/util/prompt.d.ts
CHANGED
|
@@ -18,6 +18,15 @@ export interface PromptChoice<Value> {
|
|
|
18
18
|
value: Value;
|
|
19
19
|
hint?: string | undefined;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Note on a prompt message that dismissing it returns to the previous step.
|
|
23
|
+
*
|
|
24
|
+
* Only for prompts whose caller catches the dismissal: elsewhere it still
|
|
25
|
+
* stops the CLI, and saying otherwise would mislead. The note goes in the
|
|
26
|
+
* message because clack renders its own keyboard hints from a hardcoded list
|
|
27
|
+
* that a caller cannot add to.
|
|
28
|
+
*/
|
|
29
|
+
export declare const withBackHint: (message: string) => string;
|
|
21
30
|
/**
|
|
22
31
|
* The arrow keypress an Emacs-style control keypress stands for, or
|
|
23
32
|
* undefined for any other key: ctrl-p is up and ctrl-n is down.
|
package/lib/util/prompt.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { autocomplete, autocompleteMultiselect, confirm, isCancel, select, text, } from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
2
3
|
import { NonInteractiveError } from './cli-args.js';
|
|
3
4
|
/**
|
|
4
5
|
* Whether the CLI can ask the user a question.
|
|
@@ -15,6 +16,15 @@ export class PromptCancelledError extends Error {
|
|
|
15
16
|
super('Cancelled');
|
|
16
17
|
}
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Note on a prompt message that dismissing it returns to the previous step.
|
|
21
|
+
*
|
|
22
|
+
* Only for prompts whose caller catches the dismissal: elsewhere it still
|
|
23
|
+
* stops the CLI, and saying otherwise would mislead. The note goes in the
|
|
24
|
+
* message because clack renders its own keyboard hints from a hardcoded list
|
|
25
|
+
* that a caller cannot add to.
|
|
26
|
+
*/
|
|
27
|
+
export const withBackHint = (message) => `${message} ${chalk.dim('· Esc: go back')}`;
|
|
18
28
|
const ensureInteractive = () => {
|
|
19
29
|
if (!canPrompt()) {
|
|
20
30
|
throw new NonInteractiveError('Cannot prompt without a terminal: pass the missing arguments, or pipe them in as JSON');
|
package/lib/util/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/util/prompt.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,QAAQ,EAER,MAAM,EACN,IAAI,GACL,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/util/prompt.ts"],"names":[],"mappings":"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"}
|
package/lib/version.d.ts
CHANGED
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { getOutput } from './output/get-output.js'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
PromptCancelledError,
|
|
4
|
+
promptNumber,
|
|
5
|
+
promptSelect,
|
|
6
|
+
promptText,
|
|
7
|
+
withBackHint,
|
|
8
|
+
} from './util/prompt.js'
|
|
3
9
|
|
|
4
10
|
export const interactForArray = async (
|
|
5
11
|
array: string[],
|
|
@@ -23,31 +29,42 @@ export const interactForArray = async (
|
|
|
23
29
|
do {
|
|
24
30
|
displayList()
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if (action === 'add') {
|
|
36
|
-
const newItem = await promptText({
|
|
37
|
-
message: 'Enter the new item:',
|
|
32
|
+
try {
|
|
33
|
+
action = await promptSelect({
|
|
34
|
+
message: withBackHint('Choose an action:'),
|
|
35
|
+
choices: [
|
|
36
|
+
{ label: 'Add an item', value: 'add' },
|
|
37
|
+
{ label: 'Remove an item', value: 'remove' },
|
|
38
|
+
{ label: 'Finish editing', value: 'done' },
|
|
39
|
+
],
|
|
38
40
|
})
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (!(error instanceof PromptCancelledError)) throw error
|
|
43
|
+
// Dismissing the action menu finishes editing, keeping the changes.
|
|
44
|
+
break
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
if (action === 'add') {
|
|
49
|
+
const newItem = await promptText({
|
|
50
|
+
message: withBackHint('Enter the new item:'),
|
|
51
|
+
})
|
|
52
|
+
if (newItem) {
|
|
53
|
+
updatedArray.push(newItem)
|
|
54
|
+
}
|
|
55
|
+
} else if (action === 'remove') {
|
|
56
|
+
const index = await promptNumber({
|
|
57
|
+
message: withBackHint('Enter the index of the item to remove:'),
|
|
58
|
+
validate: (value) =>
|
|
59
|
+
value > 0 && value <= updatedArray.length
|
|
60
|
+
? undefined
|
|
61
|
+
: 'Invalid index',
|
|
62
|
+
})
|
|
63
|
+
updatedArray.splice(index - 1, 1)
|
|
41
64
|
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
validate: (value) =>
|
|
46
|
-
value > 0 && value <= updatedArray.length
|
|
47
|
-
? undefined
|
|
48
|
-
: 'Invalid index',
|
|
49
|
-
})
|
|
50
|
-
updatedArray.splice(index - 1, 1)
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (!(error instanceof PromptCancelledError)) throw error
|
|
67
|
+
// Dismissing an inner prompt returns to the action menu.
|
|
51
68
|
}
|
|
52
69
|
} while (action !== 'done')
|
|
53
70
|
|