@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.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +184 -0
  3. package/README.md +185 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +143 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/api.d.ts +2 -0
  8. package/dist/commands/api.js +27 -0
  9. package/dist/commands/api.js.map +1 -0
  10. package/dist/commands/auth.d.ts +2 -0
  11. package/dist/commands/auth.js +238 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/completion.d.ts +2 -0
  14. package/dist/commands/completion.js +390 -0
  15. package/dist/commands/completion.js.map +1 -0
  16. package/dist/commands/config.d.ts +2 -0
  17. package/dist/commands/config.js +63 -0
  18. package/dist/commands/config.js.map +1 -0
  19. package/dist/commands/content.d.ts +2 -0
  20. package/dist/commands/content.js +191 -0
  21. package/dist/commands/content.js.map +1 -0
  22. package/dist/commands/media.d.ts +2 -0
  23. package/dist/commands/media.js +47 -0
  24. package/dist/commands/media.js.map +1 -0
  25. package/dist/commands/schema.d.ts +2 -0
  26. package/dist/commands/schema.js +71 -0
  27. package/dist/commands/schema.js.map +1 -0
  28. package/dist/commands/types.d.ts +2 -0
  29. package/dist/commands/types.js +85 -0
  30. package/dist/commands/types.js.map +1 -0
  31. package/dist/commands/utils.d.ts +8 -0
  32. package/dist/commands/utils.js +56 -0
  33. package/dist/commands/utils.js.map +1 -0
  34. package/dist/commands/validate.d.ts +2 -0
  35. package/dist/commands/validate.js +38 -0
  36. package/dist/commands/validate.js.map +1 -0
  37. package/dist/core/auth-store.d.ts +11 -0
  38. package/dist/core/auth-store.js +83 -0
  39. package/dist/core/auth-store.js.map +1 -0
  40. package/dist/core/client.d.ts +33 -0
  41. package/dist/core/client.js +416 -0
  42. package/dist/core/client.js.map +1 -0
  43. package/dist/core/config.d.ts +11 -0
  44. package/dist/core/config.js +73 -0
  45. package/dist/core/config.js.map +1 -0
  46. package/dist/core/context.d.ts +39 -0
  47. package/dist/core/context.js +382 -0
  48. package/dist/core/context.js.map +1 -0
  49. package/dist/core/errors.d.ts +26 -0
  50. package/dist/core/errors.js +167 -0
  51. package/dist/core/errors.js.map +1 -0
  52. package/dist/core/exit-codes.d.ts +10 -0
  53. package/dist/core/exit-codes.js +10 -0
  54. package/dist/core/exit-codes.js.map +1 -0
  55. package/dist/core/http.d.ts +24 -0
  56. package/dist/core/http.js +237 -0
  57. package/dist/core/http.js.map +1 -0
  58. package/dist/core/io.d.ts +2 -0
  59. package/dist/core/io.js +39 -0
  60. package/dist/core/io.js.map +1 -0
  61. package/dist/core/output.d.ts +4 -0
  62. package/dist/core/output.js +182 -0
  63. package/dist/core/output.js.map +1 -0
  64. package/dist/core/schema.d.ts +23 -0
  65. package/dist/core/schema.js +319 -0
  66. package/dist/core/schema.js.map +1 -0
  67. package/dist/validation/payload.d.ts +6 -0
  68. package/dist/validation/payload.js +204 -0
  69. package/dist/validation/payload.js.map +1 -0
  70. 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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"}