create-contentisland 0.2.0 → 0.4.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/dist/index.js +407 -345
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { cac as
|
|
2
|
-
import
|
|
1
|
+
import { cac as pe } from "cac";
|
|
2
|
+
import m from "prompts";
|
|
3
3
|
import l from "node:fs/promises";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import { existsSync as
|
|
7
|
-
import { createClient as
|
|
8
|
-
const
|
|
4
|
+
import r from "node:path";
|
|
5
|
+
import Q from "node:child_process";
|
|
6
|
+
import { existsSync as S } from "node:fs";
|
|
7
|
+
import { createClient as me } from "@content-island/api-client";
|
|
8
|
+
const R = ".content-island", ee = "config.json", G = ".gitignore", b = ".env", J = {
|
|
9
9
|
aa: "Afaraf",
|
|
10
10
|
ab: "Аҧсуа",
|
|
11
11
|
ae: "Avesta",
|
|
@@ -198,17 +198,17 @@ const P = ".content-island", U = "config.json", O = ".gitignore", A = ".env", M
|
|
|
198
198
|
bold: "\x1B[1m",
|
|
199
199
|
cyan: "\x1B[36m",
|
|
200
200
|
magenta: "\x1B[35m"
|
|
201
|
-
},
|
|
202
|
-
let
|
|
203
|
-
return e?.bold && (
|
|
201
|
+
}, j = (e) => {
|
|
202
|
+
let n = "";
|
|
203
|
+
return e?.bold && (n += p.bold), n;
|
|
204
204
|
}, g = {
|
|
205
|
-
green: (e,
|
|
206
|
-
red: (e,
|
|
207
|
-
yellow: (e,
|
|
205
|
+
green: (e, n) => `${p.green}${j(n)}${e}${p.reset}`,
|
|
206
|
+
red: (e, n) => `${p.red}${j(n)}${e}${p.reset}`,
|
|
207
|
+
yellow: (e, n) => `${p.yellow}${j(n)}${e}${p.reset}`,
|
|
208
208
|
bold: (e) => `${p.bold}${e}${p.reset}`,
|
|
209
|
-
cyan: (e,
|
|
210
|
-
magenta: (e,
|
|
211
|
-
},
|
|
209
|
+
cyan: (e, n) => `${p.cyan}${j(n)}${e}${p.reset}`,
|
|
210
|
+
magenta: (e, n) => `${p.magenta}${j(n)}${e}${p.reset}`
|
|
211
|
+
}, t = {
|
|
212
212
|
info: (e) => console.log(g.cyan("ℹ️ " + e)),
|
|
213
213
|
success: (e) => console.log(g.green("✅ " + e)),
|
|
214
214
|
warning: (e) => console.log(g.yellow("⚠️ " + e)),
|
|
@@ -233,222 +233,282 @@ const P = ".content-island", U = "config.json", O = ".gitignore", A = ".env", M
|
|
|
233
233
|
updating: (e) => console.log(g.green("🔄 " + e)),
|
|
234
234
|
run: (e) => console.log(g.green("🚀 " + e)),
|
|
235
235
|
command: (e) => console.log(" " + g.magenta(e, { bold: !0 }))
|
|
236
|
-
},
|
|
237
|
-
const e = process.cwd(),
|
|
236
|
+
}, D = () => r.join(process.cwd(), R), fe = async () => {
|
|
237
|
+
const e = process.cwd(), n = r.join(e, G), a = `${R}/`;
|
|
238
238
|
let o = "";
|
|
239
|
-
|
|
239
|
+
S(n) && (o = await l.readFile(n, "utf-8"), o.includes(a)) || (o = o + `${o.endsWith(`
|
|
240
240
|
`) ? "" : `
|
|
241
|
-
`}${
|
|
242
|
-
`, await l.writeFile(
|
|
243
|
-
},
|
|
244
|
-
const e =
|
|
241
|
+
`}${a}
|
|
242
|
+
`, await l.writeFile(n, o, "utf-8"), t.saved(`Added ${a} to ${G}`));
|
|
243
|
+
}, we = async () => {
|
|
244
|
+
const e = D();
|
|
245
245
|
try {
|
|
246
|
-
|
|
247
|
-
} catch (
|
|
248
|
-
|
|
246
|
+
S(e) || (await l.mkdir(e, { recursive: !0 }), t.created(`Created: ${R}/`)), await fe();
|
|
247
|
+
} catch (n) {
|
|
248
|
+
t.error(`Failed to create config directory: ${n.message}`);
|
|
249
249
|
}
|
|
250
|
-
},
|
|
251
|
-
const e = await
|
|
252
|
-
if (!
|
|
250
|
+
}, te = async () => r.join(D(), ee), M = async () => {
|
|
251
|
+
const e = await te();
|
|
252
|
+
if (!S(e))
|
|
253
253
|
return null;
|
|
254
254
|
try {
|
|
255
|
-
const
|
|
256
|
-
return JSON.parse(
|
|
257
|
-
} catch (
|
|
258
|
-
return
|
|
255
|
+
const n = await l.readFile(e, "utf-8");
|
|
256
|
+
return JSON.parse(n);
|
|
257
|
+
} catch (n) {
|
|
258
|
+
return t.warning(`Could not parse ${ee}: ${n.message}`), null;
|
|
259
259
|
}
|
|
260
|
-
},
|
|
261
|
-
let
|
|
260
|
+
}, T = async (e) => {
|
|
261
|
+
let n = {
|
|
262
262
|
...e
|
|
263
263
|
};
|
|
264
|
-
await
|
|
265
|
-
const
|
|
266
|
-
if (
|
|
267
|
-
const o = await
|
|
268
|
-
o && (
|
|
264
|
+
await we();
|
|
265
|
+
const a = await te();
|
|
266
|
+
if (S(a)) {
|
|
267
|
+
const o = await M();
|
|
268
|
+
o && (n = { ...o, ...e });
|
|
269
269
|
}
|
|
270
270
|
try {
|
|
271
|
-
const o = JSON.stringify(
|
|
272
|
-
await l.writeFile(
|
|
271
|
+
const o = JSON.stringify(n, null, 2);
|
|
272
|
+
await l.writeFile(a, o, "utf-8"), t.saved(`Saved configuration to ${a}`);
|
|
273
273
|
} catch (o) {
|
|
274
|
-
|
|
274
|
+
t.error(`Failed to save configuration: ${o.message}`);
|
|
275
275
|
}
|
|
276
|
-
},
|
|
277
|
-
let s = 0, i =
|
|
278
|
-
const
|
|
279
|
-
for (let
|
|
280
|
-
const d = e[
|
|
276
|
+
}, ye = (e, n, a, o) => {
|
|
277
|
+
let s = 0, i = n, c = !1, f = "", u = !1;
|
|
278
|
+
const C = ['"', "'", "`"].includes(a);
|
|
279
|
+
for (let w = n; w < e.length; w++) {
|
|
280
|
+
const d = e[w];
|
|
281
281
|
if (u) {
|
|
282
282
|
u = !1;
|
|
283
283
|
continue;
|
|
284
284
|
}
|
|
285
|
-
if (d === "\\" &&
|
|
285
|
+
if (d === "\\" && c) {
|
|
286
286
|
u = !0;
|
|
287
287
|
continue;
|
|
288
288
|
}
|
|
289
|
-
if (
|
|
290
|
-
if (d ===
|
|
289
|
+
if (C) {
|
|
290
|
+
if (d === a && !c) {
|
|
291
291
|
if (s++, s === 1)
|
|
292
292
|
continue;
|
|
293
293
|
if (s === 2) {
|
|
294
|
-
i =
|
|
294
|
+
i = w + 1;
|
|
295
295
|
break;
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
|
-
} else if (!
|
|
299
|
-
|
|
300
|
-
else if (
|
|
301
|
-
|
|
302
|
-
else if (!
|
|
303
|
-
if (d ===
|
|
298
|
+
} else if (!c && (d === '"' || d === "'" || d === "`"))
|
|
299
|
+
c = !0, f = d;
|
|
300
|
+
else if (c && d === f)
|
|
301
|
+
c = !1;
|
|
302
|
+
else if (!c) {
|
|
303
|
+
if (d === a)
|
|
304
304
|
s++;
|
|
305
305
|
else if (d === o && (s--, s === 0)) {
|
|
306
|
-
i =
|
|
306
|
+
i = w + 1;
|
|
307
307
|
break;
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
}
|
|
311
311
|
return i;
|
|
312
|
-
},
|
|
313
|
-
const { filePath:
|
|
314
|
-
let
|
|
315
|
-
o === "[" && (
|
|
316
|
-
const
|
|
312
|
+
}, P = async (e) => {
|
|
313
|
+
const { filePath: n, property: a, startSymbol: o, endSymbol: s } = e, i = await l.readFile(n, "utf-8");
|
|
314
|
+
let c = o;
|
|
315
|
+
o === "[" && (c = "\\["), o === "{" && (c = "\\{"), o === "(" && (c = "\\(");
|
|
316
|
+
const f = new RegExp(`${a}\\s*:\\s*(${c})`), u = i.match(f);
|
|
317
317
|
if (!u)
|
|
318
318
|
return null;
|
|
319
|
-
const
|
|
320
|
-
return i.substring(
|
|
321
|
-
},
|
|
319
|
+
const C = i.indexOf(u[0]) + u[0].length - 1, w = ye(i, C, o, s);
|
|
320
|
+
return i.substring(C, w);
|
|
321
|
+
}, he = (e) => JSON.parse(
|
|
322
322
|
e.replace(/'/g, '"').replace(/(\w+):/g, '"$1":').replace(/,\s*}/g, "}").replace(/,\s*]/g, "]")
|
|
323
|
-
),
|
|
324
|
-
let s = await
|
|
325
|
-
if (s || (s = await
|
|
323
|
+
), ne = (e) => e.replace(/"/g, "'").replace(/'(\w+)':/g, "$1:"), Ee = async (e, n, a, o) => {
|
|
324
|
+
let s = await P(a);
|
|
325
|
+
if (s || (s = await P(o)), !s)
|
|
326
326
|
throw new Error(
|
|
327
|
-
`Could not find property '${
|
|
327
|
+
`Could not find property '${a.property}' or fallback property '${o.property}' in file ${a.filePath}`
|
|
328
328
|
);
|
|
329
|
-
const i =
|
|
330
|
-
return (await l.readFile(
|
|
329
|
+
const i = ne(JSON.stringify(n, null, 2));
|
|
330
|
+
return (await l.readFile(a.filePath, "utf-8")).replace(s, (f) => `${f},
|
|
331
331
|
${e}: ${i}`);
|
|
332
|
-
},
|
|
333
|
-
const
|
|
332
|
+
}, ke = ".git", A = (e, n) => {
|
|
333
|
+
const a = Q.spawn("git", ["clone", "--depth=1", e, n], { stdio: "inherit" });
|
|
334
334
|
return new Promise((o, s) => {
|
|
335
|
-
|
|
336
|
-
l.rm(
|
|
335
|
+
a.on("close", (i) => {
|
|
336
|
+
l.rm(r.join(n, ke), { recursive: !0, force: !0 }).finally(() => {
|
|
337
337
|
i === 0 ? o() : s(new Error("Failed to clone repository. Please make sure the target folder is empty and try again."));
|
|
338
338
|
});
|
|
339
339
|
});
|
|
340
340
|
});
|
|
341
|
-
},
|
|
342
|
-
const
|
|
341
|
+
}, F = (e) => {
|
|
342
|
+
const n = Q.spawn("npm install", {
|
|
343
343
|
cwd: e,
|
|
344
344
|
stdio: "inherit",
|
|
345
345
|
shell: !0
|
|
346
346
|
});
|
|
347
|
-
return new Promise((
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}),
|
|
351
|
-
s === 0 ||
|
|
347
|
+
return new Promise((a, o) => {
|
|
348
|
+
n.on("error", (s) => {
|
|
349
|
+
t.error(`Failed to install dependencies: ${s.message}`), t.error("Please try running 'npm install' manually."), o(s);
|
|
350
|
+
}), n.on("close", (s) => {
|
|
351
|
+
s === 0 || t.error("Failed to install dependencies. Please try running 'npm install' manually."), a();
|
|
352
352
|
});
|
|
353
353
|
});
|
|
354
|
-
},
|
|
355
|
-
const
|
|
354
|
+
}, L = async (e) => {
|
|
355
|
+
const n = r.join(e, "package.json"), a = await l.readFile(n, "utf-8"), o = JSON.parse(a);
|
|
356
356
|
if (o.scripts) {
|
|
357
357
|
const { predev: s, ...i } = o.scripts;
|
|
358
358
|
o.scripts = i;
|
|
359
359
|
}
|
|
360
|
-
await l.writeFile(
|
|
361
|
-
},
|
|
362
|
-
const
|
|
363
|
-
await l.writeFile(o,
|
|
364
|
-
},
|
|
365
|
-
let
|
|
366
|
-
const
|
|
367
|
-
id: "
|
|
360
|
+
await l.writeFile(n, JSON.stringify(o, null, 2), "utf-8");
|
|
361
|
+
}, x = async (e, n) => {
|
|
362
|
+
const a = 'CONTENT_ISLAND_ACCESS_TOKEN=YOUR_TOKEN_HERE # You can find the access token in your project’s "General tab" (https://docs.contentisland.net/ui/project/general/)', o = r.join(e, n);
|
|
363
|
+
await l.writeFile(o, a, "utf-8");
|
|
364
|
+
}, Se = "https://github.com/content-island/template-new-bussines-landing-one-page.git", Ce = "create-dev-env.js", V = ".env-sample";
|
|
365
|
+
let y = process.cwd();
|
|
366
|
+
const ve = () => ({
|
|
367
|
+
id: "business-landing",
|
|
368
368
|
hasToSaveConfig: !1,
|
|
369
|
-
getEnvFilePath: () =>
|
|
369
|
+
getEnvFilePath: () => r.join(y, b),
|
|
370
370
|
onInit: async () => {
|
|
371
|
-
const { projectPath: e } = await
|
|
371
|
+
const { projectPath: e } = await m({
|
|
372
372
|
type: "text",
|
|
373
373
|
name: "projectPath",
|
|
374
|
-
message: "Where should we create your new
|
|
374
|
+
message: "Where should we create your new business landing project?",
|
|
375
375
|
initial: "./"
|
|
376
376
|
});
|
|
377
|
-
e && (
|
|
378
|
-
const { installDeps:
|
|
377
|
+
e && (y = r.join(process.cwd(), e), t.loading("Cloning Business Landing template repository..."), await A(Se, y), t.success("Business Landing template repository cloned."));
|
|
378
|
+
const { installDeps: n } = await m({
|
|
379
379
|
type: "confirm",
|
|
380
380
|
name: "installDeps",
|
|
381
381
|
message: "Do you want to install the dependencies now?",
|
|
382
382
|
initial: !0
|
|
383
383
|
});
|
|
384
|
-
|
|
384
|
+
n && (t.loading("Installing dependencies..."), await F(y), t.success("Dependencies installed."));
|
|
385
385
|
},
|
|
386
386
|
syncProject: async () => {
|
|
387
|
-
|
|
387
|
+
t.info("Syncing Business Landing project..."), await l.unlink(r.join(y, Ce)), await l.unlink(r.join(y, V)), await x(y, V), await L(y), t.success("Business Landing project synchronized.");
|
|
388
388
|
},
|
|
389
389
|
onFinish: async () => {
|
|
390
|
-
|
|
391
|
-
const e =
|
|
392
|
-
e &&
|
|
390
|
+
t.run("Now you can start your project by running:"), t.newLine();
|
|
391
|
+
const e = r.relative(process.cwd(), y);
|
|
392
|
+
e && t.command(`cd ${e}`), t.command("npm run dev"), t.newLine();
|
|
393
393
|
}
|
|
394
|
-
}),
|
|
394
|
+
}), je = "https://github.com/content-island/template-minimal-astro.git", Te = "create-dev-env.js", K = ".env-sample";
|
|
395
395
|
let h = process.cwd();
|
|
396
|
-
const
|
|
396
|
+
const be = () => ({
|
|
397
|
+
id: "minimal-astro",
|
|
398
|
+
hasToSaveConfig: !1,
|
|
399
|
+
getEnvFilePath: () => r.join(h, b),
|
|
400
|
+
onInit: async () => {
|
|
401
|
+
const { projectPath: e } = await m({
|
|
402
|
+
type: "text",
|
|
403
|
+
name: "projectPath",
|
|
404
|
+
message: "Where should we create your new minimal astro project?",
|
|
405
|
+
initial: "./"
|
|
406
|
+
});
|
|
407
|
+
e && (h = r.join(process.cwd(), e), t.loading("Cloning Minimal Astro template repository..."), await A(je, h), t.success("Minimal Astro template repository cloned."));
|
|
408
|
+
const { installDeps: n } = await m({
|
|
409
|
+
type: "confirm",
|
|
410
|
+
name: "installDeps",
|
|
411
|
+
message: "Do you want to install the dependencies now?",
|
|
412
|
+
initial: !0
|
|
413
|
+
});
|
|
414
|
+
n && (t.loading("Installing dependencies..."), await F(h), t.success("Dependencies installed."));
|
|
415
|
+
},
|
|
416
|
+
syncProject: async () => {
|
|
417
|
+
t.info("Syncing Minimal Astro project..."), await l.unlink(r.join(h, Te)), await l.unlink(r.join(h, K)), await x(h, K), await L(h), t.success("Minimal Astro project synchronized.");
|
|
418
|
+
},
|
|
419
|
+
onFinish: async () => {
|
|
420
|
+
t.run("Now you can start your project by running:"), t.newLine();
|
|
421
|
+
const e = r.relative(process.cwd(), h);
|
|
422
|
+
e && t.command(`cd ${e}`), t.command("npm run dev"), t.newLine();
|
|
423
|
+
}
|
|
424
|
+
}), Ie = "https://github.com/content-island/template-personal-static-site.git", $e = "create-dev-env.js", U = ".env-sample";
|
|
425
|
+
let E = process.cwd();
|
|
426
|
+
const Pe = () => ({
|
|
397
427
|
id: "personal-static-site",
|
|
398
428
|
hasToSaveConfig: !1,
|
|
399
|
-
getEnvFilePath: () =>
|
|
429
|
+
getEnvFilePath: () => r.join(E, b),
|
|
400
430
|
onInit: async () => {
|
|
401
|
-
const { projectPath: e } = await
|
|
431
|
+
const { projectPath: e } = await m({
|
|
402
432
|
type: "text",
|
|
403
433
|
name: "projectPath",
|
|
404
434
|
message: "Where should we create your new personal static site project?",
|
|
405
435
|
initial: "./"
|
|
406
436
|
});
|
|
407
|
-
e && (
|
|
408
|
-
const { installDeps:
|
|
437
|
+
e && (E = r.join(process.cwd(), e), t.loading("Cloning Personal Static Site template repository..."), await A(Ie, E), t.success("Personal Static Site template repository cloned."));
|
|
438
|
+
const { installDeps: n } = await m({
|
|
439
|
+
type: "confirm",
|
|
440
|
+
name: "installDeps",
|
|
441
|
+
message: "Do you want to install the dependencies now?",
|
|
442
|
+
initial: !0
|
|
443
|
+
});
|
|
444
|
+
n && (t.loading("Installing dependencies..."), await F(E), t.success("Dependencies installed."));
|
|
445
|
+
},
|
|
446
|
+
syncProject: async () => {
|
|
447
|
+
t.info("Syncing Personal Static Site project..."), await l.unlink(r.join(E, $e)), await l.unlink(r.join(E, U)), await x(E, U), await L(E), t.success("Personal Static Site project synchronized.");
|
|
448
|
+
},
|
|
449
|
+
onFinish: async () => {
|
|
450
|
+
t.run("Now you can start your project by running:"), t.newLine();
|
|
451
|
+
const e = r.relative(process.cwd(), E);
|
|
452
|
+
e && t.command(`cd ${e}`), t.command("npm run dev"), t.newLine();
|
|
453
|
+
}
|
|
454
|
+
}), Ae = "https://github.com/content-island/template-restaurant.git", Fe = "create-dev-env.js", Y = ".env-sample";
|
|
455
|
+
let k = process.cwd();
|
|
456
|
+
const Le = () => ({
|
|
457
|
+
id: "restaurant-site",
|
|
458
|
+
hasToSaveConfig: !1,
|
|
459
|
+
getEnvFilePath: () => r.join(k, b),
|
|
460
|
+
onInit: async () => {
|
|
461
|
+
const { projectPath: e } = await m({
|
|
462
|
+
type: "text",
|
|
463
|
+
name: "projectPath",
|
|
464
|
+
message: "Where should we create your new restaurant site project?",
|
|
465
|
+
initial: "./"
|
|
466
|
+
});
|
|
467
|
+
e && (k = r.join(process.cwd(), e), t.loading("Cloning Restaurant Site template repository..."), await A(Ae, k), t.success("Restaurant Site template repository cloned."));
|
|
468
|
+
const { installDeps: n } = await m({
|
|
409
469
|
type: "confirm",
|
|
410
470
|
name: "installDeps",
|
|
411
471
|
message: "Do you want to install the dependencies now?",
|
|
412
472
|
initial: !0
|
|
413
473
|
});
|
|
414
|
-
|
|
474
|
+
n && (t.loading("Installing dependencies..."), await F(k), t.success("Dependencies installed."));
|
|
415
475
|
},
|
|
416
476
|
syncProject: async () => {
|
|
417
|
-
|
|
477
|
+
t.info("Syncing Restaurant Site project..."), await l.unlink(r.join(k, Fe)), await l.unlink(r.join(k, Y)), await x(k, Y), await L(k), t.success("Restaurant Site project synchronized.");
|
|
418
478
|
},
|
|
419
479
|
onFinish: async () => {
|
|
420
|
-
|
|
421
|
-
const e =
|
|
422
|
-
e &&
|
|
480
|
+
t.run("Now you can start your project by running:"), t.newLine();
|
|
481
|
+
const e = r.relative(process.cwd(), k);
|
|
482
|
+
e && t.command(`cd ${e}`), t.command("npm run dev"), t.newLine();
|
|
423
483
|
}
|
|
424
|
-
}),
|
|
484
|
+
}), N = (e, n) => Array.isArray(e) ? e.map(n) : [], xe = (e, n) => ({
|
|
425
485
|
id: e.id,
|
|
426
486
|
language: e.language,
|
|
427
487
|
name: e.name,
|
|
428
488
|
label: e.label,
|
|
429
|
-
pages:
|
|
430
|
-
}),
|
|
489
|
+
pages: N(e.pages, (a) => n.find((o) => o.id === a))
|
|
490
|
+
}), Ne = (e, n) => ({
|
|
431
491
|
id: e.id,
|
|
432
492
|
language: e.language,
|
|
433
493
|
index: e.index,
|
|
434
|
-
folders:
|
|
494
|
+
folders: N(e.folders, (a) => xe(a, n))
|
|
435
495
|
});
|
|
436
|
-
let
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
},
|
|
440
|
-
if (!
|
|
496
|
+
let _ = null;
|
|
497
|
+
const _e = (e) => {
|
|
498
|
+
_ = me({ accessToken: e });
|
|
499
|
+
}, O = () => {
|
|
500
|
+
if (!_)
|
|
441
501
|
throw new Error("API client not initialized. Call initializeClient first.");
|
|
442
|
-
return
|
|
443
|
-
},
|
|
444
|
-
const
|
|
502
|
+
return _;
|
|
503
|
+
}, Re = async () => await O().getProject(), W = async (e) => {
|
|
504
|
+
const n = O(), a = await n.getContent({
|
|
445
505
|
contentType: "Root",
|
|
446
506
|
includeRelatedContent: !0,
|
|
447
507
|
language: e
|
|
448
508
|
});
|
|
449
|
-
if (!
|
|
509
|
+
if (!a)
|
|
450
510
|
throw new Error(`Root content not found for language: ${e}`);
|
|
451
|
-
const o =
|
|
511
|
+
const o = a.folders?.flatMap((i) => i.pages) || [], s = await n.getContentList({
|
|
452
512
|
contentType: "Page",
|
|
453
513
|
id: {
|
|
454
514
|
in: o
|
|
@@ -457,161 +517,161 @@ const Ie = (e) => {
|
|
|
457
517
|
});
|
|
458
518
|
if (!s)
|
|
459
519
|
throw new Error(`Pages not found for IDs: ${o.join(", ")}`);
|
|
460
|
-
return
|
|
461
|
-
},
|
|
520
|
+
return Ne(a, s);
|
|
521
|
+
}, De = async () => {
|
|
462
522
|
try {
|
|
463
|
-
return await
|
|
523
|
+
return await O().getContent({
|
|
464
524
|
contentType: "Meta"
|
|
465
525
|
});
|
|
466
526
|
} catch (e) {
|
|
467
|
-
e.message.includes("401") ?
|
|
527
|
+
e.message.includes("401") ? t.error(
|
|
468
528
|
"The Content Island API token is missing or malformed. Verify that you've copied the complete token and that you have sufficient permissions."
|
|
469
|
-
) :
|
|
529
|
+
) : t.error("The requested template is not of type StarLight, so the meta field could not be found."), process.exit(1);
|
|
470
530
|
}
|
|
471
|
-
},
|
|
472
|
-
const e = [],
|
|
473
|
-
|
|
474
|
-
const
|
|
475
|
-
return
|
|
531
|
+
}, ae = "astro.config.mjs", z = () => r.join(process.cwd(), "src", "content", "docs"), B = () => r.join(process.cwd(), ae), Me = () => {
|
|
532
|
+
const e = [], n = B();
|
|
533
|
+
S(n) || e.push(ae);
|
|
534
|
+
const a = z();
|
|
535
|
+
return S(a) || e.push("src/content/docs directory"), {
|
|
476
536
|
valid: e.length === 0,
|
|
477
537
|
missingItems: e
|
|
478
538
|
};
|
|
479
|
-
},
|
|
480
|
-
const e =
|
|
481
|
-
if (!
|
|
482
|
-
|
|
539
|
+
}, Oe = async () => {
|
|
540
|
+
const e = z();
|
|
541
|
+
if (!S(e)) {
|
|
542
|
+
t.info("Content docs directory not found, creating it..."), await l.mkdir(e, { recursive: !0 });
|
|
483
543
|
return;
|
|
484
544
|
}
|
|
485
|
-
const
|
|
486
|
-
for (const
|
|
487
|
-
const o =
|
|
545
|
+
const n = await l.readdir(e);
|
|
546
|
+
for (const a of n) {
|
|
547
|
+
const o = r.join(e, a);
|
|
488
548
|
await l.rm(o, { recursive: !0, force: !0 });
|
|
489
549
|
}
|
|
490
|
-
},
|
|
550
|
+
}, v = {
|
|
491
551
|
sidebar: { start: "[", end: "]" },
|
|
492
552
|
locales: { start: "{", end: "}" },
|
|
493
553
|
title: { start: "'", end: "'" }
|
|
494
|
-
},
|
|
495
|
-
const
|
|
496
|
-
for (const s of
|
|
497
|
-
const i = e.findIndex((
|
|
554
|
+
}, oe = (e, n) => {
|
|
555
|
+
const a = [], o = [];
|
|
556
|
+
for (const s of n) {
|
|
557
|
+
const i = e.findIndex((c) => c.label === s.label);
|
|
498
558
|
if (i >= 0) {
|
|
499
|
-
const
|
|
500
|
-
|
|
559
|
+
const c = s.items && e[i].items ? oe(e[i].items || [], s.items) : s.items;
|
|
560
|
+
a[i] = {
|
|
501
561
|
...e[i],
|
|
502
562
|
...s,
|
|
503
|
-
items:
|
|
563
|
+
items: c
|
|
504
564
|
};
|
|
505
565
|
} else
|
|
506
566
|
o.push(s);
|
|
507
567
|
}
|
|
508
|
-
return
|
|
509
|
-
const
|
|
510
|
-
return
|
|
568
|
+
return a.push(...o), a.sort((s, i) => {
|
|
569
|
+
const c = n.findIndex((u) => u.label === s.label), f = n.findIndex((u) => u.label === i.label);
|
|
570
|
+
return c - f;
|
|
511
571
|
});
|
|
512
|
-
},
|
|
513
|
-
const
|
|
514
|
-
root: { lang: e, label:
|
|
572
|
+
}, ze = (e, n) => {
|
|
573
|
+
const a = {
|
|
574
|
+
root: { lang: e, label: J[e] }
|
|
515
575
|
};
|
|
516
|
-
return Array.isArray(
|
|
576
|
+
return Array.isArray(n) ? n.reduce(
|
|
517
577
|
(o, s) => ({
|
|
518
578
|
...o,
|
|
519
|
-
[s]: { lang: s, label:
|
|
579
|
+
[s]: { lang: s, label: J[s] }
|
|
520
580
|
}),
|
|
521
|
-
|
|
522
|
-
) :
|
|
523
|
-
},
|
|
524
|
-
const o =
|
|
581
|
+
a
|
|
582
|
+
) : a;
|
|
583
|
+
}, q = async (e, n, a) => {
|
|
584
|
+
const o = B(), s = await P({
|
|
525
585
|
filePath: o,
|
|
526
|
-
property:
|
|
527
|
-
startSymbol:
|
|
528
|
-
endSymbol:
|
|
586
|
+
property: n,
|
|
587
|
+
startSymbol: v[n]?.start,
|
|
588
|
+
endSymbol: v[n]?.end
|
|
529
589
|
});
|
|
530
590
|
let i;
|
|
531
591
|
if (s) {
|
|
532
|
-
const
|
|
533
|
-
i = (await l.readFile(o, "utf-8")).replace(s,
|
|
592
|
+
const c = ne(JSON.stringify(e, null, 2));
|
|
593
|
+
i = (await l.readFile(o, "utf-8")).replace(s, c);
|
|
534
594
|
} else
|
|
535
|
-
i = await
|
|
536
|
-
|
|
595
|
+
i = await Ee(
|
|
596
|
+
n,
|
|
537
597
|
e,
|
|
538
598
|
{
|
|
539
599
|
filePath: o,
|
|
540
|
-
property:
|
|
541
|
-
startSymbol:
|
|
542
|
-
endSymbol:
|
|
600
|
+
property: a,
|
|
601
|
+
startSymbol: v[a]?.start,
|
|
602
|
+
endSymbol: v[a]?.end
|
|
543
603
|
},
|
|
544
604
|
{
|
|
545
605
|
filePath: o,
|
|
546
606
|
property: "title",
|
|
547
|
-
startSymbol:
|
|
548
|
-
endSymbol:
|
|
607
|
+
startSymbol: v.title.start,
|
|
608
|
+
endSymbol: v.title.end
|
|
549
609
|
}
|
|
550
610
|
);
|
|
551
611
|
await l.writeFile(o, i, "utf-8");
|
|
552
|
-
},
|
|
612
|
+
}, Be = async (e, n, a) => {
|
|
553
613
|
try {
|
|
554
|
-
let o = await
|
|
555
|
-
filePath:
|
|
614
|
+
let o = await P({
|
|
615
|
+
filePath: B(),
|
|
556
616
|
property: "sidebar",
|
|
557
|
-
startSymbol:
|
|
558
|
-
endSymbol:
|
|
617
|
+
startSymbol: v.sidebar.start,
|
|
618
|
+
endSymbol: v.sidebar.end
|
|
559
619
|
}), s = [];
|
|
560
620
|
try {
|
|
561
|
-
s = o ?
|
|
621
|
+
s = o ? he(o) : null;
|
|
562
622
|
} catch {
|
|
563
|
-
|
|
623
|
+
t.warning("Could not parse existing sidebar in astro.config.mjs. A new sidebar will be created."), s = [];
|
|
564
624
|
}
|
|
565
|
-
s || (
|
|
566
|
-
const i =
|
|
567
|
-
await
|
|
568
|
-
const
|
|
569
|
-
await
|
|
625
|
+
s || (t.warning("No existing sidebar found in astro.config.mjs. A new sidebar will be created."), s = []);
|
|
626
|
+
const i = oe(s, e);
|
|
627
|
+
await q(i, "sidebar", "locales");
|
|
628
|
+
const c = ze(n, a);
|
|
629
|
+
await q(c, "locales", "sidebar");
|
|
570
630
|
} catch (o) {
|
|
571
|
-
|
|
631
|
+
t.error(`Error reading astro.config.mjs: ${o.message}`), process.exit(1);
|
|
572
632
|
}
|
|
573
|
-
},
|
|
574
|
-
function
|
|
575
|
-
if (
|
|
633
|
+
}, Ge = (e) => /^---\s*\n([\s\S]*?)\n---\s*\n/.test(e), Je = (e) => r.parse(e).name.replace(/[-_]/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").split(" ").filter((o) => o.length > 0).map((o) => o.charAt(0).toUpperCase() + o.slice(1).toLowerCase()).join(" ");
|
|
634
|
+
function Ve(e, n, a) {
|
|
635
|
+
if (Ge(e))
|
|
576
636
|
return e;
|
|
577
|
-
const o =
|
|
637
|
+
const o = Je(n), s = `---
|
|
578
638
|
title: "${o}"
|
|
579
639
|
---
|
|
580
640
|
|
|
581
641
|
`;
|
|
582
|
-
return
|
|
642
|
+
return t.warning(`Missing frontmatter in ${a}`), t.info(`Added default title: "${o}"`), t.warning("Please update the content in Content Island 🏝️ to include proper frontmatter"), t.newLine(), s + e;
|
|
583
643
|
}
|
|
584
|
-
const
|
|
585
|
-
const
|
|
586
|
-
|
|
587
|
-
},
|
|
644
|
+
const $ = async (e, n) => {
|
|
645
|
+
const a = z(), o = r.join(a, e), s = Ve(n, e, r.relative(process.cwd(), o)), i = r.dirname(o);
|
|
646
|
+
S(i) || await l.mkdir(i, { recursive: !0 }), await l.writeFile(o, s, "utf-8");
|
|
647
|
+
}, Ke = async (e, n) => {
|
|
588
648
|
try {
|
|
589
|
-
await
|
|
590
|
-
for (const
|
|
591
|
-
for (const o of
|
|
592
|
-
await
|
|
593
|
-
for (const
|
|
594
|
-
await
|
|
595
|
-
for (const o of
|
|
649
|
+
await $(e.index.filename, e.index.content);
|
|
650
|
+
for (const a of e.folders)
|
|
651
|
+
for (const o of a.pages)
|
|
652
|
+
await $(r.join(a.name, o.filename), o.content);
|
|
653
|
+
for (const a of n) {
|
|
654
|
+
await $(r.join(a.language, a.index.filename), a.index.content);
|
|
655
|
+
for (const o of a.folders)
|
|
596
656
|
for (const s of o.pages)
|
|
597
|
-
await
|
|
657
|
+
await $(r.join(a.language, o.name, s.filename), s.content);
|
|
598
658
|
}
|
|
599
|
-
} catch (
|
|
600
|
-
|
|
659
|
+
} catch (a) {
|
|
660
|
+
t.error(`Error updating docs content: ${a.message}`), process.exit(1);
|
|
601
661
|
}
|
|
602
|
-
},
|
|
662
|
+
}, Ue = async (e, n) => {
|
|
603
663
|
if (e.length === 1) {
|
|
604
664
|
const s = e[0];
|
|
605
|
-
return
|
|
665
|
+
return t.success(`Single language found: ${s}. Continuing...`), await T({ languageCode: s }), s;
|
|
606
666
|
}
|
|
607
|
-
const
|
|
608
|
-
if (
|
|
609
|
-
if (e.includes(
|
|
610
|
-
return
|
|
611
|
-
|
|
667
|
+
const a = (await M())?.languageCode;
|
|
668
|
+
if (a && !n) {
|
|
669
|
+
if (e.includes(a))
|
|
670
|
+
return t.info(`Using saved default language: ${a}`), a;
|
|
671
|
+
t.warning(`Saved language '${a}' not found in project languages`), t.step("Will ask for new default language and save it");
|
|
612
672
|
}
|
|
613
|
-
|
|
614
|
-
const o = await
|
|
673
|
+
t.step("Multiple languages found. Please select the default language:");
|
|
674
|
+
const o = await m({
|
|
615
675
|
type: "select",
|
|
616
676
|
name: "language",
|
|
617
677
|
message: "Select the default language:",
|
|
@@ -621,9 +681,9 @@ const I = async (e, t) => {
|
|
|
621
681
|
})),
|
|
622
682
|
initial: 0
|
|
623
683
|
});
|
|
624
|
-
return o.language || (
|
|
625
|
-
},
|
|
626
|
-
|
|
684
|
+
return o.language || (t.error("Language selection is required to continue."), process.exit(1)), a !== o.language && (await T({ languageCode: o.language }), t.config(`Saving default language '${o.language}' to config`)), o.language;
|
|
685
|
+
}, Ye = () => {
|
|
686
|
+
t.detected(`
|
|
627
687
|
⭐ ✨ STARLIGHT PROJECT DETECTED ✨ ⭐
|
|
628
688
|
|
|
629
689
|
⭐ ✨ ⭐ ✨
|
|
@@ -633,197 +693,199 @@ const I = async (e, t) => {
|
|
|
633
693
|
⭐ ✨ ⭐ ✨ ⭐
|
|
634
694
|
✨ ⭐ ✨ ⭐ ✨
|
|
635
695
|
⭐ ✨ ⭐ ✨
|
|
636
|
-
`),
|
|
637
|
-
},
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
}),
|
|
641
|
-
},
|
|
642
|
-
const
|
|
643
|
-
(
|
|
696
|
+
`), t.success("All good! Starlight ⭐ project detected successfully."), t.loading("Launching process..."), t.newLine();
|
|
697
|
+
}, We = (e) => {
|
|
698
|
+
t.newLine(), t.error("Starlight ⭐ project not found!"), t.newLine(), t.error("Missing required items:"), e.forEach((n) => {
|
|
699
|
+
t.error(` • ${n}`);
|
|
700
|
+
}), t.newLine(), t.error("Please make sure you are in the root directory of a Starlight ⭐ project."), t.warning("A Starlight ⭐ project should have:"), t.warning(" • astro.config.mjs file"), t.warning(" • src/content/docs directory"), t.newLine();
|
|
701
|
+
}, se = (e) => {
|
|
702
|
+
const n = e.reduce(
|
|
703
|
+
(a, o) => ({ ...a, ...o }),
|
|
644
704
|
{}
|
|
645
705
|
);
|
|
646
|
-
return Object.keys(
|
|
647
|
-
},
|
|
648
|
-
const
|
|
649
|
-
return
|
|
650
|
-
},
|
|
706
|
+
return Object.keys(n).length > 0 ? n : void 0;
|
|
707
|
+
}, ie = (e) => e.filename.replace(/\.(mdx?|md)$/, ""), H = (e) => e.label ? e.label.trim() : ie(e), qe = (e, n) => {
|
|
708
|
+
const a = ie(e), o = n.trim().toLowerCase();
|
|
709
|
+
return a.toLocaleLowerCase() === "index" ? o : `${o}/${a}`;
|
|
710
|
+
}, He = (e, n, a) => {
|
|
651
711
|
e.filename.replace(/\.(mdx?|md)$/, "");
|
|
652
|
-
const o =
|
|
712
|
+
const o = a.filter((s) => s.id === e.id).map((s) => ({ [s.language]: H(s) }));
|
|
653
713
|
return {
|
|
654
|
-
label:
|
|
655
|
-
slug:
|
|
656
|
-
translations:
|
|
714
|
+
label: H(e),
|
|
715
|
+
slug: qe(e, n),
|
|
716
|
+
translations: se(o)
|
|
657
717
|
};
|
|
658
|
-
},
|
|
659
|
-
const
|
|
718
|
+
}, Z = (e) => e.label ? e.label.trim() : e.name, Ze = (e, n) => {
|
|
719
|
+
const a = n.flatMap((i) => i.folders ?? []).filter((i) => i.id === e.id), o = a.flatMap((i) => i.pages ?? []).filter((i) => e.pages.some((c) => c.id === i.id)), s = a.map((i) => ({ [i.language]: Z(i) }));
|
|
660
720
|
return {
|
|
661
|
-
label:
|
|
662
|
-
translations:
|
|
663
|
-
items:
|
|
721
|
+
label: Z(e),
|
|
722
|
+
translations: se(s),
|
|
723
|
+
items: N(e.pages, (i) => He(i, e.name, o))
|
|
664
724
|
};
|
|
665
|
-
},
|
|
725
|
+
}, Xe = (e, n) => N(e.folders, (a) => Ze(a, n)), Qe = () => ({
|
|
666
726
|
id: "starlight",
|
|
667
727
|
hasToSaveConfig: !0,
|
|
668
|
-
getEnvFilePath: () =>
|
|
728
|
+
getEnvFilePath: () => r.join(D(), b),
|
|
669
729
|
onInit: async (e) => {
|
|
670
|
-
|
|
671
|
-
const { valid:
|
|
672
|
-
if (
|
|
673
|
-
const o =
|
|
674
|
-
i.scripts = { ...
|
|
730
|
+
t.step("Checking for Starlight ⭐ project...");
|
|
731
|
+
const { valid: n, missingItems: a } = Me();
|
|
732
|
+
if (n || (We(a), process.exit(1)), Ye(), e.command === "init") {
|
|
733
|
+
const o = r.join(process.cwd(), "package.json"), s = await l.readFile(o, "utf-8"), i = JSON.parse(s), c = i.scripts || {};
|
|
734
|
+
i.scripts = { ...c, "content-update": "npm create contentisland@latest update" }, await l.writeFile(o, JSON.stringify(i, null, 2), "utf-8");
|
|
675
735
|
}
|
|
676
736
|
},
|
|
677
737
|
syncProject: async (e) => {
|
|
678
|
-
const { accessToken:
|
|
679
|
-
|
|
680
|
-
const o = await
|
|
681
|
-
|
|
738
|
+
const { accessToken: n, askIfMultipleLanguages: a } = e;
|
|
739
|
+
t.connecting("Initializing Content Island 🏝️ client..."), _e(n);
|
|
740
|
+
const o = await De();
|
|
741
|
+
t.success(`Connected to project using template: ${o.template} (version: ${o.version})`), o.template !== "starlight" && (t.warning(
|
|
682
742
|
"The project you are trying to sync is not using the Starlight ⭐ template. Please make sure you are using the correct template."
|
|
683
|
-
), process.exit(1)), await
|
|
743
|
+
), process.exit(1)), await T({
|
|
684
744
|
version: o.version
|
|
685
|
-
}),
|
|
686
|
-
const s = await
|
|
687
|
-
|
|
745
|
+
}), t.fetching("Fetching project information from Content Island 🏝️ ...");
|
|
746
|
+
const s = await Re();
|
|
747
|
+
t.success(`Project fetched: ${s.name}`);
|
|
688
748
|
const i = s.languages.map((d) => d);
|
|
689
|
-
|
|
690
|
-
const
|
|
691
|
-
|
|
692
|
-
const
|
|
693
|
-
let
|
|
694
|
-
for (const d of
|
|
695
|
-
const
|
|
696
|
-
|
|
749
|
+
t.info(`Languages found (${i.length}): ${i.join(", ")}`);
|
|
750
|
+
const c = await Ue(i, a);
|
|
751
|
+
t.language(c);
|
|
752
|
+
const f = i.filter((d) => d !== c), u = await W(c);
|
|
753
|
+
let C = [];
|
|
754
|
+
for (const d of f) {
|
|
755
|
+
const ue = await W(d);
|
|
756
|
+
C.push(ue);
|
|
697
757
|
}
|
|
698
|
-
|
|
699
|
-
const
|
|
700
|
-
await
|
|
758
|
+
t.clearing("Clearing existing docs content..."), await Oe(), t.docs("Existing docs content cleared"), t.updating("Updating docs content with fetched data..."), await Ke(u, C), t.docs("Docs content updated"), t.config("Generating sidebar configuration...");
|
|
759
|
+
const w = Xe(u, C);
|
|
760
|
+
await Be(w, c, f), t.config("Sidebar configuration updated in astro.config.mjs");
|
|
701
761
|
},
|
|
702
762
|
onFinish: async () => {
|
|
703
|
-
|
|
763
|
+
t.run("Now you can start your project by running:"), t.newLine(), t.command("npm run dev"), t.newLine();
|
|
704
764
|
}
|
|
705
|
-
}),
|
|
706
|
-
starlight:
|
|
707
|
-
"personal-static-site":
|
|
708
|
-
"minimal-astro":
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
765
|
+
}), re = {
|
|
766
|
+
starlight: Qe,
|
|
767
|
+
"personal-static-site": Pe,
|
|
768
|
+
"minimal-astro": be,
|
|
769
|
+
"business-landing": ve,
|
|
770
|
+
"restaurant-site": Le
|
|
771
|
+
}, et = (e) => {
|
|
772
|
+
const n = re[e];
|
|
773
|
+
if (!n)
|
|
712
774
|
throw new Error(`Template "${e}" not found`);
|
|
713
|
-
return
|
|
714
|
-
},
|
|
715
|
-
let
|
|
716
|
-
return
|
|
775
|
+
return n();
|
|
776
|
+
}, tt = () => Object.keys(re), nt = async (e, n) => {
|
|
777
|
+
let a;
|
|
778
|
+
return a || (a = (await M())?.templateID), a && n && (t.info(`Existing template found: ${a}`), (await m({
|
|
717
779
|
type: "confirm",
|
|
718
780
|
name: "useExisting",
|
|
719
|
-
message: `An existing template (${
|
|
781
|
+
message: `An existing template (${a}) was found. Do you want to use it?`,
|
|
720
782
|
initial: !0
|
|
721
|
-
}))?.useExisting ?
|
|
783
|
+
}))?.useExisting ? t.success(`Using existing template: ${a}`) : (a = null, t.step("Selecting new template..."))), a || (t.step("Please select a template:"), a = (await m({
|
|
722
784
|
type: "select",
|
|
723
785
|
name: "templateID",
|
|
724
786
|
message: "Select a template:",
|
|
725
787
|
choices: e.map((s) => ({ title: s, value: s }))
|
|
726
|
-
}))?.templateID),
|
|
727
|
-
},
|
|
788
|
+
}))?.templateID), a || (t.error("Template is required to continue"), process.exit(1)), a;
|
|
789
|
+
}, ce = async (e) => {
|
|
728
790
|
try {
|
|
729
|
-
const { selectedTemplateId:
|
|
730
|
-
let s = o.find((i) => i ===
|
|
731
|
-
return s || (s = await
|
|
732
|
-
} catch (
|
|
733
|
-
|
|
791
|
+
const { selectedTemplateId: n, askIfExists: a } = e, o = tt();
|
|
792
|
+
let s = o.find((i) => i === n);
|
|
793
|
+
return s || (s = await nt(o, a)), t.detected(`Template selected: ${s}`), et(s);
|
|
794
|
+
} catch (n) {
|
|
795
|
+
t.error(`Error configuring template: ${n.message}`), process.exit(1);
|
|
734
796
|
}
|
|
735
|
-
},
|
|
736
|
-
if (!
|
|
797
|
+
}, le = "CONTENT_ISLAND_ACCESS_TOKEN", at = async (e) => {
|
|
798
|
+
if (!S(e))
|
|
737
799
|
return null;
|
|
738
800
|
try {
|
|
739
|
-
const
|
|
740
|
-
return
|
|
801
|
+
const a = (await l.readFile(e, "utf-8")).match(new RegExp(`${le}=(.+)`));
|
|
802
|
+
return a ? a[1].trim() : null;
|
|
741
803
|
} catch {
|
|
742
804
|
return null;
|
|
743
805
|
}
|
|
744
|
-
},
|
|
806
|
+
}, ge = async (e, n) => {
|
|
745
807
|
try {
|
|
746
|
-
const
|
|
747
|
-
`, o =
|
|
748
|
-
await l.mkdir(o, { recursive: !0 }), await l.writeFile(
|
|
749
|
-
} catch (
|
|
750
|
-
|
|
808
|
+
const a = `${le}=${e}
|
|
809
|
+
`, o = r.dirname(n);
|
|
810
|
+
await l.mkdir(o, { recursive: !0 }), await l.writeFile(n, a, "utf-8"), t.token(`Access token saved to ${n}`);
|
|
811
|
+
} catch (a) {
|
|
812
|
+
t.error(`Failed to save the access token: ${a.message}`);
|
|
751
813
|
}
|
|
752
|
-
},
|
|
753
|
-
e || (
|
|
754
|
-
},
|
|
755
|
-
let
|
|
756
|
-
if (
|
|
814
|
+
}, X = (e) => {
|
|
815
|
+
e || (t.error("Token is required to continue"), process.exit(1));
|
|
816
|
+
}, ot = async (e, n) => {
|
|
817
|
+
let a = e ? await at(e) : null;
|
|
818
|
+
if (a && n && (t.info("Found existing Content Island 🏝️ token"), (await m({
|
|
757
819
|
type: "confirm",
|
|
758
820
|
name: "useExisting",
|
|
759
821
|
message: "An existing token was found. Do you want to use it?",
|
|
760
822
|
initial: !0
|
|
761
|
-
}))?.useExisting || (
|
|
762
|
-
|
|
823
|
+
}))?.useExisting || (a = null)), a)
|
|
824
|
+
t.success("Using existing Content Island 🏝️ token");
|
|
763
825
|
else {
|
|
764
|
-
|
|
765
|
-
const o = await
|
|
826
|
+
n || t.warning("No existing token found");
|
|
827
|
+
const o = await m({
|
|
766
828
|
type: "password",
|
|
767
829
|
name: "token",
|
|
768
830
|
message: "Enter your Content Island 🏝️ API token:",
|
|
769
831
|
validate: (s) => s.length > 0 ? !0 : "Token is required"
|
|
770
832
|
});
|
|
771
|
-
|
|
833
|
+
X(o?.token), a = o?.token, e && await ge(a, e);
|
|
772
834
|
}
|
|
773
|
-
return
|
|
774
|
-
},
|
|
775
|
-
const { accessToken:
|
|
776
|
-
let s =
|
|
777
|
-
return s ? (
|
|
778
|
-
},
|
|
835
|
+
return X(a), a;
|
|
836
|
+
}, de = async (e) => {
|
|
837
|
+
const { accessToken: n, envFilePath: a, askIfExists: o } = e;
|
|
838
|
+
let s = n;
|
|
839
|
+
return s ? (t.success("Using provided Content Island 🏝️ token"), await ge(s, a)) : s = await ot(a, o), s;
|
|
840
|
+
}, st = async (e) => {
|
|
779
841
|
try {
|
|
780
|
-
|
|
781
|
-
const
|
|
842
|
+
t.title("Content Island Integration"), t.step("Configuring template...");
|
|
843
|
+
const n = await ce({
|
|
782
844
|
selectedTemplateId: e.template,
|
|
783
845
|
askIfExists: !0
|
|
784
846
|
});
|
|
785
|
-
|
|
847
|
+
n.onInit && (t.step("Running template initialization..."), await n.onInit({
|
|
786
848
|
command: "init"
|
|
787
|
-
})),
|
|
788
|
-
const
|
|
849
|
+
})), n.hasToSaveConfig && (t.step("Saving configuration..."), await T({ templateID: n.id }), t.config("Template configuration saved")), t.step("Configuring access token...");
|
|
850
|
+
const a = n.getEnvFilePath ? n.getEnvFilePath() : null, o = await de({
|
|
789
851
|
accessToken: e.token,
|
|
790
|
-
envFilePath:
|
|
852
|
+
envFilePath: a,
|
|
791
853
|
askIfExists: !0
|
|
792
854
|
});
|
|
793
|
-
|
|
794
|
-
} catch (
|
|
795
|
-
|
|
855
|
+
t.token("Access token configured successfully"), t.step("Synchronizing project..."), await n.syncProject({ accessToken: o, askIfMultipleLanguages: !0 }), t.newLine(), t.complete("Content Island 🏝️ integration completed successfully!"), t.newLine(), n.onFinish && await n.onFinish();
|
|
856
|
+
} catch (n) {
|
|
857
|
+
t.newLine(), t.error("Error during Content Island integration:"), t.error(n instanceof Error ? n.message : String(n)), process.exit(1);
|
|
796
858
|
}
|
|
797
|
-
},
|
|
859
|
+
}, it = async () => {
|
|
798
860
|
try {
|
|
799
|
-
|
|
800
|
-
const e = await
|
|
801
|
-
e.onInit && (
|
|
861
|
+
t.title("Content Island Integration"), t.step("Configuring template...");
|
|
862
|
+
const e = await ce({ askIfExists: !1 });
|
|
863
|
+
e.onInit && (t.step("Running template initialization..."), await e.onInit({
|
|
802
864
|
command: "update"
|
|
803
|
-
})), e.hasToSaveConfig && (
|
|
804
|
-
const
|
|
805
|
-
envFilePath:
|
|
865
|
+
})), e.hasToSaveConfig && (t.step("Saving configuration..."), await T({ templateID: e.id }), t.config("Template configuration saved")), t.step("Configuring access token...");
|
|
866
|
+
const n = e.getEnvFilePath ? e.getEnvFilePath() : null, a = await de({
|
|
867
|
+
envFilePath: n,
|
|
806
868
|
askIfExists: !1
|
|
807
869
|
});
|
|
808
|
-
|
|
870
|
+
t.token("Access token configured successfully"), t.step("Synchronizing project..."), await e.syncProject({ accessToken: a, askIfMultipleLanguages: !1 }), t.newLine(), t.complete("Content Island 🏝️ integration completed successfully!"), t.newLine(), e.onFinish && await e.onFinish();
|
|
809
871
|
} catch (e) {
|
|
810
|
-
|
|
872
|
+
t.newLine(), t.error("Error during Content Island integration:"), t.error(e instanceof Error ? e.message : String(e)), process.exit(1);
|
|
811
873
|
}
|
|
812
|
-
},
|
|
813
|
-
version:
|
|
814
|
-
},
|
|
815
|
-
|
|
874
|
+
}, rt = "0.4.0", ct = {
|
|
875
|
+
version: rt
|
|
876
|
+
}, I = pe("create-contentisland");
|
|
877
|
+
I.command("", "Initialize and validate a project").example("npm create contentisland").example("npm create contentisland --token <token>").example("npm create contentisland --token <token> --template starlight").option(
|
|
816
878
|
"--token <token>",
|
|
817
879
|
"Your Content Island token (you can also set the CONTENT_ISLAND_ACCESS_TOKEN environment variable)",
|
|
818
880
|
{
|
|
819
881
|
default: process.env.CONTENT_ISLAND_ACCESS_TOKEN || void 0
|
|
820
882
|
}
|
|
821
883
|
).option("--template <template>", "The template to use: starlight.").action(async (e) => {
|
|
822
|
-
await
|
|
884
|
+
await st(e);
|
|
823
885
|
});
|
|
824
|
-
|
|
825
|
-
await
|
|
886
|
+
I.command("update", "Update content from Content Island 🏝️ (preserves existing token)").example("npm create contentisland update").action(async () => {
|
|
887
|
+
await it();
|
|
826
888
|
});
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
889
|
+
I.help();
|
|
890
|
+
I.version(ct.version);
|
|
891
|
+
I.parse();
|