gistajs 0.1.12 → 0.2.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/bin.cjs CHANGED
@@ -166,6 +166,17 @@ async function runInput(command, args, cwd, input) {
166
166
  input
167
167
  });
168
168
  }
169
+ async function assertCommand(runFn, cwd, command, args, failureMessage) {
170
+ try {
171
+ await runFn(command, args, cwd);
172
+ } catch (error) {
173
+ let code = error.code;
174
+ if (code === "ENOENT") {
175
+ throw new Error(`Required command not found: ${command}`);
176
+ }
177
+ throw new Error(failureMessage);
178
+ }
179
+ }
169
180
  async function exec(command, args, cwd, options) {
170
181
  return await new Promise((resolve2, reject) => {
171
182
  let { capture, input } = options;
@@ -334,7 +345,7 @@ async function runCreateCommand(argv, deps) {
334
345
  let root = await deps.createProject(starter, options);
335
346
  deps.stdout.log(
336
347
  `
337
- ${c.brand("gistajs")} ${c.success("Created")} ${c.slug(starter.slug)} project in ${c.path(root)}
348
+ ${c.brand("gistajs")} created ${c.slug(starter.slug)} project in ${c.path(root)}
338
349
  `
339
350
  );
340
351
  }
@@ -1131,6 +1142,7 @@ async function runProjectProvision(deps) {
1131
1142
  }
1132
1143
  let cliVersion = await deps.getCliVersion();
1133
1144
  assertCliVersion(cliVersion, requirement);
1145
+ await assertProviderCommands(providers, deps);
1134
1146
  let region = await resolveProjectRegion(pkg, deps);
1135
1147
  await writeProjectRegion(pkg, region.id, deps);
1136
1148
  let summary = {
@@ -1161,6 +1173,14 @@ async function runProjectProvision(deps) {
1161
1173
  }
1162
1174
  printSummary(summary, deps);
1163
1175
  }
1176
+ async function assertProviderCommands(providers, deps) {
1177
+ let commands = providers.filter(
1178
+ (provider) => provider === "turso" || provider === "vercel"
1179
+ );
1180
+ for (let command of new Set(commands)) {
1181
+ await deps.assertCommandAvailable(deps.cwd, command);
1182
+ }
1183
+ }
1164
1184
  async function readProvisionPackage(deps) {
1165
1185
  return await readProjectPackage(deps.cwd, deps.readFile);
1166
1186
  }
@@ -1461,6 +1481,7 @@ async function provisionVercel(cwd, region, deps = defaultDeps3) {
1461
1481
  deps.stdout.log("Linking this directory to a Vercel project...");
1462
1482
  await deps.run("vercel", ["link", "--yes"], cwd);
1463
1483
  }
1484
+ await maybeConnectGit(deps, cwd);
1464
1485
  let envPath = (0, import_node_path6.join)(cwd, ".env");
1465
1486
  let file = await readEnvFile(envPath, deps);
1466
1487
  let values = requiredEnvVars.map((key) => [key, getRequiredEnvVar(file, key)]);
@@ -1512,6 +1533,37 @@ async function assertLoggedIn2(deps, cwd) {
1512
1533
  throw new Error("Not logged in. Run `vercel login` first.");
1513
1534
  }
1514
1535
  }
1536
+ async function maybeConnectGit(deps, cwd) {
1537
+ if (!deps.existsSync((0, import_node_path6.join)(cwd, ".git"))) return;
1538
+ let remotes = await readGitRemotes(deps, cwd);
1539
+ if (remotes.length === 0) return;
1540
+ try {
1541
+ await deps.runOutput("vercel", ["git", "connect", "--yes"], cwd);
1542
+ deps.stdout.log("Connected Vercel project to Git repository.");
1543
+ } catch (error) {
1544
+ let message = error instanceof Error ? error.message : String(error);
1545
+ if (canSkipGitConnect(message)) return;
1546
+ throw new Error(`Could not connect Vercel project to Git. ${message}`);
1547
+ }
1548
+ }
1549
+ async function readGitRemotes(deps, cwd) {
1550
+ try {
1551
+ let output = await deps.runOutput("git", ["remote"], cwd);
1552
+ return output.split("\n").map((line) => line.trim()).filter(Boolean);
1553
+ } catch (error) {
1554
+ let message = error instanceof Error ? error.message : String(error);
1555
+ let normalized = message.toLowerCase();
1556
+ let code = error.code;
1557
+ if (code === "ENOENT" || normalized.includes("not a git repository") || normalized.includes("no such file or directory")) {
1558
+ return [];
1559
+ }
1560
+ throw error;
1561
+ }
1562
+ }
1563
+ function canSkipGitConnect(message) {
1564
+ let normalized = message.toLowerCase();
1565
+ return normalized.includes("already connected") || normalized.includes("connected git repository") || normalized.includes("no git remote") || normalized.includes("no remotes") || normalized.includes("push first") || normalized.includes("repository has not been pushed");
1566
+ }
1515
1567
 
1516
1568
  // src/utils/catalog.ts
1517
1569
  var DEFAULT_CATALOG_URL = "https://gistajs.com/manifests/starters.json";
@@ -1548,11 +1600,26 @@ async function readCliVersion() {
1548
1600
  if (false) {
1549
1601
  throw new Error("Could not resolve the installed gistajs version");
1550
1602
  }
1551
- return "0.1.12";
1603
+ return "0.2.0";
1552
1604
  }
1553
1605
  async function runProjectCommand(cwd, script) {
1554
1606
  await run("pnpm", [script], cwd);
1555
1607
  }
1608
+ async function assertCommandAvailable(cwd, command) {
1609
+ let installHint = installHints[command];
1610
+ await assertCommand(
1611
+ run,
1612
+ cwd,
1613
+ command,
1614
+ ["--help"],
1615
+ installHint ? `Required command not found: ${command}. ${installHint}` : `Required command not found: ${command}`
1616
+ );
1617
+ }
1618
+ var installHints = {
1619
+ atlas: "Install: https://atlasgo.io/guides/evaluation/install. If you have mise installed: `mise use -g atlas`",
1620
+ turso: "Install: https://docs.turso.tech/cli/installation. If you have mise installed: `mise use -g turso`",
1621
+ vercel: "Install: https://vercel.com/docs/cli. If you have mise installed: `mise use -g npm:vercel`"
1622
+ };
1556
1623
  async function readDefaultProvisionRegion() {
1557
1624
  try {
1558
1625
  let response = await fetch("https://region.turso.io");
@@ -1588,7 +1655,8 @@ var defaultDeps4 = {
1588
1655
  cwd: import_node_process5.default.cwd(),
1589
1656
  getCliVersion: readCliVersion,
1590
1657
  getDefaultProvisionRegion: readDefaultProvisionRegion,
1591
- runProjectCommand
1658
+ runProjectCommand,
1659
+ assertCommandAvailable
1592
1660
  };
1593
1661
 
1594
1662
  // src/cli.ts
package/dist/index.d.ts CHANGED
@@ -142,6 +142,7 @@ type CliDeps = {
142
142
  getCliVersion: () => Promise<string>;
143
143
  getDefaultProvisionRegion: () => Promise<string | null>;
144
144
  runProjectCommand: (cwd: string, script: string) => Promise<void>;
145
+ assertCommandAvailable: (cwd: string, command: string) => Promise<void>;
145
146
  };
146
147
 
147
148
  declare function runCli(argv?: string[], deps?: CliDeps): Promise<void>;
package/dist/index.js CHANGED
@@ -151,6 +151,17 @@ async function runInput(command, args, cwd, input) {
151
151
  input
152
152
  });
153
153
  }
154
+ async function assertCommand(runFn, cwd, command, args, failureMessage) {
155
+ try {
156
+ await runFn(command, args, cwd);
157
+ } catch (error) {
158
+ let code = error.code;
159
+ if (code === "ENOENT") {
160
+ throw new Error(`Required command not found: ${command}`);
161
+ }
162
+ throw new Error(failureMessage);
163
+ }
164
+ }
154
165
  async function exec(command, args, cwd, options) {
155
166
  return await new Promise((resolve2, reject) => {
156
167
  let { capture, input } = options;
@@ -319,7 +330,7 @@ async function runCreateCommand(argv, deps) {
319
330
  let root = await deps.createProject(starter, options);
320
331
  deps.stdout.log(
321
332
  `
322
- ${c.brand("gistajs")} ${c.success("Created")} ${c.slug(starter.slug)} project in ${c.path(root)}
333
+ ${c.brand("gistajs")} created ${c.slug(starter.slug)} project in ${c.path(root)}
323
334
  `
324
335
  );
325
336
  }
@@ -1116,6 +1127,7 @@ async function runProjectProvision(deps) {
1116
1127
  }
1117
1128
  let cliVersion = await deps.getCliVersion();
1118
1129
  assertCliVersion(cliVersion, requirement);
1130
+ await assertProviderCommands(providers, deps);
1119
1131
  let region = await resolveProjectRegion(pkg, deps);
1120
1132
  await writeProjectRegion(pkg, region.id, deps);
1121
1133
  let summary = {
@@ -1146,6 +1158,14 @@ async function runProjectProvision(deps) {
1146
1158
  }
1147
1159
  printSummary(summary, deps);
1148
1160
  }
1161
+ async function assertProviderCommands(providers, deps) {
1162
+ let commands = providers.filter(
1163
+ (provider) => provider === "turso" || provider === "vercel"
1164
+ );
1165
+ for (let command of new Set(commands)) {
1166
+ await deps.assertCommandAvailable(deps.cwd, command);
1167
+ }
1168
+ }
1149
1169
  async function readProvisionPackage(deps) {
1150
1170
  return await readProjectPackage(deps.cwd, deps.readFile);
1151
1171
  }
@@ -1446,6 +1466,7 @@ async function provisionVercel(cwd, region, deps = defaultDeps3) {
1446
1466
  deps.stdout.log("Linking this directory to a Vercel project...");
1447
1467
  await deps.run("vercel", ["link", "--yes"], cwd);
1448
1468
  }
1469
+ await maybeConnectGit(deps, cwd);
1449
1470
  let envPath = join6(cwd, ".env");
1450
1471
  let file = await readEnvFile(envPath, deps);
1451
1472
  let values = requiredEnvVars.map((key) => [key, getRequiredEnvVar(file, key)]);
@@ -1497,6 +1518,37 @@ async function assertLoggedIn2(deps, cwd) {
1497
1518
  throw new Error("Not logged in. Run `vercel login` first.");
1498
1519
  }
1499
1520
  }
1521
+ async function maybeConnectGit(deps, cwd) {
1522
+ if (!deps.existsSync(join6(cwd, ".git"))) return;
1523
+ let remotes = await readGitRemotes(deps, cwd);
1524
+ if (remotes.length === 0) return;
1525
+ try {
1526
+ await deps.runOutput("vercel", ["git", "connect", "--yes"], cwd);
1527
+ deps.stdout.log("Connected Vercel project to Git repository.");
1528
+ } catch (error) {
1529
+ let message = error instanceof Error ? error.message : String(error);
1530
+ if (canSkipGitConnect(message)) return;
1531
+ throw new Error(`Could not connect Vercel project to Git. ${message}`);
1532
+ }
1533
+ }
1534
+ async function readGitRemotes(deps, cwd) {
1535
+ try {
1536
+ let output = await deps.runOutput("git", ["remote"], cwd);
1537
+ return output.split("\n").map((line) => line.trim()).filter(Boolean);
1538
+ } catch (error) {
1539
+ let message = error instanceof Error ? error.message : String(error);
1540
+ let normalized = message.toLowerCase();
1541
+ let code = error.code;
1542
+ if (code === "ENOENT" || normalized.includes("not a git repository") || normalized.includes("no such file or directory")) {
1543
+ return [];
1544
+ }
1545
+ throw error;
1546
+ }
1547
+ }
1548
+ function canSkipGitConnect(message) {
1549
+ let normalized = message.toLowerCase();
1550
+ return normalized.includes("already connected") || normalized.includes("connected git repository") || normalized.includes("no git remote") || normalized.includes("no remotes") || normalized.includes("push first") || normalized.includes("repository has not been pushed");
1551
+ }
1500
1552
 
1501
1553
  // src/utils/catalog.ts
1502
1554
  var DEFAULT_CATALOG_URL = "https://gistajs.com/manifests/starters.json";
@@ -1533,11 +1585,26 @@ async function readCliVersion() {
1533
1585
  if (false) {
1534
1586
  throw new Error("Could not resolve the installed gistajs version");
1535
1587
  }
1536
- return "0.1.12";
1588
+ return "0.2.0";
1537
1589
  }
1538
1590
  async function runProjectCommand(cwd, script) {
1539
1591
  await run("pnpm", [script], cwd);
1540
1592
  }
1593
+ async function assertCommandAvailable(cwd, command) {
1594
+ let installHint = installHints[command];
1595
+ await assertCommand(
1596
+ run,
1597
+ cwd,
1598
+ command,
1599
+ ["--help"],
1600
+ installHint ? `Required command not found: ${command}. ${installHint}` : `Required command not found: ${command}`
1601
+ );
1602
+ }
1603
+ var installHints = {
1604
+ atlas: "Install: https://atlasgo.io/guides/evaluation/install. If you have mise installed: `mise use -g atlas`",
1605
+ turso: "Install: https://docs.turso.tech/cli/installation. If you have mise installed: `mise use -g turso`",
1606
+ vercel: "Install: https://vercel.com/docs/cli. If you have mise installed: `mise use -g npm:vercel`"
1607
+ };
1541
1608
  async function readDefaultProvisionRegion() {
1542
1609
  try {
1543
1610
  let response = await fetch("https://region.turso.io");
@@ -1573,7 +1640,8 @@ var defaultDeps4 = {
1573
1640
  cwd: process5.cwd(),
1574
1641
  getCliVersion: readCliVersion,
1575
1642
  getDefaultProvisionRegion: readDefaultProvisionRegion,
1576
- runProjectCommand
1643
+ runProjectCommand,
1644
+ assertCommandAvailable
1577
1645
  };
1578
1646
 
1579
1647
  // src/cli.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gistajs",
3
- "version": "0.1.12",
3
+ "version": "0.2.0",
4
4
  "description": "Scaffold and manage Gista.js starter projects",
5
5
  "keywords": [
6
6
  "cli",