@super-protocol/sp-cli 0.0.6 → 0.0.8
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 +116 -234
- package/dist/commands/account/base.d.ts +19 -0
- package/dist/commands/account/base.js +42 -0
- package/dist/commands/account/forget.d.ts +14 -0
- package/dist/commands/account/forget.js +49 -0
- package/dist/commands/account/get-sppi.d.ts +2 -2
- package/dist/commands/account/get-sppi.js +8 -13
- package/dist/commands/account/info.d.ts +5 -2
- package/dist/commands/account/info.js +53 -3
- package/dist/commands/account/list.d.ts +9 -0
- package/dist/commands/{config → account}/list.js +16 -9
- package/dist/commands/account/login.d.ts +35 -0
- package/dist/commands/account/login.js +249 -0
- package/dist/commands/account/switch.d.ts +12 -0
- package/dist/commands/account/switch.js +40 -0
- package/dist/commands/base.d.ts +4 -3
- package/dist/commands/base.js +99 -13
- package/dist/commands/files/download.js +13 -5
- package/dist/commands/files/upload.js +11 -7
- package/dist/commands/storage/base.d.ts +2 -2
- package/dist/commands/storage/base.js +11 -11
- package/dist/commands/storage/create.js +1 -1
- package/dist/commands/storage/select.js +6 -8
- package/dist/commands/storage/show.js +2 -4
- package/dist/commands/storage/update.js +39 -22
- package/dist/commands/workflows/extend-lease.d.ts +1 -1
- package/dist/commands/workflows/extend-lease.js +21 -13
- package/dist/config/config-file.schema.d.ts +1 -2
- package/dist/config/config-file.schema.js +0 -1
- package/dist/config/config.schema.d.ts +1 -1
- package/dist/errors.d.ts +2 -0
- package/dist/errors.js +2 -0
- package/dist/hooks/finally/shutdown-blockchain.d.ts +1 -1
- package/dist/hooks/finally/shutdown-blockchain.js +1 -1
- package/dist/hooks/finally/unlock-config.d.ts +3 -0
- package/dist/hooks/finally/unlock-config.js +5 -0
- package/dist/hooks/init/init-container.d.ts +1 -1
- package/dist/hooks/init/init-container.js +2 -3
- package/dist/hooks/init/lock-config.d.ts +3 -0
- package/dist/hooks/init/lock-config.js +19 -0
- package/dist/hooks/prerun/auth.d.ts +3 -0
- package/dist/hooks/prerun/auth.js +70 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/interfaces/account-manager.interface.d.ts +1 -1
- package/dist/interfaces/config-manager.interface.d.ts +2 -2
- package/dist/lib/cli-instance-lock.d.ts +2 -0
- package/dist/lib/cli-instance-lock.js +37 -0
- package/dist/lib/container.d.ts +6 -4
- package/dist/lib/container.js +108 -38
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +4 -1
- package/dist/managers/account-manager.d.ts +7 -8
- package/dist/managers/account-manager.js +20 -45
- package/dist/managers/config-file-manager.d.ts +6 -7
- package/dist/managers/config-file-manager.js +35 -32
- package/dist/managers/config-manager.d.ts +5 -5
- package/dist/managers/config-manager.js +5 -2
- package/dist/middlewares/auth-middleware.d.ts +1 -1
- package/dist/services/auth.service.d.ts +10 -15
- package/dist/services/auth.service.js +71 -5
- package/dist/services/storage.service.d.ts +3 -3
- package/dist/services/storage.service.js +46 -19
- package/dist/utils/helper.d.ts +1 -0
- package/dist/utils/helper.js +15 -1
- package/dist/utils/prompt-flags.d.ts +20 -0
- package/dist/utils/prompt-flags.js +121 -0
- package/dist/utils/prompt.service.d.ts +16 -0
- package/dist/utils/prompt.service.js +75 -0
- package/dist/utils/tty.d.ts +1 -0
- package/dist/utils/tty.js +3 -0
- package/oclif.manifest.json +206 -242
- package/package.json +17 -24
- package/dist/commands/auth/login.d.ts +0 -12
- package/dist/commands/auth/login.js +0 -50
- package/dist/commands/auth/me.d.ts +0 -5
- package/dist/commands/auth/me.js +0 -16
- package/dist/commands/config/add.d.ts +0 -13
- package/dist/commands/config/add.js +0 -73
- package/dist/commands/config/base.d.ts +0 -16
- package/dist/commands/config/base.js +0 -78
- package/dist/commands/config/create.d.ts +0 -11
- package/dist/commands/config/create.js +0 -41
- package/dist/commands/config/delete.d.ts +0 -10
- package/dist/commands/config/delete.js +0 -25
- package/dist/commands/config/index.d.ts +0 -6
- package/dist/commands/config/index.js +0 -22
- package/dist/commands/config/list.d.ts +0 -6
- package/dist/commands/config/show.d.ts +0 -6
- package/dist/commands/config/show.js +0 -10
- package/dist/commands/config/use.d.ts +0 -6
- package/dist/commands/config/use.js +0 -27
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { promptService } from './prompt.service.js';
|
|
2
|
+
const getSampleValue = (definition) => {
|
|
3
|
+
if (typeof definition.min === 'number') {
|
|
4
|
+
return String(definition.min);
|
|
5
|
+
}
|
|
6
|
+
if (typeof definition.max === 'number' && definition.max < 1) {
|
|
7
|
+
return String(definition.max);
|
|
8
|
+
}
|
|
9
|
+
return '1';
|
|
10
|
+
};
|
|
11
|
+
const inferTypeFromDefinition = async (definition, allowNo) => {
|
|
12
|
+
if (definition && typeof definition === 'object') {
|
|
13
|
+
const typedDefinition = definition;
|
|
14
|
+
if (typedDefinition.type === 'boolean' || typedDefinition.type === 'flag') {
|
|
15
|
+
return 'boolean';
|
|
16
|
+
}
|
|
17
|
+
if (typedDefinition.type === 'integer' || typedDefinition.type === 'number') {
|
|
18
|
+
return 'integer';
|
|
19
|
+
}
|
|
20
|
+
if (allowNo && typeof typedDefinition.allowNo === 'boolean') {
|
|
21
|
+
return 'boolean';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const parse = definition?.parse;
|
|
25
|
+
if (typeof parse === 'function') {
|
|
26
|
+
const sample = getSampleValue(definition);
|
|
27
|
+
try {
|
|
28
|
+
const parsed = await parse(sample, {}, definition);
|
|
29
|
+
if (typeof parsed === 'number') {
|
|
30
|
+
return 'integer';
|
|
31
|
+
}
|
|
32
|
+
if (typeof parsed === 'boolean') {
|
|
33
|
+
return 'boolean';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Ignore parsing errors for type inference.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return 'string';
|
|
41
|
+
};
|
|
42
|
+
const parseIntegerValue = (name, input, definition) => {
|
|
43
|
+
if (!/^-?\d+$/.test(input)) {
|
|
44
|
+
throw new Error(`${name} must be a number`);
|
|
45
|
+
}
|
|
46
|
+
const num = Number.parseInt(input, 10);
|
|
47
|
+
if (definition.min !== undefined && num < definition.min) {
|
|
48
|
+
throw new Error(`Expected an integer greater than or equal to ${definition.min} but received: ${input}`);
|
|
49
|
+
}
|
|
50
|
+
if (definition.max !== undefined && num > definition.max) {
|
|
51
|
+
throw new Error(`Expected an integer less than or equal to ${definition.max} but received: ${input}`);
|
|
52
|
+
}
|
|
53
|
+
return num;
|
|
54
|
+
};
|
|
55
|
+
const getFlagType = async (definition) => inferTypeFromDefinition(definition, true);
|
|
56
|
+
export const findMissingRequiredFlags = async (flags, flagDefinitions) => {
|
|
57
|
+
if (!flagDefinitions) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
const missing = [];
|
|
61
|
+
for (const [name, definition] of Object.entries(flagDefinitions)) {
|
|
62
|
+
if (definition.required && (flags[name] === undefined || flags[name] === null)) {
|
|
63
|
+
missing.push({
|
|
64
|
+
name,
|
|
65
|
+
definition,
|
|
66
|
+
type: await getFlagType(definition),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return missing;
|
|
71
|
+
};
|
|
72
|
+
const getArgType = async (definition) => inferTypeFromDefinition(definition, false);
|
|
73
|
+
export const findMissingRequiredArgs = async (args, argDefinitions) => {
|
|
74
|
+
if (!argDefinitions) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
const missing = [];
|
|
78
|
+
for (const [name, definition] of Object.entries(argDefinitions)) {
|
|
79
|
+
if (definition.required && (args[name] === undefined || args[name] === null)) {
|
|
80
|
+
missing.push({
|
|
81
|
+
name,
|
|
82
|
+
definition,
|
|
83
|
+
type: await getArgType(definition),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return missing;
|
|
88
|
+
};
|
|
89
|
+
export const promptForFlag = async (missingFlag) => {
|
|
90
|
+
const description = missingFlag.definition.description;
|
|
91
|
+
const optionValues = missingFlag.definition.options;
|
|
92
|
+
if (missingFlag.type === 'string' && Array.isArray(optionValues) && optionValues.length > 0) {
|
|
93
|
+
const message = description ? `Select ${description}` : `Select ${missingFlag.name}`;
|
|
94
|
+
return promptService.select({
|
|
95
|
+
message,
|
|
96
|
+
options: optionValues.map((value) => ({
|
|
97
|
+
label: value,
|
|
98
|
+
value,
|
|
99
|
+
})),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const parseValue = missingFlag.type === 'integer'
|
|
103
|
+
? (input) => parseIntegerValue(missingFlag.name, input, missingFlag.definition)
|
|
104
|
+
: undefined;
|
|
105
|
+
return promptService.promptForValue(missingFlag.name, description, missingFlag.type, parseValue);
|
|
106
|
+
};
|
|
107
|
+
export const promptForArg = async (missingArg) => {
|
|
108
|
+
const description = missingArg.definition.description;
|
|
109
|
+
const parseValue = missingArg.type === 'integer'
|
|
110
|
+
? (input) => parseIntegerValue(missingArg.name, input, missingArg.definition)
|
|
111
|
+
: undefined;
|
|
112
|
+
return promptService.promptForValue(missingArg.name, description, missingArg.type, parseValue);
|
|
113
|
+
};
|
|
114
|
+
export const formatMissingFlagsError = (missingFlags) => {
|
|
115
|
+
const flagNames = missingFlags.map((f) => `--${f.name}`).join(', ');
|
|
116
|
+
return `Missing required flags: ${flagNames}. Please provide them or run in interactive mode.`;
|
|
117
|
+
};
|
|
118
|
+
export const formatMissingArgsError = (missingArgs) => {
|
|
119
|
+
const argNames = missingArgs.map((a) => `<${a.name}>`).join(', ');
|
|
120
|
+
return `Missing required arguments: ${argNames}. Please provide them or run in interactive mode.`;
|
|
121
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ConfirmOptions as ClackConfirmOptions, type PasswordOptions as ClackPasswordOptions, type SelectOptions as ClackSelectOptions, type TextOptions as ClackTextOptions } from '@clack/prompts';
|
|
2
|
+
export type TextOptions = ClackTextOptions;
|
|
3
|
+
export type ConfirmOptions = ClackConfirmOptions;
|
|
4
|
+
export type SelectOptions<T> = ClackSelectOptions<T>;
|
|
5
|
+
export type PasswordOptions = ClackPasswordOptions;
|
|
6
|
+
type ParseValue = (input: string) => string | number | boolean;
|
|
7
|
+
export declare class PromptService {
|
|
8
|
+
text(options: ClackTextOptions): Promise<string>;
|
|
9
|
+
confirm(options: ClackConfirmOptions): Promise<boolean>;
|
|
10
|
+
select<T>(options: ClackSelectOptions<T>): Promise<T>;
|
|
11
|
+
password(options: ClackPasswordOptions): Promise<string>;
|
|
12
|
+
ensureValue<T>(value: symbol | T, errorMessage?: string): T;
|
|
13
|
+
promptForValue(name: string, description: string | undefined, type: 'string' | 'integer' | 'boolean', parseValue?: ParseValue): Promise<string | number | boolean>;
|
|
14
|
+
}
|
|
15
|
+
export declare const promptService: PromptService;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { confirm as clackConfirm, password as clackPassword, select as clackSelect, text as clackText, isCancel, } from '@clack/prompts';
|
|
2
|
+
export class PromptService {
|
|
3
|
+
async text(options) {
|
|
4
|
+
const result = await clackText(options);
|
|
5
|
+
if (isCancel(result)) {
|
|
6
|
+
throw new Error('Operation cancelled.');
|
|
7
|
+
}
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
async confirm(options) {
|
|
11
|
+
const result = await clackConfirm(options);
|
|
12
|
+
if (isCancel(result)) {
|
|
13
|
+
throw new Error('Operation cancelled.');
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
async select(options) {
|
|
18
|
+
const result = await clackSelect(options);
|
|
19
|
+
if (isCancel(result)) {
|
|
20
|
+
throw new Error('Operation cancelled.');
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
async password(options) {
|
|
25
|
+
const result = await clackPassword(options);
|
|
26
|
+
if (isCancel(result)) {
|
|
27
|
+
throw new Error('Operation cancelled.');
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
ensureValue(value, errorMessage = 'Operation cancelled.') {
|
|
32
|
+
if (isCancel(value)) {
|
|
33
|
+
throw new Error(errorMessage);
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
async promptForValue(name, description, type, parseValue) {
|
|
38
|
+
const fullDescription = description ? ` (${description})` : '';
|
|
39
|
+
if (type === 'boolean') {
|
|
40
|
+
const message = `Enable ${name}${fullDescription}?`;
|
|
41
|
+
return await this.confirm({ message });
|
|
42
|
+
}
|
|
43
|
+
const message = `Please provide ${name}${fullDescription}:`;
|
|
44
|
+
const parseInput = (value) => {
|
|
45
|
+
if (parseValue) {
|
|
46
|
+
return parseValue(value);
|
|
47
|
+
}
|
|
48
|
+
if (type === 'integer') {
|
|
49
|
+
const num = Number.parseInt(value, 10);
|
|
50
|
+
if (Number.isNaN(num)) {
|
|
51
|
+
throw new Error(`${name} must be a number`);
|
|
52
|
+
}
|
|
53
|
+
return num;
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
};
|
|
57
|
+
const result = await this.text({
|
|
58
|
+
message,
|
|
59
|
+
validate: (value) => {
|
|
60
|
+
if (!value || value.trim() === '') {
|
|
61
|
+
return `${name} is required`;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
parseInput(value);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return error instanceof Error ? error.message : String(error);
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return parseInput(result);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export const promptService = new PromptService();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isInteractiveMode: (ttyFlag?: boolean) => boolean;
|