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.
Files changed (2) hide show
  1. package/dist/index.js +407 -345
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import { cac as le } from "cac";
2
- import y from "prompts";
1
+ import { cac as pe } from "cac";
2
+ import m from "prompts";
3
3
  import l from "node:fs/promises";
4
- import c from "node:path";
5
- import V from "node:child_process";
6
- import { existsSync as k } from "node:fs";
7
- import { createClient as ge } from "@content-island/api-client";
8
- const P = ".content-island", U = "config.json", O = ".gitignore", A = ".env", M = {
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
- }, E = (e) => {
202
- let t = "";
203
- return e?.bold && (t += p.bold), t;
201
+ }, j = (e) => {
202
+ let n = "";
203
+ return e?.bold && (n += p.bold), n;
204
204
  }, g = {
205
- green: (e, t) => `${p.green}${E(t)}${e}${p.reset}`,
206
- red: (e, t) => `${p.red}${E(t)}${e}${p.reset}`,
207
- yellow: (e, t) => `${p.yellow}${E(t)}${e}${p.reset}`,
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, t) => `${p.cyan}${E(t)}${e}${p.reset}`,
210
- magenta: (e, t) => `${p.magenta}${E(t)}${e}${p.reset}`
211
- }, a = {
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
- }, x = () => c.join(process.cwd(), P), de = async () => {
237
- const e = process.cwd(), t = c.join(e, O), n = `${P}/`;
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
- k(t) && (o = await l.readFile(t, "utf-8"), o.includes(n)) || (o = o + `${o.endsWith(`
239
+ S(n) && (o = await l.readFile(n, "utf-8"), o.includes(a)) || (o = o + `${o.endsWith(`
240
240
  `) ? "" : `
241
- `}${n}
242
- `, await l.writeFile(t, o, "utf-8"), a.saved(`Added ${n} to ${O}`));
243
- }, ue = async () => {
244
- const e = x();
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
- k(e) || (await l.mkdir(e, { recursive: !0 }), a.created(`Created: ${P}/`)), await de();
247
- } catch (t) {
248
- a.error(`Failed to create config directory: ${t.message}`);
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
- }, q = async () => c.join(x(), U), F = async () => {
251
- const e = await q();
252
- if (!k(e))
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 t = await l.readFile(e, "utf-8");
256
- return JSON.parse(t);
257
- } catch (t) {
258
- return a.warning(`Could not parse ${U}: ${t.message}`), null;
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
- }, v = async (e) => {
261
- let t = {
260
+ }, T = async (e) => {
261
+ let n = {
262
262
  ...e
263
263
  };
264
- await ue();
265
- const n = await q();
266
- if (k(n)) {
267
- const o = await F();
268
- o && (t = { ...o, ...e });
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(t, null, 2);
272
- await l.writeFile(n, o, "utf-8"), a.saved(`Saved configuration to ${n}`);
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
- a.error(`Failed to save configuration: ${o.message}`);
274
+ t.error(`Failed to save configuration: ${o.message}`);
275
275
  }
276
- }, pe = (e, t, n, o) => {
277
- let s = 0, i = t, r = !1, m = "", u = !1;
278
- const S = ['"', "'", "`"].includes(n);
279
- for (let f = t; f < e.length; f++) {
280
- const d = e[f];
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 === "\\" && r) {
285
+ if (d === "\\" && c) {
286
286
  u = !0;
287
287
  continue;
288
288
  }
289
- if (S) {
290
- if (d === n && !r) {
289
+ if (C) {
290
+ if (d === a && !c) {
291
291
  if (s++, s === 1)
292
292
  continue;
293
293
  if (s === 2) {
294
- i = f + 1;
294
+ i = w + 1;
295
295
  break;
296
296
  }
297
297
  }
298
- } else if (!r && (d === '"' || d === "'" || d === "`"))
299
- r = !0, m = d;
300
- else if (r && d === m)
301
- r = !1;
302
- else if (!r) {
303
- if (d === n)
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 = f + 1;
306
+ i = w + 1;
307
307
  break;
308
308
  }
309
309
  }
310
310
  }
311
311
  return i;
312
- }, T = async (e) => {
313
- const { filePath: t, property: n, startSymbol: o, endSymbol: s } = e, i = await l.readFile(t, "utf-8");
314
- let r = o;
315
- o === "[" && (r = "\\["), o === "{" && (r = "\\{"), o === "(" && (r = "\\(");
316
- const m = new RegExp(`${n}\\s*:\\s*(${r})`), u = i.match(m);
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 S = i.indexOf(u[0]) + u[0].length - 1, f = pe(i, S, o, s);
320
- return i.substring(S, f);
321
- }, me = (e) => JSON.parse(
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
- ), Y = (e) => e.replace(/"/g, "'").replace(/'(\w+)':/g, "$1:"), fe = async (e, t, n, o) => {
324
- let s = await T(n);
325
- if (s || (s = await T(o)), !s)
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 '${n.property}' or fallback property '${o.property}' in file ${n.filePath}`
327
+ `Could not find property '${a.property}' or fallback property '${o.property}' in file ${a.filePath}`
328
328
  );
329
- const i = Y(JSON.stringify(t, null, 2));
330
- return (await l.readFile(n.filePath, "utf-8")).replace(s, (m) => `${m},
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
- }, we = ".git", W = (e, t) => {
333
- const n = V.spawn("git", ["clone", "--depth=1", e, t], { stdio: "inherit" });
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
- n.on("close", (i) => {
336
- l.rm(c.join(t, we), { recursive: !0, force: !0 }).finally(() => {
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
- }, H = (e) => {
342
- const t = V.spawn("npm install", {
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((n, o) => {
348
- t.on("error", (s) => {
349
- a.error(`Failed to install dependencies: ${s.message}`), a.error("Please try running 'npm install' manually."), o(s);
350
- }), t.on("close", (s) => {
351
- s === 0 || a.error("Failed to install dependencies. Please try running 'npm install' manually."), n();
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
- }, Z = async (e) => {
355
- const t = c.join(e, "package.json"), n = await l.readFile(t, "utf-8"), o = JSON.parse(n);
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(t, JSON.stringify(o, null, 2), "utf-8");
361
- }, X = async (e, t) => {
362
- const n = '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 = c.join(e, t);
363
- await l.writeFile(o, n, "utf-8");
364
- }, he = "https://github.com/content-island/template-minimal-astro.git", ye = "create-dev-env.js", D = ".env-sample";
365
- let w = process.cwd();
366
- const ke = () => ({
367
- id: "minimal-astro",
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: () => c.join(w, A),
369
+ getEnvFilePath: () => r.join(y, b),
370
370
  onInit: async () => {
371
- const { projectPath: e } = await y({
371
+ const { projectPath: e } = await m({
372
372
  type: "text",
373
373
  name: "projectPath",
374
- message: "Where should we create your new minimal astro site project?",
374
+ message: "Where should we create your new business landing project?",
375
375
  initial: "./"
376
376
  });
377
- e && (w = c.join(process.cwd(), e), a.loading("Cloning Minimal Astro template repository..."), await W(he, w), a.success("Minimal Astro template repository cloned."));
378
- const { installDeps: t } = await y({
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
- t && (a.loading("Installing dependencies..."), await H(w), a.success("Dependencies installed."));
384
+ n && (t.loading("Installing dependencies..."), await F(y), t.success("Dependencies installed."));
385
385
  },
386
386
  syncProject: async () => {
387
- a.info("Syncing Minimal Astro project..."), await l.unlink(c.join(w, ye)), await l.unlink(c.join(w, D)), await X(w, D), await Z(w), a.success("Minimal Astro project synchronized.");
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
- a.run("Now you can start your project by running:"), a.newLine();
391
- const e = c.relative(process.cwd(), w);
392
- e && a.command(`cd ${e}`), a.command("npm run dev"), a.newLine();
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
- }), Se = "https://github.com/content-island/template-personal-static-site.git", Ce = "create-dev-env.js", R = ".env-sample";
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 Ee = () => ({
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: () => c.join(h, A),
429
+ getEnvFilePath: () => r.join(E, b),
400
430
  onInit: async () => {
401
- const { projectPath: e } = await y({
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 && (h = c.join(process.cwd(), e), a.loading("Cloning Personal Static Site template repository..."), await W(Se, h), a.success("Personal Static Site template repository cloned."));
408
- const { installDeps: t } = await y({
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
- t && (a.loading("Installing dependencies..."), await H(h), a.success("Dependencies installed."));
474
+ n && (t.loading("Installing dependencies..."), await F(k), t.success("Dependencies installed."));
415
475
  },
416
476
  syncProject: async () => {
417
- a.info("Syncing Personal Static Site project..."), await l.unlink(c.join(h, Ce)), await l.unlink(c.join(h, R)), await X(h, R), await Z(h), a.success("Personal Static Site project synchronized.");
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
- a.run("Now you can start your project by running:"), a.newLine();
421
- const e = c.relative(process.cwd(), h);
422
- e && a.command(`cd ${e}`), a.command("npm run dev"), a.newLine();
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
- }), $ = (e, t) => Array.isArray(e) ? e.map(t) : [], ve = (e, t) => ({
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: $(e.pages, (n) => t.find((o) => o.id === n))
430
- }), be = (e, t) => ({
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: $(e.folders, (n) => ve(n, t))
494
+ folders: N(e.folders, (a) => xe(a, n))
435
495
  });
436
- let j = null;
437
- const Ie = (e) => {
438
- j = ge({ accessToken: e });
439
- }, N = () => {
440
- if (!j)
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 j;
443
- }, Te = async () => await N().getProject(), z = async (e) => {
444
- const t = N(), n = await t.getContent({
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 (!n)
509
+ if (!a)
450
510
  throw new Error(`Root content not found for language: ${e}`);
451
- const o = n.folders?.flatMap((i) => i.pages) || [], s = await t.getContentList({
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 be(n, s);
461
- }, $e = async () => {
520
+ return Ne(a, s);
521
+ }, De = async () => {
462
522
  try {
463
- return await N().getContent({
523
+ return await O().getContent({
464
524
  contentType: "Meta"
465
525
  });
466
526
  } catch (e) {
467
- e.message.includes("401") ? a.error(
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
- ) : a.error("The requested template is not of type StarLight, so the meta field could not be found."), process.exit(1);
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
- }, Q = "astro.config.mjs", L = () => c.join(process.cwd(), "src", "content", "docs"), _ = () => c.join(process.cwd(), Q), je = () => {
472
- const e = [], t = _();
473
- k(t) || e.push(Q);
474
- const n = L();
475
- return k(n) || e.push("src/content/docs directory"), {
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
- }, Pe = async () => {
480
- const e = L();
481
- if (!k(e)) {
482
- a.info("Content docs directory not found, creating it..."), await l.mkdir(e, { recursive: !0 });
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 t = await l.readdir(e);
486
- for (const n of t) {
487
- const o = c.join(e, n);
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
- }, C = {
550
+ }, v = {
491
551
  sidebar: { start: "[", end: "]" },
492
552
  locales: { start: "{", end: "}" },
493
553
  title: { start: "'", end: "'" }
494
- }, ee = (e, t) => {
495
- const n = [], o = [];
496
- for (const s of t) {
497
- const i = e.findIndex((r) => r.label === s.label);
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 r = s.items && e[i].items ? ee(e[i].items || [], s.items) : s.items;
500
- n[i] = {
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: r
563
+ items: c
504
564
  };
505
565
  } else
506
566
  o.push(s);
507
567
  }
508
- return n.push(...o), n.sort((s, i) => {
509
- const r = t.findIndex((u) => u.label === s.label), m = t.findIndex((u) => u.label === i.label);
510
- return r - m;
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
- }, Ae = (e, t) => {
513
- const n = {
514
- root: { lang: e, label: M[e] }
572
+ }, ze = (e, n) => {
573
+ const a = {
574
+ root: { lang: e, label: J[e] }
515
575
  };
516
- return Array.isArray(t) ? t.reduce(
576
+ return Array.isArray(n) ? n.reduce(
517
577
  (o, s) => ({
518
578
  ...o,
519
- [s]: { lang: s, label: M[s] }
579
+ [s]: { lang: s, label: J[s] }
520
580
  }),
521
- n
522
- ) : n;
523
- }, J = async (e, t, n) => {
524
- const o = _(), s = await T({
581
+ a
582
+ ) : a;
583
+ }, q = async (e, n, a) => {
584
+ const o = B(), s = await P({
525
585
  filePath: o,
526
- property: t,
527
- startSymbol: C[t]?.start,
528
- endSymbol: C[t]?.end
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 r = Y(JSON.stringify(e, null, 2));
533
- i = (await l.readFile(o, "utf-8")).replace(s, r);
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 fe(
536
- t,
595
+ i = await Ee(
596
+ n,
537
597
  e,
538
598
  {
539
599
  filePath: o,
540
- property: n,
541
- startSymbol: C[n]?.start,
542
- endSymbol: C[n]?.end
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: C.title.start,
548
- endSymbol: C.title.end
607
+ startSymbol: v.title.start,
608
+ endSymbol: v.title.end
549
609
  }
550
610
  );
551
611
  await l.writeFile(o, i, "utf-8");
552
- }, xe = async (e, t, n) => {
612
+ }, Be = async (e, n, a) => {
553
613
  try {
554
- let o = await T({
555
- filePath: _(),
614
+ let o = await P({
615
+ filePath: B(),
556
616
  property: "sidebar",
557
- startSymbol: C.sidebar.start,
558
- endSymbol: C.sidebar.end
617
+ startSymbol: v.sidebar.start,
618
+ endSymbol: v.sidebar.end
559
619
  }), s = [];
560
620
  try {
561
- s = o ? me(o) : null;
621
+ s = o ? he(o) : null;
562
622
  } catch {
563
- a.warning("Could not parse existing sidebar in astro.config.mjs. A new sidebar will be created."), s = [];
623
+ t.warning("Could not parse existing sidebar in astro.config.mjs. A new sidebar will be created."), s = [];
564
624
  }
565
- s || (a.warning("No existing sidebar found in astro.config.mjs. A new sidebar will be created."), s = []);
566
- const i = ee(s, e);
567
- await J(i, "sidebar", "locales");
568
- const r = Ae(t, n);
569
- await J(r, "locales", "sidebar");
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
- a.error(`Error reading astro.config.mjs: ${o.message}`), process.exit(1);
631
+ t.error(`Error reading astro.config.mjs: ${o.message}`), process.exit(1);
572
632
  }
573
- }, Fe = (e) => /^---\s*\n([\s\S]*?)\n---\s*\n/.test(e), Ne = (e) => c.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(" ");
574
- function Le(e, t, n) {
575
- if (Fe(e))
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 = Ne(t), s = `---
637
+ const o = Je(n), s = `---
578
638
  title: "${o}"
579
639
  ---
580
640
 
581
641
  `;
582
- return a.warning(`Missing frontmatter in ${n}`), a.info(`Added default title: "${o}"`), a.warning("Please update the content in Content Island 🏝️ to include proper frontmatter"), a.newLine(), s + e;
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 I = async (e, t) => {
585
- const n = L(), o = c.join(n, e), s = Le(t, e, c.relative(process.cwd(), o)), i = c.dirname(o);
586
- k(i) || await l.mkdir(i, { recursive: !0 }), await l.writeFile(o, s, "utf-8");
587
- }, _e = async (e, t) => {
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 I(e.index.filename, e.index.content);
590
- for (const n of e.folders)
591
- for (const o of n.pages)
592
- await I(c.join(n.name, o.filename), o.content);
593
- for (const n of t) {
594
- await I(c.join(n.language, n.index.filename), n.index.content);
595
- for (const o of n.folders)
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 I(c.join(n.language, o.name, s.filename), s.content);
657
+ await $(r.join(a.language, o.name, s.filename), s.content);
598
658
  }
599
- } catch (n) {
600
- a.error(`Error updating docs content: ${n.message}`), process.exit(1);
659
+ } catch (a) {
660
+ t.error(`Error updating docs content: ${a.message}`), process.exit(1);
601
661
  }
602
- }, Oe = async (e, t) => {
662
+ }, Ue = async (e, n) => {
603
663
  if (e.length === 1) {
604
664
  const s = e[0];
605
- return a.success(`Single language found: ${s}. Continuing...`), await v({ languageCode: s }), s;
665
+ return t.success(`Single language found: ${s}. Continuing...`), await T({ languageCode: s }), s;
606
666
  }
607
- const n = (await F())?.languageCode;
608
- if (n && !t) {
609
- if (e.includes(n))
610
- return a.info(`Using saved default language: ${n}`), n;
611
- a.warning(`Saved language '${n}' not found in project languages`), a.step("Will ask for new default language and save it");
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
- a.step("Multiple languages found. Please select the default language:");
614
- const o = await y({
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 || (a.error("Language selection is required to continue."), process.exit(1)), n !== o.language && (await v({ languageCode: o.language }), a.config(`Saving default language '${o.language}' to config`)), o.language;
625
- }, Me = () => {
626
- a.detected(`
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
- `), a.success("All good! Starlight ⭐ project detected successfully."), a.loading("Launching process..."), a.newLine();
637
- }, De = (e) => {
638
- a.newLine(), a.error("Starlight ⭐ project not found!"), a.newLine(), a.error("Missing required items:"), e.forEach((t) => {
639
- a.error(` • ${t}`);
640
- }), a.newLine(), a.error("Please make sure you are in the root directory of a Starlight ⭐ project."), a.warning("A Starlight ⭐ project should have:"), a.warning(" • astro.config.mjs file"), a.warning(" • src/content/docs directory"), a.newLine();
641
- }, te = (e) => {
642
- const t = e.reduce(
643
- (n, o) => ({ ...n, ...o }),
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(t).length > 0 ? t : void 0;
647
- }, ne = (e) => e.filename.replace(/\.(mdx?|md)$/, ""), G = (e) => e.label ? e.label.trim() : ne(e), Re = (e, t) => {
648
- const n = ne(e), o = t.trim().toLowerCase();
649
- return n.toLocaleLowerCase() === "index" ? o : `${o}/${n}`;
650
- }, ze = (e, t, n) => {
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 = n.filter((s) => s.id === e.id).map((s) => ({ [s.language]: G(s) }));
712
+ const o = a.filter((s) => s.id === e.id).map((s) => ({ [s.language]: H(s) }));
653
713
  return {
654
- label: G(e),
655
- slug: Re(e, t),
656
- translations: te(o)
714
+ label: H(e),
715
+ slug: qe(e, n),
716
+ translations: se(o)
657
717
  };
658
- }, B = (e) => e.label ? e.label.trim() : e.name, Je = (e, t) => {
659
- const n = t.flatMap((i) => i.folders ?? []).filter((i) => i.id === e.id), o = n.flatMap((i) => i.pages ?? []).filter((i) => e.pages.some((r) => r.id === i.id)), s = n.map((i) => ({ [i.language]: B(i) }));
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: B(e),
662
- translations: te(s),
663
- items: $(e.pages, (i) => ze(i, e.name, o))
721
+ label: Z(e),
722
+ translations: se(s),
723
+ items: N(e.pages, (i) => He(i, e.name, o))
664
724
  };
665
- }, Ge = (e, t) => $(e.folders, (n) => Je(n, t)), Be = () => ({
725
+ }, Xe = (e, n) => N(e.folders, (a) => Ze(a, n)), Qe = () => ({
666
726
  id: "starlight",
667
727
  hasToSaveConfig: !0,
668
- getEnvFilePath: () => c.join(x(), A),
728
+ getEnvFilePath: () => r.join(D(), b),
669
729
  onInit: async (e) => {
670
- a.step("Checking for Starlight ⭐ project...");
671
- const { valid: t, missingItems: n } = je();
672
- if (t || (De(n), process.exit(1)), Me(), e.command === "init") {
673
- const o = c.join(process.cwd(), "package.json"), s = await l.readFile(o, "utf-8"), i = JSON.parse(s), r = i.scripts || {};
674
- i.scripts = { ...r, "content-update": "npm create contentisland@latest update" }, await l.writeFile(o, JSON.stringify(i, null, 2), "utf-8");
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: t, askIfMultipleLanguages: n } = e;
679
- a.connecting("Initializing Content Island 🏝️ client..."), Ie(t);
680
- const o = await $e();
681
- a.success(`Connected to project using template: ${o.template} (version: ${o.version})`), o.template !== "starlight" && (a.warning(
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 v({
743
+ ), process.exit(1)), await T({
684
744
  version: o.version
685
- }), a.fetching("Fetching project information from Content Island 🏝️ ...");
686
- const s = await Te();
687
- a.success(`Project fetched: ${s.name}`);
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
- a.info(`Languages found (${i.length}): ${i.join(", ")}`);
690
- const r = await Oe(i, n);
691
- a.language(r);
692
- const m = i.filter((d) => d !== r), u = await z(r);
693
- let S = [];
694
- for (const d of m) {
695
- const ce = await z(d);
696
- S.push(ce);
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
- a.clearing("Clearing existing docs content..."), await Pe(), a.docs("Existing docs content cleared"), a.updating("Updating docs content with fetched data..."), await _e(u, S), a.docs("Docs content updated"), a.config("Generating sidebar configuration...");
699
- const f = Ge(u, S);
700
- await xe(f, r, m), a.config("Sidebar configuration updated in astro.config.mjs");
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
- a.run("Now you can start your project by running:"), a.newLine(), a.command("npm run dev"), a.newLine();
763
+ t.run("Now you can start your project by running:"), t.newLine(), t.command("npm run dev"), t.newLine();
704
764
  }
705
- }), ae = {
706
- starlight: Be,
707
- "personal-static-site": Ee,
708
- "minimal-astro": ke
709
- }, Ke = (e) => {
710
- const t = ae[e];
711
- if (!t)
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 t();
714
- }, Ve = () => Object.keys(ae), Ue = async (e, t) => {
715
- let n;
716
- return n || (n = (await F())?.templateID), n && t && (a.info(`Existing template found: ${n}`), (await y({
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 (${n}) was found. Do you want to use it?`,
781
+ message: `An existing template (${a}) was found. Do you want to use it?`,
720
782
  initial: !0
721
- }))?.useExisting ? a.success(`Using existing template: ${n}`) : (n = null, a.step("Selecting new template..."))), n || (a.step("Please select a template:"), n = (await y({
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), n || (a.error("Template is required to continue"), process.exit(1)), n;
727
- }, oe = async (e) => {
788
+ }))?.templateID), a || (t.error("Template is required to continue"), process.exit(1)), a;
789
+ }, ce = async (e) => {
728
790
  try {
729
- const { selectedTemplateId: t, askIfExists: n } = e, o = Ve();
730
- let s = o.find((i) => i === t);
731
- return s || (s = await Ue(o, n)), a.detected(`Template selected: ${s}`), Ke(s);
732
- } catch (t) {
733
- a.error(`Error configuring template: ${t.message}`), process.exit(1);
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
- }, se = "CONTENT_ISLAND_ACCESS_TOKEN", qe = async (e) => {
736
- if (!k(e))
797
+ }, le = "CONTENT_ISLAND_ACCESS_TOKEN", at = async (e) => {
798
+ if (!S(e))
737
799
  return null;
738
800
  try {
739
- const n = (await l.readFile(e, "utf-8")).match(new RegExp(`${se}=(.+)`));
740
- return n ? n[1].trim() : null;
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
- }, ie = async (e, t) => {
806
+ }, ge = async (e, n) => {
745
807
  try {
746
- const n = `${se}=${e}
747
- `, o = c.dirname(t);
748
- await l.mkdir(o, { recursive: !0 }), await l.writeFile(t, n, "utf-8"), a.token(`Access token saved to ${t}`);
749
- } catch (n) {
750
- a.error(`Failed to save the access token: ${n.message}`);
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
- }, K = (e) => {
753
- e || (a.error("Token is required to continue"), process.exit(1));
754
- }, Ye = async (e, t) => {
755
- let n = e ? await qe(e) : null;
756
- if (n && t && (a.info("Found existing Content Island 🏝️ token"), (await y({
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 || (n = null)), n)
762
- a.success("Using existing Content Island 🏝️ token");
823
+ }))?.useExisting || (a = null)), a)
824
+ t.success("Using existing Content Island 🏝️ token");
763
825
  else {
764
- t || a.warning("No existing token found");
765
- const o = await y({
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
- K(o?.token), n = o?.token, e && await ie(n, e);
833
+ X(o?.token), a = o?.token, e && await ge(a, e);
772
834
  }
773
- return K(n), n;
774
- }, re = async (e) => {
775
- const { accessToken: t, envFilePath: n, askIfExists: o } = e;
776
- let s = t;
777
- return s ? (a.success("Using provided Content Island 🏝️ token"), await ie(s, n)) : s = await Ye(n, o), s;
778
- }, We = async (e) => {
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
- a.title("Content Island Integration"), a.step("Configuring template...");
781
- const t = await oe({
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
- t.onInit && (a.step("Running template initialization..."), await t.onInit({
847
+ n.onInit && (t.step("Running template initialization..."), await n.onInit({
786
848
  command: "init"
787
- })), t.hasToSaveConfig && (a.step("Saving configuration..."), await v({ templateID: t.id }), a.config("Template configuration saved")), a.step("Configuring access token...");
788
- const n = t.getEnvFilePath ? t.getEnvFilePath() : null, o = await re({
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: n,
852
+ envFilePath: a,
791
853
  askIfExists: !0
792
854
  });
793
- a.token("Access token configured successfully"), a.step("Synchronizing project..."), await t.syncProject({ accessToken: o, askIfMultipleLanguages: !0 }), a.newLine(), a.complete("Content Island 🏝️ integration completed successfully!"), a.newLine(), t.onFinish && await t.onFinish();
794
- } catch (t) {
795
- a.newLine(), a.error("Error during Content Island integration:"), a.error(t instanceof Error ? t.message : String(t)), process.exit(1);
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
- }, He = async () => {
859
+ }, it = async () => {
798
860
  try {
799
- a.title("Content Island Integration"), a.step("Configuring template...");
800
- const e = await oe({ askIfExists: !1 });
801
- e.onInit && (a.step("Running template initialization..."), await 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 && (a.step("Saving configuration..."), await v({ templateID: e.id }), a.config("Template configuration saved")), a.step("Configuring access token...");
804
- const t = e.getEnvFilePath ? e.getEnvFilePath() : null, n = await re({
805
- envFilePath: t,
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
- a.token("Access token configured successfully"), a.step("Synchronizing project..."), await e.syncProject({ accessToken: n, askIfMultipleLanguages: !1 }), a.newLine(), a.complete("Content Island 🏝️ integration completed successfully!"), a.newLine(), e.onFinish && await e.onFinish();
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
- a.newLine(), a.error("Error during Content Island integration:"), a.error(e instanceof Error ? e.message : String(e)), process.exit(1);
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
- }, Ze = "0.2.0", Xe = {
813
- version: Ze
814
- }, b = le("create-contentisland");
815
- b.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(
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 We(e);
884
+ await st(e);
823
885
  });
824
- b.command("update", "Update content from Content Island 🏝️ (preserves existing token)").example("npm create contentisland update").action(async () => {
825
- await He();
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
- b.help();
828
- b.version(Xe.version);
829
- b.parse();
889
+ I.help();
890
+ I.version(ct.version);
891
+ I.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-contentisland",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Content Island - Starlight CLI",
5
5
  "private": false,
6
6
  "sideEffects": false,