@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,11 @@
|
|
|
1
|
+
export declare function canUseKeychain(): Promise<boolean>;
|
|
2
|
+
export declare function saveApiKey(serviceDomain: string, apiKey: string): Promise<{
|
|
3
|
+
stored: boolean;
|
|
4
|
+
reason?: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function readApiKey(serviceDomain: string): Promise<string | null>;
|
|
7
|
+
export declare function saveApiKeyForProfile(profile: string, apiKey: string): Promise<{
|
|
8
|
+
stored: boolean;
|
|
9
|
+
reason?: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function readApiKeyForProfile(profile: string): Promise<string | null>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const SERVICE_NAME = "mcms-cli";
|
|
2
|
+
async function loadKeytar() {
|
|
3
|
+
try {
|
|
4
|
+
const mod = await import("keytar");
|
|
5
|
+
return (mod.default ?? mod);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function getAccount(serviceDomain) {
|
|
12
|
+
return `service:${serviceDomain}`;
|
|
13
|
+
}
|
|
14
|
+
function getProfileAccount(profile) {
|
|
15
|
+
return `profile:${profile}`;
|
|
16
|
+
}
|
|
17
|
+
export async function canUseKeychain() {
|
|
18
|
+
const keytar = await loadKeytar();
|
|
19
|
+
return keytar !== null;
|
|
20
|
+
}
|
|
21
|
+
export async function saveApiKey(serviceDomain, apiKey) {
|
|
22
|
+
const keytar = await loadKeytar();
|
|
23
|
+
if (!keytar) {
|
|
24
|
+
return {
|
|
25
|
+
stored: false,
|
|
26
|
+
reason: "keychain_unavailable"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
await keytar.setPassword(SERVICE_NAME, getAccount(serviceDomain), apiKey);
|
|
31
|
+
return { stored: true };
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return {
|
|
35
|
+
stored: false,
|
|
36
|
+
reason: "keychain_write_failed"
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function readApiKey(serviceDomain) {
|
|
41
|
+
const keytar = await loadKeytar();
|
|
42
|
+
if (!keytar) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
return await keytar.getPassword(SERVICE_NAME, getAccount(serviceDomain));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function saveApiKeyForProfile(profile, apiKey) {
|
|
53
|
+
const keytar = await loadKeytar();
|
|
54
|
+
if (!keytar) {
|
|
55
|
+
return {
|
|
56
|
+
stored: false,
|
|
57
|
+
reason: "keychain_unavailable"
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await keytar.setPassword(SERVICE_NAME, getProfileAccount(profile), apiKey);
|
|
62
|
+
return { stored: true };
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return {
|
|
66
|
+
stored: false,
|
|
67
|
+
reason: "keychain_write_failed"
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function readApiKeyForProfile(profile) {
|
|
72
|
+
const keytar = await loadKeytar();
|
|
73
|
+
if (!keytar) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
return await keytar.getPassword(SERVICE_NAME, getProfileAccount(profile));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=auth-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../src/core/auth-store.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,UAAU,CAAC;AAOhC,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAiB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,aAAqB;IACvC,OAAO,WAAW,aAAa,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,WAAW,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAqB,EAAE,MAAc;IACpE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,sBAAsB;SAC/B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,uBAAuB;SAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAqB;IACpD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,MAAc;IACxE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,sBAAsB;SAC/B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,uBAAuB;SAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RuntimeContext } from "./context.js";
|
|
2
|
+
export declare function listContent(ctx: RuntimeContext, endpoint: string, queries?: Record<string, unknown>): Promise<{
|
|
3
|
+
data: unknown;
|
|
4
|
+
requestId: string | null;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function getContent(ctx: RuntimeContext, endpoint: string, contentId: string, queries?: Record<string, unknown>): Promise<{
|
|
7
|
+
data: unknown;
|
|
8
|
+
requestId: string | null;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function createContent(ctx: RuntimeContext, endpoint: string, content: Record<string, unknown>): Promise<{
|
|
11
|
+
data: unknown;
|
|
12
|
+
requestId: string | null;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function updateContent(ctx: RuntimeContext, endpoint: string, contentId: string, content: Record<string, unknown>): Promise<{
|
|
15
|
+
data: unknown;
|
|
16
|
+
requestId: string | null;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function deleteContent(ctx: RuntimeContext, endpoint: string, contentId: string): Promise<{
|
|
19
|
+
data: unknown;
|
|
20
|
+
requestId: string | null;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function listApis(ctx: RuntimeContext): Promise<{
|
|
23
|
+
data: unknown;
|
|
24
|
+
requestId: string | null;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function getApiInfo(ctx: RuntimeContext, endpoint: string): Promise<{
|
|
27
|
+
data: unknown;
|
|
28
|
+
requestId: string | null;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function uploadMedia(ctx: RuntimeContext, path: string): Promise<{
|
|
31
|
+
data: unknown;
|
|
32
|
+
requestId: string | null;
|
|
33
|
+
}>;
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { basename, extname } from "node:path";
|
|
3
|
+
import { createClient } from "microcms-js-sdk";
|
|
4
|
+
import { CliError, fromHttpStatus } from "./errors.js";
|
|
5
|
+
import { EXIT_CODE } from "./exit-codes.js";
|
|
6
|
+
import { requestFormData, requestJson } from "./http.js";
|
|
7
|
+
const MANAGEMENT_BASE_URL_OVERRIDE = process.env.MICROCMS_MANAGEMENT_API_BASE_URL;
|
|
8
|
+
const CONTENT_BASE_URL_OVERRIDE = process.env.MICROCMS_CONTENT_API_BASE_URL;
|
|
9
|
+
const CONTENT_MOCK_FILE = process.env.MICROCMS_CONTENT_MOCK_FILE;
|
|
10
|
+
function assertAuth(ctx) {
|
|
11
|
+
if (!ctx.serviceDomain) {
|
|
12
|
+
throw new CliError({
|
|
13
|
+
code: "INVALID_INPUT",
|
|
14
|
+
message: "Service domain is required. Pass --service-domain or set MICROCMS_SERVICE_DOMAIN.",
|
|
15
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (!ctx.apiKey) {
|
|
19
|
+
throw new CliError({
|
|
20
|
+
code: "AUTH_FAILED",
|
|
21
|
+
message: "API key is required. Pass --api-key, set MICROCMS_API_KEY, or run auth login.",
|
|
22
|
+
exitCode: EXIT_CODE.AUTH
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function getContentClient(ctx) {
|
|
27
|
+
assertAuth(ctx);
|
|
28
|
+
return createClient({
|
|
29
|
+
serviceDomain: ctx.serviceDomain,
|
|
30
|
+
apiKey: ctx.apiKey
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function listContent(ctx, endpoint, queries) {
|
|
34
|
+
assertAuth(ctx);
|
|
35
|
+
if (CONTENT_MOCK_FILE) {
|
|
36
|
+
return runMockList(endpoint, queries);
|
|
37
|
+
}
|
|
38
|
+
if (CONTENT_BASE_URL_OVERRIDE) {
|
|
39
|
+
const url = buildApiUrl(getContentBaseUrl(ctx.serviceDomain), [endpoint], queries);
|
|
40
|
+
const result = await requestJson({
|
|
41
|
+
url,
|
|
42
|
+
apiKey: ctx.apiKey,
|
|
43
|
+
timeoutMs: ctx.timeoutMs,
|
|
44
|
+
retry: ctx.retry,
|
|
45
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
46
|
+
verbose: ctx.verbose
|
|
47
|
+
});
|
|
48
|
+
return { data: result.data, requestId: result.requestId };
|
|
49
|
+
}
|
|
50
|
+
const client = getContentClient(ctx);
|
|
51
|
+
const data = await client.getList({ endpoint, queries });
|
|
52
|
+
return { data, requestId: null };
|
|
53
|
+
}
|
|
54
|
+
export async function getContent(ctx, endpoint, contentId, queries) {
|
|
55
|
+
assertAuth(ctx);
|
|
56
|
+
if (CONTENT_MOCK_FILE) {
|
|
57
|
+
return runMockGet(endpoint, contentId, queries);
|
|
58
|
+
}
|
|
59
|
+
if (CONTENT_BASE_URL_OVERRIDE) {
|
|
60
|
+
const url = buildApiUrl(getContentBaseUrl(ctx.serviceDomain), [endpoint, contentId], queries);
|
|
61
|
+
const result = await requestJson({
|
|
62
|
+
url,
|
|
63
|
+
apiKey: ctx.apiKey,
|
|
64
|
+
timeoutMs: ctx.timeoutMs,
|
|
65
|
+
retry: ctx.retry,
|
|
66
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
67
|
+
verbose: ctx.verbose
|
|
68
|
+
});
|
|
69
|
+
return { data: result.data, requestId: result.requestId };
|
|
70
|
+
}
|
|
71
|
+
const client = getContentClient(ctx);
|
|
72
|
+
const data = await client.getListDetail({ endpoint, contentId, queries });
|
|
73
|
+
return { data, requestId: null };
|
|
74
|
+
}
|
|
75
|
+
export async function createContent(ctx, endpoint, content) {
|
|
76
|
+
assertAuth(ctx);
|
|
77
|
+
if (CONTENT_MOCK_FILE) {
|
|
78
|
+
return runMockCreate(endpoint, content);
|
|
79
|
+
}
|
|
80
|
+
if (CONTENT_BASE_URL_OVERRIDE) {
|
|
81
|
+
const url = buildApiUrl(getContentBaseUrl(ctx.serviceDomain), [endpoint]);
|
|
82
|
+
const result = await requestJson({
|
|
83
|
+
url,
|
|
84
|
+
method: "POST",
|
|
85
|
+
apiKey: ctx.apiKey,
|
|
86
|
+
timeoutMs: ctx.timeoutMs,
|
|
87
|
+
retry: ctx.retry,
|
|
88
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
89
|
+
verbose: ctx.verbose,
|
|
90
|
+
body: content
|
|
91
|
+
});
|
|
92
|
+
return { data: result.data, requestId: result.requestId };
|
|
93
|
+
}
|
|
94
|
+
const client = getContentClient(ctx);
|
|
95
|
+
const data = await client.create({ endpoint, content });
|
|
96
|
+
return { data, requestId: null };
|
|
97
|
+
}
|
|
98
|
+
export async function updateContent(ctx, endpoint, contentId, content) {
|
|
99
|
+
assertAuth(ctx);
|
|
100
|
+
if (CONTENT_MOCK_FILE) {
|
|
101
|
+
return runMockUpdate(endpoint, contentId, content);
|
|
102
|
+
}
|
|
103
|
+
if (CONTENT_BASE_URL_OVERRIDE) {
|
|
104
|
+
const url = buildApiUrl(getContentBaseUrl(ctx.serviceDomain), [endpoint, contentId]);
|
|
105
|
+
const result = await requestJson({
|
|
106
|
+
url,
|
|
107
|
+
method: "PATCH",
|
|
108
|
+
apiKey: ctx.apiKey,
|
|
109
|
+
timeoutMs: ctx.timeoutMs,
|
|
110
|
+
retry: ctx.retry,
|
|
111
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
112
|
+
verbose: ctx.verbose,
|
|
113
|
+
body: content
|
|
114
|
+
});
|
|
115
|
+
return { data: result.data, requestId: result.requestId };
|
|
116
|
+
}
|
|
117
|
+
const client = getContentClient(ctx);
|
|
118
|
+
const data = await client.update({ endpoint, contentId, content });
|
|
119
|
+
return { data, requestId: null };
|
|
120
|
+
}
|
|
121
|
+
export async function deleteContent(ctx, endpoint, contentId) {
|
|
122
|
+
assertAuth(ctx);
|
|
123
|
+
if (CONTENT_MOCK_FILE) {
|
|
124
|
+
return runMockDelete(endpoint, contentId);
|
|
125
|
+
}
|
|
126
|
+
if (CONTENT_BASE_URL_OVERRIDE) {
|
|
127
|
+
const url = buildApiUrl(getContentBaseUrl(ctx.serviceDomain), [endpoint, contentId]);
|
|
128
|
+
const result = await requestJson({
|
|
129
|
+
url,
|
|
130
|
+
method: "DELETE",
|
|
131
|
+
apiKey: ctx.apiKey,
|
|
132
|
+
timeoutMs: ctx.timeoutMs,
|
|
133
|
+
retry: ctx.retry,
|
|
134
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
135
|
+
verbose: ctx.verbose
|
|
136
|
+
});
|
|
137
|
+
return {
|
|
138
|
+
data: result.data,
|
|
139
|
+
requestId: result.requestId
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const client = getContentClient(ctx);
|
|
143
|
+
await client.delete({ endpoint, contentId });
|
|
144
|
+
return {
|
|
145
|
+
data: {
|
|
146
|
+
id: contentId,
|
|
147
|
+
deleted: true
|
|
148
|
+
},
|
|
149
|
+
requestId: null
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export async function listApis(ctx) {
|
|
153
|
+
assertAuth(ctx);
|
|
154
|
+
const url = buildApiUrl(getManagementBaseUrl(ctx.serviceDomain), ["apis"]);
|
|
155
|
+
const result = await requestJson({
|
|
156
|
+
url,
|
|
157
|
+
apiKey: ctx.apiKey,
|
|
158
|
+
timeoutMs: ctx.timeoutMs,
|
|
159
|
+
retry: ctx.retry,
|
|
160
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
161
|
+
verbose: ctx.verbose
|
|
162
|
+
});
|
|
163
|
+
return { data: result.data, requestId: result.requestId };
|
|
164
|
+
}
|
|
165
|
+
export async function getApiInfo(ctx, endpoint) {
|
|
166
|
+
assertAuth(ctx);
|
|
167
|
+
const url = buildApiUrl(getManagementBaseUrl(ctx.serviceDomain), ["apis", endpoint]);
|
|
168
|
+
const result = await requestJson({
|
|
169
|
+
url,
|
|
170
|
+
apiKey: ctx.apiKey,
|
|
171
|
+
timeoutMs: ctx.timeoutMs,
|
|
172
|
+
retry: ctx.retry,
|
|
173
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
174
|
+
verbose: ctx.verbose
|
|
175
|
+
});
|
|
176
|
+
return { data: result.data, requestId: result.requestId };
|
|
177
|
+
}
|
|
178
|
+
export async function uploadMedia(ctx, path) {
|
|
179
|
+
assertAuth(ctx);
|
|
180
|
+
const buffer = await readFile(path).catch(() => {
|
|
181
|
+
throw new CliError({
|
|
182
|
+
code: "INVALID_INPUT",
|
|
183
|
+
message: `Could not read file: ${path}`,
|
|
184
|
+
details: { path },
|
|
185
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
const formData = new FormData();
|
|
189
|
+
const mimeType = guessMediaContentType(path);
|
|
190
|
+
formData.append("file", new Blob([buffer], { type: mimeType }), basename(path));
|
|
191
|
+
const url = buildApiUrl(getManagementBaseUrl(ctx.serviceDomain), ["media"]);
|
|
192
|
+
const result = await requestFormData({
|
|
193
|
+
url,
|
|
194
|
+
apiKey: ctx.apiKey,
|
|
195
|
+
timeoutMs: ctx.timeoutMs,
|
|
196
|
+
retry: ctx.retry,
|
|
197
|
+
retryMaxDelayMs: ctx.retryMaxDelayMs,
|
|
198
|
+
verbose: ctx.verbose,
|
|
199
|
+
formData
|
|
200
|
+
});
|
|
201
|
+
return { data: result.data, requestId: result.requestId };
|
|
202
|
+
}
|
|
203
|
+
function getManagementBaseUrl(serviceDomain) {
|
|
204
|
+
if (MANAGEMENT_BASE_URL_OVERRIDE) {
|
|
205
|
+
return normalizeBaseUrlOverride("MICROCMS_MANAGEMENT_API_BASE_URL", MANAGEMENT_BASE_URL_OVERRIDE, [
|
|
206
|
+
"microcms-management.io"
|
|
207
|
+
]);
|
|
208
|
+
}
|
|
209
|
+
return buildTenantOrigin(serviceDomain, "microcms-management.io");
|
|
210
|
+
}
|
|
211
|
+
function getContentBaseUrl(serviceDomain) {
|
|
212
|
+
if (CONTENT_BASE_URL_OVERRIDE) {
|
|
213
|
+
return normalizeBaseUrlOverride("MICROCMS_CONTENT_API_BASE_URL", CONTENT_BASE_URL_OVERRIDE, ["microcms.io"]);
|
|
214
|
+
}
|
|
215
|
+
return buildTenantOrigin(serviceDomain, "microcms.io");
|
|
216
|
+
}
|
|
217
|
+
function buildTenantOrigin(serviceDomain, baseDomain) {
|
|
218
|
+
const url = new URL("https://example.invalid");
|
|
219
|
+
url.hostname = `${serviceDomain}.${baseDomain}`;
|
|
220
|
+
return url.origin;
|
|
221
|
+
}
|
|
222
|
+
function buildApiUrl(baseOrigin, pathParts, queries) {
|
|
223
|
+
const url = new URL(baseOrigin);
|
|
224
|
+
url.pathname = `/api/v1/${pathParts.map((part) => encodeURIComponent(part)).join("/")}`;
|
|
225
|
+
if (!queries) {
|
|
226
|
+
return url.toString();
|
|
227
|
+
}
|
|
228
|
+
for (const [key, value] of Object.entries(queries)) {
|
|
229
|
+
if (value === undefined || value === null) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
url.searchParams.set(key, String(value));
|
|
233
|
+
}
|
|
234
|
+
return url.toString();
|
|
235
|
+
}
|
|
236
|
+
function normalizeBaseUrlOverride(name, value, allowedDomains) {
|
|
237
|
+
let parsed;
|
|
238
|
+
try {
|
|
239
|
+
parsed = new URL(value);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
throw new CliError({
|
|
243
|
+
code: "INVALID_INPUT",
|
|
244
|
+
message: `${name} must be a valid URL`,
|
|
245
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
if (parsed.username || parsed.password) {
|
|
249
|
+
throw new CliError({
|
|
250
|
+
code: "INVALID_INPUT",
|
|
251
|
+
message: `${name} must not include username/password`,
|
|
252
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
|
|
256
|
+
if (!isLocalhost && parsed.protocol !== "https:") {
|
|
257
|
+
throw new CliError({
|
|
258
|
+
code: "INVALID_INPUT",
|
|
259
|
+
message: `${name} must use https for non-localhost origins`,
|
|
260
|
+
exitCode: EXIT_CODE.INVALID_INPUT
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
const allowed = isLocalhost || allowedDomains.some((domain) => parsed.hostname === domain || parsed.hostname.endsWith(`.${domain}`));
|
|
264
|
+
if (!allowed) {
|
|
265
|
+
throw new CliError({
|
|
266
|
+
code: "INVALID_INPUT",
|
|
267
|
+
message: `${name} points to a non-allowed host`,
|
|
268
|
+
exitCode: EXIT_CODE.INVALID_INPUT,
|
|
269
|
+
details: {
|
|
270
|
+
hostname: parsed.hostname
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
return parsed.origin;
|
|
275
|
+
}
|
|
276
|
+
async function runMockList(endpoint, queries) {
|
|
277
|
+
const store = await readMockStore();
|
|
278
|
+
const endpointStore = store.endpoints[endpoint] ?? {};
|
|
279
|
+
const offset = Number(queries?.offset ?? 0);
|
|
280
|
+
const limit = Number(queries?.limit ?? 10);
|
|
281
|
+
const allContents = Object.entries(endpointStore).map(([id, content]) => ({ id, ...content }));
|
|
282
|
+
const contents = allContents.slice(offset, offset + limit);
|
|
283
|
+
return {
|
|
284
|
+
data: {
|
|
285
|
+
contents,
|
|
286
|
+
totalCount: allContents.length,
|
|
287
|
+
offset,
|
|
288
|
+
limit
|
|
289
|
+
},
|
|
290
|
+
requestId: "mock-file-request"
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
async function runMockGet(endpoint, contentId, _queries) {
|
|
294
|
+
const store = await readMockStore();
|
|
295
|
+
const endpointStore = store.endpoints[endpoint] ?? {};
|
|
296
|
+
const hit = endpointStore[contentId];
|
|
297
|
+
if (!hit) {
|
|
298
|
+
throw fromHttpStatus(404, "mock content not found", {
|
|
299
|
+
endpoint,
|
|
300
|
+
contentId
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
data: {
|
|
305
|
+
id: contentId,
|
|
306
|
+
...hit
|
|
307
|
+
},
|
|
308
|
+
requestId: "mock-file-request"
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
async function runMockCreate(endpoint, content) {
|
|
312
|
+
const store = await readMockStore();
|
|
313
|
+
if (!store.endpoints[endpoint]) {
|
|
314
|
+
store.endpoints[endpoint] = {};
|
|
315
|
+
}
|
|
316
|
+
const id = `mock-created-${store.nextId}`;
|
|
317
|
+
store.nextId += 1;
|
|
318
|
+
store.endpoints[endpoint][id] = { ...content };
|
|
319
|
+
await writeMockStore(store);
|
|
320
|
+
return {
|
|
321
|
+
data: {
|
|
322
|
+
id,
|
|
323
|
+
...content
|
|
324
|
+
},
|
|
325
|
+
requestId: "mock-file-request"
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
async function runMockUpdate(endpoint, contentId, content) {
|
|
329
|
+
const store = await readMockStore();
|
|
330
|
+
const endpointStore = store.endpoints[endpoint] ?? {};
|
|
331
|
+
if (!endpointStore[contentId]) {
|
|
332
|
+
throw fromHttpStatus(404, "mock content not found", {
|
|
333
|
+
endpoint,
|
|
334
|
+
contentId
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
endpointStore[contentId] = {
|
|
338
|
+
...endpointStore[contentId],
|
|
339
|
+
...content
|
|
340
|
+
};
|
|
341
|
+
store.endpoints[endpoint] = endpointStore;
|
|
342
|
+
await writeMockStore(store);
|
|
343
|
+
return {
|
|
344
|
+
data: {
|
|
345
|
+
id: contentId
|
|
346
|
+
},
|
|
347
|
+
requestId: "mock-file-request"
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
async function runMockDelete(endpoint, contentId) {
|
|
351
|
+
const store = await readMockStore();
|
|
352
|
+
const endpointStore = store.endpoints[endpoint] ?? {};
|
|
353
|
+
if (!endpointStore[contentId]) {
|
|
354
|
+
throw fromHttpStatus(404, "mock content not found", {
|
|
355
|
+
endpoint,
|
|
356
|
+
contentId
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
delete endpointStore[contentId];
|
|
360
|
+
store.endpoints[endpoint] = endpointStore;
|
|
361
|
+
await writeMockStore(store);
|
|
362
|
+
return {
|
|
363
|
+
data: {
|
|
364
|
+
id: contentId,
|
|
365
|
+
deleted: true
|
|
366
|
+
},
|
|
367
|
+
requestId: "mock-file-request"
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
async function readMockStore() {
|
|
371
|
+
const path = getMockFilePath();
|
|
372
|
+
try {
|
|
373
|
+
const raw = await readFile(path, "utf8");
|
|
374
|
+
const parsed = JSON.parse(raw);
|
|
375
|
+
return {
|
|
376
|
+
nextId: typeof parsed.nextId === "number" ? parsed.nextId : 1,
|
|
377
|
+
endpoints: typeof parsed.endpoints === "object" && parsed.endpoints !== null ? parsed.endpoints : {}
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
return {
|
|
382
|
+
nextId: 1,
|
|
383
|
+
endpoints: {}
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
async function writeMockStore(store) {
|
|
388
|
+
const path = getMockFilePath();
|
|
389
|
+
await writeFile(path, JSON.stringify(store, null, 2), "utf8");
|
|
390
|
+
}
|
|
391
|
+
function getMockFilePath() {
|
|
392
|
+
if (!CONTENT_MOCK_FILE) {
|
|
393
|
+
throw new Error("MICROCMS_CONTENT_MOCK_FILE is not set");
|
|
394
|
+
}
|
|
395
|
+
return CONTENT_MOCK_FILE;
|
|
396
|
+
}
|
|
397
|
+
function guessMediaContentType(path) {
|
|
398
|
+
switch (extname(path).toLowerCase()) {
|
|
399
|
+
case ".png":
|
|
400
|
+
return "image/png";
|
|
401
|
+
case ".jpg":
|
|
402
|
+
case ".jpeg":
|
|
403
|
+
return "image/jpeg";
|
|
404
|
+
case ".gif":
|
|
405
|
+
return "image/gif";
|
|
406
|
+
case ".webp":
|
|
407
|
+
return "image/webp";
|
|
408
|
+
case ".svg":
|
|
409
|
+
return "image/svg+xml";
|
|
410
|
+
case ".avif":
|
|
411
|
+
return "image/avif";
|
|
412
|
+
default:
|
|
413
|
+
return "application/octet-stream";
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ProfileConfig = {
|
|
2
|
+
serviceDomain: string;
|
|
3
|
+
};
|
|
4
|
+
export type CliConfig = {
|
|
5
|
+
serviceDomain?: string;
|
|
6
|
+
defaultProfile?: string;
|
|
7
|
+
profiles?: Record<string, ProfileConfig>;
|
|
8
|
+
};
|
|
9
|
+
export declare function getConfigPath(): string;
|
|
10
|
+
export declare function readConfig(): Promise<CliConfig>;
|
|
11
|
+
export declare function writeConfig(config: CliConfig): Promise<void>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { CliError } from "./errors.js";
|
|
5
|
+
import { EXIT_CODE } from "./exit-codes.js";
|
|
6
|
+
export function getConfigPath() {
|
|
7
|
+
const injectedRoot = process.env.MICROCMS_CLI_CONFIG_HOME;
|
|
8
|
+
const xdgConfigHome = process.env.XDG_CONFIG_HOME;
|
|
9
|
+
const configHome = injectedRoot ?? xdgConfigHome ?? join(homedir(), ".config");
|
|
10
|
+
return join(configHome, "mcms-cli", "config.json");
|
|
11
|
+
}
|
|
12
|
+
export async function readConfig() {
|
|
13
|
+
const path = getConfigPath();
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = await readFile(path, "utf8");
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (isNoEntryError(error)) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
throw new CliError({
|
|
23
|
+
code: "INVALID_INPUT",
|
|
24
|
+
message: `Could not read config file: ${path}`,
|
|
25
|
+
exitCode: EXIT_CODE.INVALID_INPUT,
|
|
26
|
+
details: { path }
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = JSON.parse(raw);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new CliError({
|
|
35
|
+
code: "INVALID_INPUT",
|
|
36
|
+
message: `Config file is invalid JSON: ${path}`,
|
|
37
|
+
exitCode: EXIT_CODE.INVALID_INPUT,
|
|
38
|
+
details: { path }
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const profiles = parsed.profiles && typeof parsed.profiles === "object"
|
|
42
|
+
? Object.fromEntries(Object.entries(parsed.profiles)
|
|
43
|
+
.map(([name, value]) => {
|
|
44
|
+
if (typeof value !== "object" || value === null) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const entry = value;
|
|
48
|
+
if (typeof entry.serviceDomain !== "string" || entry.serviceDomain.length === 0) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return [name, { serviceDomain: entry.serviceDomain }];
|
|
52
|
+
})
|
|
53
|
+
.filter((entry) => entry !== null))
|
|
54
|
+
: undefined;
|
|
55
|
+
return {
|
|
56
|
+
serviceDomain: typeof parsed.serviceDomain === "string" ? parsed.serviceDomain : undefined,
|
|
57
|
+
defaultProfile: typeof parsed.defaultProfile === "string" ? parsed.defaultProfile : undefined,
|
|
58
|
+
profiles: profiles && Object.keys(profiles).length > 0 ? profiles : undefined
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export async function writeConfig(config) {
|
|
62
|
+
const path = getConfigPath();
|
|
63
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
64
|
+
await writeFile(path, JSON.stringify(config, null, 2), { encoding: "utf8", mode: 0o600 });
|
|
65
|
+
// Keep config as user-readable only on POSIX systems.
|
|
66
|
+
if (process.platform !== "win32") {
|
|
67
|
+
await chmod(path, 0o600);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function isNoEntryError(error) {
|
|
71
|
+
return typeof error === "object" && error !== null && error.code === "ENOENT";
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|