@mrmtsu/mcms-cli 0.1.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/LICENSE +21 -0
- package/README.ja.md +184 -0
- package/README.md +185 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/api.d.ts +2 -0
- package/dist/commands/api.js +27 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +238 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.js +390 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +63 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/content.d.ts +2 -0
- package/dist/commands/content.js +191 -0
- package/dist/commands/content.js.map +1 -0
- package/dist/commands/media.d.ts +2 -0
- package/dist/commands/media.js +47 -0
- package/dist/commands/media.js.map +1 -0
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +71 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/types.d.ts +2 -0
- package/dist/commands/types.js +85 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/utils.d.ts +8 -0
- package/dist/commands/utils.js +56 -0
- package/dist/commands/utils.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +38 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/auth-store.d.ts +11 -0
- package/dist/core/auth-store.js +83 -0
- package/dist/core/auth-store.js.map +1 -0
- package/dist/core/client.d.ts +33 -0
- package/dist/core/client.js +416 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +11 -0
- package/dist/core/config.js +73 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context.d.ts +39 -0
- package/dist/core/context.js +382 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.js +167 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/exit-codes.d.ts +10 -0
- package/dist/core/exit-codes.js +10 -0
- package/dist/core/exit-codes.js.map +1 -0
- package/dist/core/http.d.ts +24 -0
- package/dist/core/http.js +237 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/io.d.ts +2 -0
- package/dist/core/io.js +39 -0
- package/dist/core/io.js.map +1 -0
- package/dist/core/output.d.ts +4 -0
- package/dist/core/output.js +182 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/schema.d.ts +23 -0
- package/dist/core/schema.js +319 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/validation/payload.d.ts +6 -0
- package/dist/validation/payload.js +204 -0
- package/dist/validation/payload.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { canUseKeychain, saveApiKey, saveApiKeyForProfile } from "../core/auth-store.js";
|
|
2
|
+
import { createRuntimeContext } from "../core/context.js";
|
|
3
|
+
import { CliError } from "../core/errors.js";
|
|
4
|
+
import { EXIT_CODE } from "../core/exit-codes.js";
|
|
5
|
+
import { printSuccess } from "../core/output.js";
|
|
6
|
+
import { readConfig, writeConfig } from "../core/config.js";
|
|
7
|
+
import { contextFromCommand, getActionCommand } from "./utils.js";
|
|
8
|
+
export function registerAuthCommands(program) {
|
|
9
|
+
const auth = program.command("auth").description("Manage authentication settings");
|
|
10
|
+
auth
|
|
11
|
+
.command("login")
|
|
12
|
+
.description("Save API key in keychain (OAuth is not supported in MVP)")
|
|
13
|
+
.option("--profile <name>", "profile name")
|
|
14
|
+
.option("--service-domain <serviceDomain>", "microCMS service domain")
|
|
15
|
+
.option("--api-key <apiKey>", "microCMS API key (less secure: may leak via shell history/process list)")
|
|
16
|
+
.option("--api-key-stdin", "read API key from stdin")
|
|
17
|
+
.option("--prompt", "prompt API key from TTY without echo")
|
|
18
|
+
.action(async (options, command) => {
|
|
19
|
+
const globals = command.optsWithGlobals();
|
|
20
|
+
const apiKeyOption = typeof globals.apiKey === "string" ? globals.apiKey : options.apiKey;
|
|
21
|
+
const apiKeyStdin = Boolean(options.apiKeyStdin || globals.apiKeyStdin);
|
|
22
|
+
const apiKeyPrompt = Boolean(options.prompt);
|
|
23
|
+
if (apiKeyPrompt && (Boolean(apiKeyOption) || apiKeyStdin)) {
|
|
24
|
+
throw new CliError({
|
|
25
|
+
code: "INVALID_INPUT",
|
|
26
|
+
message: "Use --prompt alone. It conflicts with --api-key and --api-key-stdin.",
|
|
27
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const ctx = await createRuntimeContext({
|
|
31
|
+
profile: options.profile ?? globals.profile,
|
|
32
|
+
serviceDomain: options.serviceDomain ?? globals.serviceDomain,
|
|
33
|
+
apiKey: apiKeyOption,
|
|
34
|
+
apiKeyStdin,
|
|
35
|
+
apiKeyPrompt,
|
|
36
|
+
json: Boolean(globals.json),
|
|
37
|
+
plain: Boolean(globals.plain),
|
|
38
|
+
table: Boolean(globals.table),
|
|
39
|
+
select: globals.select,
|
|
40
|
+
verbose: Boolean(globals.verbose),
|
|
41
|
+
color: globals.color,
|
|
42
|
+
timeout: globals.timeout,
|
|
43
|
+
retry: globals.retry,
|
|
44
|
+
retryMaxDelay: globals.retryMaxDelay
|
|
45
|
+
});
|
|
46
|
+
if (!ctx.serviceDomain) {
|
|
47
|
+
throw new CliError({
|
|
48
|
+
code: "INVALID_INPUT",
|
|
49
|
+
message: "service domain is required for auth login",
|
|
50
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (!ctx.apiKey) {
|
|
54
|
+
throw new CliError({
|
|
55
|
+
code: "INVALID_INPUT",
|
|
56
|
+
message: "API key is required for auth login",
|
|
57
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const config = await readConfig();
|
|
61
|
+
const profileOption = options.profile ?? command.optsWithGlobals().profile;
|
|
62
|
+
const profile = profileOption ? normalizeProfileName(profileOption) : undefined;
|
|
63
|
+
const nextProfiles = { ...(config.profiles ?? {}) };
|
|
64
|
+
if (profile) {
|
|
65
|
+
nextProfiles[profile] = { serviceDomain: ctx.serviceDomain };
|
|
66
|
+
}
|
|
67
|
+
await writeConfig({
|
|
68
|
+
...config,
|
|
69
|
+
serviceDomain: profile ? config.serviceDomain : ctx.serviceDomain,
|
|
70
|
+
profiles: Object.keys(nextProfiles).length > 0 ? nextProfiles : config.profiles,
|
|
71
|
+
defaultProfile: config.defaultProfile
|
|
72
|
+
});
|
|
73
|
+
const saveResult = profile
|
|
74
|
+
? await saveApiKeyForProfile(profile, ctx.apiKey)
|
|
75
|
+
: await saveApiKey(ctx.serviceDomain, ctx.apiKey);
|
|
76
|
+
const keychainAvailable = await canUseKeychain();
|
|
77
|
+
printSuccess(ctx, {
|
|
78
|
+
profile: profile ?? null,
|
|
79
|
+
serviceDomain: ctx.serviceDomain,
|
|
80
|
+
apiKeyStored: saveResult.stored,
|
|
81
|
+
keychainAvailable,
|
|
82
|
+
fallbackToEnv: !saveResult.stored,
|
|
83
|
+
reason: saveResult.reason ?? null
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
auth
|
|
87
|
+
.command("status")
|
|
88
|
+
.description("Show auth resolution status")
|
|
89
|
+
.action(async (...actionArgs) => {
|
|
90
|
+
const command = getActionCommand(actionArgs);
|
|
91
|
+
const ctx = await contextFromCommand(command);
|
|
92
|
+
const keychainAvailable = await canUseKeychain();
|
|
93
|
+
printSuccess(ctx, {
|
|
94
|
+
profile: ctx.profile ?? null,
|
|
95
|
+
serviceDomain: ctx.serviceDomain ?? null,
|
|
96
|
+
apiKeyAvailable: Boolean(ctx.apiKey),
|
|
97
|
+
apiKeySource: ctx.apiKeySource,
|
|
98
|
+
apiKeySourceDetail: ctx.apiKeySourceDetail,
|
|
99
|
+
keychainAvailable
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
const profile = auth.command("profile").description("Manage named auth profiles");
|
|
103
|
+
profile
|
|
104
|
+
.command("list")
|
|
105
|
+
.description("List configured profiles")
|
|
106
|
+
.action(async (...actionArgs) => {
|
|
107
|
+
const command = getActionCommand(actionArgs);
|
|
108
|
+
const ctx = await contextFromCommand(command);
|
|
109
|
+
const config = await readConfig();
|
|
110
|
+
const defaultProfile = config.defaultProfile ?? null;
|
|
111
|
+
const profiles = Object.entries(config.profiles ?? {}).map(([name, value]) => ({
|
|
112
|
+
name,
|
|
113
|
+
serviceDomain: value.serviceDomain,
|
|
114
|
+
isDefault: defaultProfile === name
|
|
115
|
+
}));
|
|
116
|
+
printSuccess(ctx, {
|
|
117
|
+
defaultProfile,
|
|
118
|
+
profiles
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
profile
|
|
122
|
+
.command("add")
|
|
123
|
+
.argument("<name>", "profile name")
|
|
124
|
+
.option("--service-domain <serviceDomain>", "microCMS service domain")
|
|
125
|
+
.option("--set-default", "set this profile as default")
|
|
126
|
+
.description("Add or update a profile")
|
|
127
|
+
.action(async (...actionArgs) => {
|
|
128
|
+
const name = actionArgs[0];
|
|
129
|
+
const options = actionArgs[1];
|
|
130
|
+
const command = getActionCommand(actionArgs);
|
|
131
|
+
const ctx = await contextFromCommand(command);
|
|
132
|
+
const profileName = normalizeProfileName(name);
|
|
133
|
+
const serviceDomain = normalizeServiceDomain(options.serviceDomain ?? command.optsWithGlobals().serviceDomain);
|
|
134
|
+
const config = await readConfig();
|
|
135
|
+
const profiles = { ...(config.profiles ?? {}) };
|
|
136
|
+
profiles[profileName] = { serviceDomain };
|
|
137
|
+
await writeConfig({
|
|
138
|
+
...config,
|
|
139
|
+
profiles,
|
|
140
|
+
defaultProfile: options.setDefault ? profileName : config.defaultProfile
|
|
141
|
+
});
|
|
142
|
+
printSuccess(ctx, {
|
|
143
|
+
profile: profileName,
|
|
144
|
+
serviceDomain,
|
|
145
|
+
defaultProfile: options.setDefault ? profileName : config.defaultProfile ?? null
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
profile
|
|
149
|
+
.command("use")
|
|
150
|
+
.argument("<name>", "profile name")
|
|
151
|
+
.description("Set default profile")
|
|
152
|
+
.action(async (...actionArgs) => {
|
|
153
|
+
const name = actionArgs[0];
|
|
154
|
+
const command = getActionCommand(actionArgs);
|
|
155
|
+
const ctx = await contextFromCommand(command);
|
|
156
|
+
const profileName = normalizeProfileName(name);
|
|
157
|
+
const config = await readConfig();
|
|
158
|
+
if (!config.profiles?.[profileName]) {
|
|
159
|
+
throw new CliError({
|
|
160
|
+
code: "INVALID_INPUT",
|
|
161
|
+
message: `Profile not found: ${profileName}`,
|
|
162
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
await writeConfig({
|
|
166
|
+
...config,
|
|
167
|
+
defaultProfile: profileName
|
|
168
|
+
});
|
|
169
|
+
printSuccess(ctx, {
|
|
170
|
+
defaultProfile: profileName
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
profile
|
|
174
|
+
.command("remove")
|
|
175
|
+
.argument("<name>", "profile name")
|
|
176
|
+
.description("Remove profile from config")
|
|
177
|
+
.action(async (...actionArgs) => {
|
|
178
|
+
const name = actionArgs[0];
|
|
179
|
+
const command = getActionCommand(actionArgs);
|
|
180
|
+
const ctx = await contextFromCommand(command);
|
|
181
|
+
const profileName = normalizeProfileName(name);
|
|
182
|
+
const config = await readConfig();
|
|
183
|
+
const profiles = { ...(config.profiles ?? {}) };
|
|
184
|
+
if (!profiles[profileName]) {
|
|
185
|
+
throw new CliError({
|
|
186
|
+
code: "INVALID_INPUT",
|
|
187
|
+
message: `Profile not found: ${profileName}`,
|
|
188
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
delete profiles[profileName];
|
|
192
|
+
await writeConfig({
|
|
193
|
+
...config,
|
|
194
|
+
profiles: Object.keys(profiles).length > 0 ? profiles : undefined,
|
|
195
|
+
defaultProfile: config.defaultProfile === profileName ? undefined : config.defaultProfile
|
|
196
|
+
});
|
|
197
|
+
printSuccess(ctx, {
|
|
198
|
+
removed: profileName
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function normalizeProfileName(value) {
|
|
203
|
+
const name = value?.trim();
|
|
204
|
+
if (!name) {
|
|
205
|
+
throw new CliError({
|
|
206
|
+
code: "INVALID_INPUT",
|
|
207
|
+
message: "Profile name is required",
|
|
208
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (!/^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,62}[A-Za-z0-9])?$/.test(name)) {
|
|
212
|
+
throw new CliError({
|
|
213
|
+
code: "INVALID_INPUT",
|
|
214
|
+
message: "Invalid profile name format. Use letters, numbers, dot, underscore, hyphen (1-64 chars).",
|
|
215
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return name;
|
|
219
|
+
}
|
|
220
|
+
function normalizeServiceDomain(value) {
|
|
221
|
+
if (!value) {
|
|
222
|
+
throw new CliError({
|
|
223
|
+
code: "INVALID_INPUT",
|
|
224
|
+
message: "service domain is required",
|
|
225
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
const normalized = value.trim().toLowerCase();
|
|
229
|
+
if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(normalized)) {
|
|
230
|
+
throw new CliError({
|
|
231
|
+
code: "INVALID_INPUT",
|
|
232
|
+
message: "Invalid service domain format. Expected lowercase letters, numbers, hyphens, max 63 chars, no leading/trailing hyphen.",
|
|
233
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
return normalized;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { lstat, mkdir, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { listApis } from "../core/client.js";
|
|
5
|
+
import { CliError, normalizeError } from "../core/errors.js";
|
|
6
|
+
import { EXIT_CODE } from "../core/exit-codes.js";
|
|
7
|
+
import { printSuccess } from "../core/output.js";
|
|
8
|
+
import { extractApiEndpoints } from "../core/schema.js";
|
|
9
|
+
import { contextFromCommand, getActionCommand } from "./utils.js";
|
|
10
|
+
const SUPPORTED_SHELLS = ["bash", "zsh", "fish"];
|
|
11
|
+
const GLOBAL_OPTIONS = [
|
|
12
|
+
"--json",
|
|
13
|
+
"--plain",
|
|
14
|
+
"--table",
|
|
15
|
+
"--select",
|
|
16
|
+
"--profile",
|
|
17
|
+
"--service-domain",
|
|
18
|
+
"--api-key",
|
|
19
|
+
"--api-key-stdin",
|
|
20
|
+
"--timeout",
|
|
21
|
+
"--retry",
|
|
22
|
+
"--retry-max-delay",
|
|
23
|
+
"--verbose",
|
|
24
|
+
"--no-color"
|
|
25
|
+
];
|
|
26
|
+
export function registerCompletionCommands(program) {
|
|
27
|
+
const completion = program.command("completion").description("Install shell completion scripts");
|
|
28
|
+
completion
|
|
29
|
+
.command("install")
|
|
30
|
+
.argument("[shell]", "bash|zsh|fish")
|
|
31
|
+
.description("Install completion script for your shell")
|
|
32
|
+
.action(async (...actionArgs) => {
|
|
33
|
+
const shellArg = actionArgs[0];
|
|
34
|
+
const command = getActionCommand(actionArgs);
|
|
35
|
+
const ctx = await contextFromCommand(command);
|
|
36
|
+
const shell = parseShell(shellArg ?? detectShellFromEnv());
|
|
37
|
+
const targetPath = getCompletionFilePath(shell);
|
|
38
|
+
const script = buildCompletionScript(shell);
|
|
39
|
+
await assertSafeCompletionTargetForWrite(targetPath);
|
|
40
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
41
|
+
await writeFile(targetPath, script, "utf8");
|
|
42
|
+
printSuccess(ctx, {
|
|
43
|
+
installed: true,
|
|
44
|
+
shell,
|
|
45
|
+
path: targetPath,
|
|
46
|
+
reloadHint: getReloadHint(shell)
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
completion
|
|
50
|
+
.command("uninstall")
|
|
51
|
+
.description("Remove installed completion scripts")
|
|
52
|
+
.action(async (...actionArgs) => {
|
|
53
|
+
const command = getActionCommand(actionArgs);
|
|
54
|
+
const ctx = await contextFromCommand(command);
|
|
55
|
+
const removed = [];
|
|
56
|
+
for (const shell of SUPPORTED_SHELLS) {
|
|
57
|
+
const path = getCompletionFilePath(shell);
|
|
58
|
+
const state = await getPathState(path);
|
|
59
|
+
if (state === "missing") {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (state === "symlink") {
|
|
63
|
+
throw new CliError({
|
|
64
|
+
code: "INVALID_INPUT",
|
|
65
|
+
message: `Refusing to uninstall completion because target is a symbolic link: ${path}`,
|
|
66
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (state !== "file") {
|
|
70
|
+
throw new CliError({
|
|
71
|
+
code: "INVALID_INPUT",
|
|
72
|
+
message: `Refusing to uninstall completion because target is not a regular file: ${path}`,
|
|
73
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
await rm(path, { force: true });
|
|
77
|
+
removed.push(path);
|
|
78
|
+
}
|
|
79
|
+
printSuccess(ctx, {
|
|
80
|
+
uninstalled: true,
|
|
81
|
+
removed
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
completion
|
|
85
|
+
.command("endpoints")
|
|
86
|
+
.description("Print endpoint candidates for shell completion")
|
|
87
|
+
.action(async (...actionArgs) => {
|
|
88
|
+
const command = getActionCommand(actionArgs);
|
|
89
|
+
try {
|
|
90
|
+
const ctx = await contextFromCommand(command);
|
|
91
|
+
const result = await listApis(ctx);
|
|
92
|
+
const endpoints = extractApiEndpoints(result.data);
|
|
93
|
+
if (endpoints.length > 0) {
|
|
94
|
+
process.stdout.write(`${endpoints.join("\n")}\n`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const normalized = normalizeError(error);
|
|
99
|
+
if (isExpectedCompletionFailure(normalized.code)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
throw normalized;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function parseShell(value) {
|
|
107
|
+
if (!value) {
|
|
108
|
+
throw new CliError({
|
|
109
|
+
code: "INVALID_INPUT",
|
|
110
|
+
message: "Shell is required: bash|zsh|fish",
|
|
111
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const normalized = value.trim().toLowerCase();
|
|
115
|
+
if (!SUPPORTED_SHELLS.includes(normalized)) {
|
|
116
|
+
throw new CliError({
|
|
117
|
+
code: "INVALID_INPUT",
|
|
118
|
+
message: `Unsupported shell: ${value}. Choose bash, zsh, or fish.`,
|
|
119
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return normalized;
|
|
123
|
+
}
|
|
124
|
+
function detectShellFromEnv() {
|
|
125
|
+
const shellPath = process.env.SHELL;
|
|
126
|
+
if (!shellPath) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
if (shellPath.endsWith("/bash")) {
|
|
130
|
+
return "bash";
|
|
131
|
+
}
|
|
132
|
+
if (shellPath.endsWith("/zsh")) {
|
|
133
|
+
return "zsh";
|
|
134
|
+
}
|
|
135
|
+
if (shellPath.endsWith("/fish")) {
|
|
136
|
+
return "fish";
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
function getCompletionFilePath(shell) {
|
|
141
|
+
switch (shell) {
|
|
142
|
+
case "bash":
|
|
143
|
+
return join(homedir(), ".local", "share", "bash-completion", "completions", "microcms");
|
|
144
|
+
case "zsh":
|
|
145
|
+
return join(homedir(), ".zfunc", "_microcms");
|
|
146
|
+
case "fish":
|
|
147
|
+
return join(homedir(), ".config", "fish", "completions", "microcms.fish");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function getReloadHint(shell) {
|
|
151
|
+
switch (shell) {
|
|
152
|
+
case "bash":
|
|
153
|
+
return "Open a new shell session, or run: source ~/.bashrc";
|
|
154
|
+
case "zsh":
|
|
155
|
+
return "Open a new shell session, or run: autoload -U compinit && compinit";
|
|
156
|
+
case "fish":
|
|
157
|
+
return "Open a new shell session, or run: source ~/.config/fish/config.fish";
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function isExpectedCompletionFailure(code) {
|
|
161
|
+
return code === "AUTH_FAILED" || code === "FORBIDDEN" || code === "NETWORK_ERROR" || code === "INVALID_INPUT";
|
|
162
|
+
}
|
|
163
|
+
async function assertSafeCompletionTargetForWrite(path) {
|
|
164
|
+
const state = await getPathState(path);
|
|
165
|
+
if (state !== "symlink") {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
throw new CliError({
|
|
169
|
+
code: "INVALID_INPUT",
|
|
170
|
+
message: `Refusing to write completion because target is a symbolic link: ${path}`,
|
|
171
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
async function getPathState(path) {
|
|
175
|
+
try {
|
|
176
|
+
const entry = await lstat(path);
|
|
177
|
+
if (entry.isSymbolicLink()) {
|
|
178
|
+
return "symlink";
|
|
179
|
+
}
|
|
180
|
+
if (entry.isFile()) {
|
|
181
|
+
return "file";
|
|
182
|
+
}
|
|
183
|
+
return "other";
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (isNoEntryError(error)) {
|
|
187
|
+
return "missing";
|
|
188
|
+
}
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function isNoEntryError(error) {
|
|
193
|
+
return typeof error === "object" && error !== null && error.code === "ENOENT";
|
|
194
|
+
}
|
|
195
|
+
function buildCompletionScript(shell) {
|
|
196
|
+
switch (shell) {
|
|
197
|
+
case "bash":
|
|
198
|
+
return buildBashCompletionScript();
|
|
199
|
+
case "zsh":
|
|
200
|
+
return buildZshCompletionScript();
|
|
201
|
+
case "fish":
|
|
202
|
+
return buildFishCompletionScript();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function buildBashCompletionScript() {
|
|
206
|
+
const globals = GLOBAL_OPTIONS.join(" ");
|
|
207
|
+
return `# microcms completion for bash
|
|
208
|
+
_microcms_endpoint_candidates() {
|
|
209
|
+
microcms completion endpoints 2>/dev/null
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
_microcms_complete() {
|
|
213
|
+
local cur command subcmd
|
|
214
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
215
|
+
command="\${COMP_WORDS[1]}"
|
|
216
|
+
subcmd="\${COMP_WORDS[2]}"
|
|
217
|
+
|
|
218
|
+
local roots="api auth config completion content media schema types validate help"
|
|
219
|
+
local globals="${globals}"
|
|
220
|
+
|
|
221
|
+
if [[ \${COMP_CWORD} -eq 1 ]]; then
|
|
222
|
+
COMPREPLY=( $(compgen -W "\${roots} \${globals}" -- "$cur") )
|
|
223
|
+
return
|
|
224
|
+
fi
|
|
225
|
+
|
|
226
|
+
case "$command" in
|
|
227
|
+
auth)
|
|
228
|
+
COMPREPLY=( $(compgen -W "login status profile" -- "$cur") )
|
|
229
|
+
;;
|
|
230
|
+
api)
|
|
231
|
+
if [[ "$subcmd" == "info" && \${COMP_CWORD} -eq 3 ]]; then
|
|
232
|
+
COMPREPLY=( $(compgen -W "$( _microcms_endpoint_candidates )" -- "$cur") )
|
|
233
|
+
else
|
|
234
|
+
COMPREPLY=( $(compgen -W "list info" -- "$cur") )
|
|
235
|
+
fi
|
|
236
|
+
;;
|
|
237
|
+
content)
|
|
238
|
+
if [[ \${COMP_CWORD} -eq 3 ]]; then
|
|
239
|
+
COMPREPLY=( $(compgen -W "$( _microcms_endpoint_candidates )" -- "$cur") )
|
|
240
|
+
else
|
|
241
|
+
COMPREPLY=( $(compgen -W "list get create update delete" -- "$cur") )
|
|
242
|
+
fi
|
|
243
|
+
;;
|
|
244
|
+
media)
|
|
245
|
+
COMPREPLY=( $(compgen -W "upload" -- "$cur") )
|
|
246
|
+
;;
|
|
247
|
+
config)
|
|
248
|
+
COMPREPLY=( $(compgen -W "doctor" -- "$cur") )
|
|
249
|
+
;;
|
|
250
|
+
schema)
|
|
251
|
+
COMPREPLY=( $(compgen -W "pull" -- "$cur") )
|
|
252
|
+
;;
|
|
253
|
+
types)
|
|
254
|
+
COMPREPLY=( $(compgen -W "generate" -- "$cur") )
|
|
255
|
+
;;
|
|
256
|
+
completion)
|
|
257
|
+
COMPREPLY=( $(compgen -W "install uninstall bash zsh fish" -- "$cur") )
|
|
258
|
+
;;
|
|
259
|
+
validate)
|
|
260
|
+
if [[ \${COMP_CWORD} -eq 2 ]]; then
|
|
261
|
+
COMPREPLY=( $(compgen -W "$( _microcms_endpoint_candidates )" -- "$cur") )
|
|
262
|
+
else
|
|
263
|
+
COMPREPLY=( $(compgen -W "--file" -- "$cur") )
|
|
264
|
+
fi
|
|
265
|
+
;;
|
|
266
|
+
*)
|
|
267
|
+
COMPREPLY=( $(compgen -W "$globals" -- "$cur") )
|
|
268
|
+
;;
|
|
269
|
+
esac
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
complete -F _microcms_complete microcms
|
|
273
|
+
`;
|
|
274
|
+
}
|
|
275
|
+
function buildZshCompletionScript() {
|
|
276
|
+
const globals = GLOBAL_OPTIONS.join(" ");
|
|
277
|
+
return `#compdef microcms
|
|
278
|
+
|
|
279
|
+
_microcms_endpoints() {
|
|
280
|
+
local -a endpoints
|
|
281
|
+
endpoints=(\${(f)"$(microcms completion endpoints 2>/dev/null)"})
|
|
282
|
+
if (( \${#endpoints[@]} > 0 )); then
|
|
283
|
+
_describe 'endpoint' endpoints
|
|
284
|
+
fi
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
_microcms() {
|
|
288
|
+
local -a roots
|
|
289
|
+
roots=(api auth config completion content media schema types validate)
|
|
290
|
+
_arguments '*::arg:->args'
|
|
291
|
+
|
|
292
|
+
case $state in
|
|
293
|
+
args)
|
|
294
|
+
if (( CURRENT == 2 )); then
|
|
295
|
+
_describe 'command' roots
|
|
296
|
+
return
|
|
297
|
+
fi
|
|
298
|
+
|
|
299
|
+
local subcmd=$words[2]
|
|
300
|
+
local action=$words[3]
|
|
301
|
+
|
|
302
|
+
if [[ "$subcmd" == "api" && "$action" == "info" && CURRENT -eq 4 ]]; then
|
|
303
|
+
_microcms_endpoints
|
|
304
|
+
return
|
|
305
|
+
fi
|
|
306
|
+
|
|
307
|
+
if [[ "$subcmd" == "content" && CURRENT -eq 4 ]]; then
|
|
308
|
+
_microcms_endpoints
|
|
309
|
+
return
|
|
310
|
+
fi
|
|
311
|
+
|
|
312
|
+
if [[ "$subcmd" == "validate" && CURRENT -eq 3 ]]; then
|
|
313
|
+
_microcms_endpoints
|
|
314
|
+
return
|
|
315
|
+
fi
|
|
316
|
+
|
|
317
|
+
case $subcmd in
|
|
318
|
+
auth)
|
|
319
|
+
_values 'auth command' login status profile
|
|
320
|
+
;;
|
|
321
|
+
api)
|
|
322
|
+
_values 'api command' list info
|
|
323
|
+
;;
|
|
324
|
+
content)
|
|
325
|
+
_values 'content command' list get create update delete
|
|
326
|
+
;;
|
|
327
|
+
media)
|
|
328
|
+
_values 'media command' upload
|
|
329
|
+
;;
|
|
330
|
+
config)
|
|
331
|
+
_values 'config command' doctor
|
|
332
|
+
;;
|
|
333
|
+
schema)
|
|
334
|
+
_values 'schema command' pull
|
|
335
|
+
;;
|
|
336
|
+
types)
|
|
337
|
+
_values 'types command' generate
|
|
338
|
+
;;
|
|
339
|
+
completion)
|
|
340
|
+
_values 'completion command' install uninstall bash zsh fish
|
|
341
|
+
;;
|
|
342
|
+
validate)
|
|
343
|
+
_values 'option' --file
|
|
344
|
+
;;
|
|
345
|
+
*)
|
|
346
|
+
_values 'global option' ${globals}
|
|
347
|
+
;;
|
|
348
|
+
esac
|
|
349
|
+
;;
|
|
350
|
+
esac
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
_microcms "$@"
|
|
354
|
+
`;
|
|
355
|
+
}
|
|
356
|
+
function buildFishCompletionScript() {
|
|
357
|
+
return `# microcms completion for fish
|
|
358
|
+
complete -c microcms -f
|
|
359
|
+
|
|
360
|
+
complete -c microcms -n '__fish_use_subcommand' -a 'api auth config completion content media schema types validate'
|
|
361
|
+
|
|
362
|
+
complete -c microcms -n '__fish_seen_subcommand_from auth' -a 'login status profile'
|
|
363
|
+
complete -c microcms -n '__fish_seen_subcommand_from api' -a 'list info'
|
|
364
|
+
complete -c microcms -n '__fish_seen_subcommand_from content' -a 'list get create update delete'
|
|
365
|
+
complete -c microcms -n '__fish_seen_subcommand_from media' -a 'upload'
|
|
366
|
+
complete -c microcms -n '__fish_seen_subcommand_from config' -a 'doctor'
|
|
367
|
+
complete -c microcms -n '__fish_seen_subcommand_from schema' -a 'pull'
|
|
368
|
+
complete -c microcms -n '__fish_seen_subcommand_from types' -a 'generate'
|
|
369
|
+
complete -c microcms -n '__fish_seen_subcommand_from completion' -a 'install uninstall bash zsh fish'
|
|
370
|
+
|
|
371
|
+
complete -c microcms -n '__fish_seen_subcommand_from api; and __fish_seen_subcommand_from info; and __fish_is_nth_token 3' -a '(microcms completion endpoints 2>/dev/null)'
|
|
372
|
+
complete -c microcms -n '__fish_seen_subcommand_from content; and __fish_is_nth_token 3' -a '(microcms completion endpoints 2>/dev/null)'
|
|
373
|
+
complete -c microcms -n '__fish_seen_subcommand_from validate; and __fish_is_nth_token 2' -a '(microcms completion endpoints 2>/dev/null)'
|
|
374
|
+
|
|
375
|
+
complete -c microcms -l json
|
|
376
|
+
complete -c microcms -l plain
|
|
377
|
+
complete -c microcms -l table
|
|
378
|
+
complete -c microcms -l select
|
|
379
|
+
complete -c microcms -l profile
|
|
380
|
+
complete -c microcms -l service-domain
|
|
381
|
+
complete -c microcms -l api-key
|
|
382
|
+
complete -c microcms -l api-key-stdin
|
|
383
|
+
complete -c microcms -l timeout
|
|
384
|
+
complete -c microcms -l retry
|
|
385
|
+
complete -c microcms -l retry-max-delay
|
|
386
|
+
complete -c microcms -l verbose
|
|
387
|
+
complete -c microcms -l no-color
|
|
388
|
+
`;
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|