zerostart-cli 0.0.11 → 0.0.13

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/out/cli.js CHANGED
@@ -48,6 +48,7 @@ const TemplateManager_1 = require("./managers/TemplateManager");
48
48
  const GitManager_1 = require("./managers/GitManager");
49
49
  const GitHubServiceCLI_1 = require("./services/GitHubServiceCLI");
50
50
  const VercelManager_1 = require("./managers/VercelManager");
51
+ const NetlifyManager_1 = require("./managers/NetlifyManager");
51
52
  const child_process_1 = require("child_process");
52
53
  const program = new commander_1.Command();
53
54
  // Basic ASCII banner for maximum compatibility
@@ -277,56 +278,155 @@ program
277
278
  console.log(chalk_1.default.gray(' - ') + chalk_1.default.cyan(`cd ${name}`));
278
279
  console.log(chalk_1.default.gray(' - ') + chalk_1.default.cyan('code .') + chalk_1.default.gray(' (or your favorite editor)'));
279
280
  console.log();
280
- // Vercel Integration
281
- const vercelManager = new VercelManager_1.VercelManager();
282
- let vercelInstalled = await vercelManager.checkVercelInstalled();
283
- if (!vercelInstalled) {
284
- console.log();
285
- const { installVercel } = await inquirer_1.default.prompt([
286
- {
287
- type: 'confirm',
288
- name: 'installVercel',
289
- message: 'Vercel CLI not found. Install it globally?',
290
- default: false
281
+ // Deployment Integration
282
+ const { deploymentTarget } = await inquirer_1.default.prompt([
283
+ {
284
+ type: 'list',
285
+ name: 'deploymentTarget',
286
+ message: 'Select Deployment Provider:',
287
+ choices: ['Vercel', 'Netlify', 'None'],
288
+ default: 'None'
289
+ }
290
+ ]);
291
+ if (deploymentTarget === 'Vercel') {
292
+ const vercelManager = new VercelManager_1.VercelManager();
293
+ let vercelInstalled = await vercelManager.checkVercelInstalled();
294
+ if (!vercelInstalled) {
295
+ console.log();
296
+ const { installVercel } = await inquirer_1.default.prompt([
297
+ {
298
+ type: 'confirm',
299
+ name: 'installVercel',
300
+ message: 'Vercel CLI not found. Install it globally?',
301
+ default: false
302
+ }
303
+ ]);
304
+ if (installVercel) {
305
+ const iSpinner = (0, ora_1.default)('Installing Vercel CLI...').start();
306
+ const installed = await vercelManager.installGlobal();
307
+ if (installed) {
308
+ iSpinner.succeed(chalk_1.default.green('Vercel CLI installed!'));
309
+ vercelInstalled = true;
310
+ }
311
+ else {
312
+ iSpinner.fail(chalk_1.default.red('Failed to install Vercel CLI.'));
313
+ }
291
314
  }
292
- ]);
293
- if (installVercel) {
294
- const iSpinner = (0, ora_1.default)('Installing Vercel CLI...').start();
295
- const installed = await vercelManager.installGlobal();
296
- if (installed) {
297
- iSpinner.succeed(chalk_1.default.green('Vercel CLI installed!'));
298
- vercelInstalled = true;
315
+ }
316
+ if (vercelInstalled) {
317
+ // Check Auth
318
+ const vSpinner = (0, ora_1.default)('Checking Vercel authentication...').start();
319
+ const loggedIn = await vercelManager.checkAuth();
320
+ if (!loggedIn) {
321
+ vSpinner.stop();
322
+ console.log(chalk_1.default.yellow('\n Authentication required to deploy.'));
323
+ const { doLogin } = await inquirer_1.default.prompt([
324
+ {
325
+ type: 'confirm',
326
+ name: 'doLogin',
327
+ message: 'Log in to Vercel now?',
328
+ default: true
329
+ }
330
+ ]);
331
+ if (doLogin) {
332
+ console.log(chalk_1.default.gray(' Opening Vercel login...'));
333
+ const loginSuccess = await vercelManager.login();
334
+ if (!loginSuccess) {
335
+ console.log(chalk_1.default.red('\n Login failed. Skipping deployment.'));
336
+ return;
337
+ }
338
+ console.log(chalk_1.default.green('\n Successfully logged in!'));
339
+ }
340
+ else {
341
+ console.log(chalk_1.default.yellow(' Skipping deployment (not logged in).'));
342
+ return;
343
+ }
299
344
  }
300
345
  else {
301
- iSpinner.fail(chalk_1.default.red('Failed to install Vercel CLI.'));
302
- }
303
- }
304
- }
305
- if (vercelInstalled) {
306
- console.log();
307
- const { deployVercel } = await inquirer_1.default.prompt([
308
- {
309
- type: 'confirm',
310
- name: 'deployVercel',
311
- message: 'Would you like to deploy to Vercel?',
312
- default: false
346
+ vSpinner.succeed(chalk_1.default.green('Authenticated with Vercel'));
313
347
  }
314
- ]);
315
- if (deployVercel) {
316
- const vSpinner = (0, ora_1.default)('Deploying to Vercel...').start();
317
- // We need to be inside the project directory for vercel deploy
318
- // but our process.cwd() is outside. passing cwd to exec is crucial.
348
+ const dSpinner = (0, ora_1.default)('Deploying to Vercel...').start();
319
349
  const deploymentUrl = await vercelManager.deploy(config.path);
320
350
  if (deploymentUrl) {
321
- vSpinner.succeed(chalk_1.default.green('Deployed to Vercel!'));
351
+ dSpinner.succeed(chalk_1.default.green('Deployed to Vercel!'));
322
352
  console.log(chalk_1.default.gray(' URL: ') + chalk_1.default.cyan(deploymentUrl));
323
353
  }
324
354
  else {
325
- vSpinner.fail(chalk_1.default.red('Vercel deployment failed'));
355
+ dSpinner.fail(chalk_1.default.red('Vercel deployment failed'));
326
356
  console.log(chalk_1.default.gray(' Try running ') + chalk_1.default.cyan('vercel deploy') + chalk_1.default.gray(' manually inside the project folder.'));
327
357
  }
328
358
  }
329
359
  }
360
+ else if (deploymentTarget === 'Netlify') {
361
+ const netlifyManager = new NetlifyManager_1.NetlifyManager();
362
+ let netlifyInstalled = await netlifyManager.checkNetlifyInstalled();
363
+ if (!netlifyInstalled) {
364
+ console.log();
365
+ const { installNetlify } = await inquirer_1.default.prompt([
366
+ {
367
+ type: 'confirm',
368
+ name: 'installNetlify',
369
+ message: 'Netlify CLI not found. Install it globally?',
370
+ default: false
371
+ }
372
+ ]);
373
+ if (installNetlify) {
374
+ const nSpinner = (0, ora_1.default)('Installing Netlify CLI...').start();
375
+ const installed = await netlifyManager.installGlobal();
376
+ if (installed) {
377
+ nSpinner.succeed(chalk_1.default.green('Netlify CLI installed!'));
378
+ netlifyInstalled = true;
379
+ }
380
+ else {
381
+ nSpinner.fail(chalk_1.default.red('Failed to install Netlify CLI.'));
382
+ }
383
+ }
384
+ }
385
+ if (netlifyInstalled) {
386
+ // Check Auth
387
+ const nSpinner = (0, ora_1.default)('Checking Netlify authentication...').start();
388
+ const loggedIn = await netlifyManager.checkAuth();
389
+ if (!loggedIn) {
390
+ nSpinner.stop();
391
+ console.log(chalk_1.default.yellow('\n Authentication required to deploy.'));
392
+ const { doLogin } = await inquirer_1.default.prompt([
393
+ {
394
+ type: 'confirm',
395
+ name: 'doLogin',
396
+ message: 'Log in to Netlify now?',
397
+ default: true
398
+ }
399
+ ]);
400
+ if (doLogin) {
401
+ console.log(chalk_1.default.gray(' Opening Netlify login...'));
402
+ const loginSuccess = await netlifyManager.login();
403
+ if (!loginSuccess) {
404
+ console.log(chalk_1.default.red('\n Login failed. Skipping deployment.'));
405
+ return;
406
+ }
407
+ console.log(chalk_1.default.green('\n Successfully logged in!'));
408
+ }
409
+ else {
410
+ console.log(chalk_1.default.yellow(' Skipping deployment (not logged in).'));
411
+ return;
412
+ }
413
+ }
414
+ else {
415
+ nSpinner.succeed(chalk_1.default.green('Authenticated with Netlify'));
416
+ }
417
+ const dSpinner = (0, ora_1.default)('Deploying to Netlify...').start();
418
+ const deploymentOutput = await netlifyManager.deploy(config.path);
419
+ if (deploymentOutput) {
420
+ dSpinner.succeed(chalk_1.default.green('Deployed to Netlify!'));
421
+ // Netlify output is verbose, maybe just say success
422
+ console.log(chalk_1.default.gray(' Check output for URL or run ') + chalk_1.default.cyan('netlify open'));
423
+ }
424
+ else {
425
+ dSpinner.fail(chalk_1.default.red('Netlify deployment failed'));
426
+ console.log(chalk_1.default.gray(' Try running ') + chalk_1.default.cyan('netlify login') + chalk_1.default.gray(' and ') + chalk_1.default.cyan('netlify deploy') + chalk_1.default.gray(' manually.'));
427
+ }
428
+ }
429
+ }
330
430
  if (!answers.createRemote || !githubToken && authMethod !== 'GitHub CLI') {
331
431
  console.log(chalk_1.default.bold.yellow(' To push to GitHub later:'));
332
432
  console.log(chalk_1.default.gray(' - Create a repository on GitHub'));
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NetlifyManager = void 0;
37
+ const cp = __importStar(require("child_process"));
38
+ const util = __importStar(require("util"));
39
+ const child_process_1 = require("child_process");
40
+ const exec = util.promisify(cp.exec);
41
+ class NetlifyManager {
42
+ async checkNetlifyInstalled() {
43
+ try {
44
+ await exec('netlify --version');
45
+ return true;
46
+ }
47
+ catch (error) {
48
+ return false;
49
+ }
50
+ }
51
+ async installGlobal() {
52
+ try {
53
+ await exec('npm install -g netlify-cli');
54
+ return true;
55
+ }
56
+ catch (error) {
57
+ console.error('Failed to install Netlify CLI globally');
58
+ return false;
59
+ }
60
+ }
61
+ async deploy(cwd) {
62
+ try {
63
+ // netlify deploy --prod
64
+ // This might require login. If not logged in, it will fail or prompt.
65
+ // In a non-interactive shell or without TTY, prompts might fail.
66
+ // We assume the user can handle the auth flow if triggered, or we catch the error.
67
+ const { stdout } = await exec('netlify deploy --prod --json', { cwd });
68
+ // Parse JSON output to find the deploy URL if possible, or just return success message
69
+ // Netlify output is complex. simpler:
70
+ return stdout.trim();
71
+ }
72
+ catch (error) {
73
+ // If failure is due to login, we might want to tell them.
74
+ console.error(`Netlify deployment setup failed: ${error.message}`);
75
+ return null;
76
+ }
77
+ }
78
+ async checkAuth() {
79
+ try {
80
+ await exec('netlify status');
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ async login() {
88
+ return new Promise((resolve) => {
89
+ const child = (0, child_process_1.spawn)('netlify', ['login'], { stdio: 'inherit' });
90
+ child.on('close', (code) => {
91
+ resolve(code === 0);
92
+ });
93
+ });
94
+ }
95
+ }
96
+ exports.NetlifyManager = NetlifyManager;
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.VercelManager = void 0;
37
37
  const cp = __importStar(require("child_process"));
38
38
  const util = __importStar(require("util"));
39
+ const child_process_1 = require("child_process");
39
40
  const exec = util.promisify(cp.exec);
40
41
  class VercelManager {
41
42
  async checkVercelInstalled() {
@@ -60,7 +61,7 @@ class VercelManager {
60
61
  return null;
61
62
  }
62
63
  }
63
- async login() {
64
+ async checkAuth() {
64
65
  try {
65
66
  // vercel login usually requires interaction. failing that, we check status.
66
67
  // simpler to just check if they can access user info
@@ -71,6 +72,14 @@ class VercelManager {
71
72
  return false;
72
73
  }
73
74
  }
75
+ async login() {
76
+ return new Promise((resolve) => {
77
+ const child = (0, child_process_1.spawn)('vercel', ['login'], { stdio: 'inherit' });
78
+ child.on('close', (code) => {
79
+ resolve(code === 0);
80
+ });
81
+ });
82
+ }
74
83
  async installGlobal() {
75
84
  try {
76
85
  await exec('npm install -g vercel');
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "zerostart": "./out/cli.js"
6
6
  },
7
7
  "description": "Create and deploy a complete project with one command.",
8
- "version": "0.0.11",
8
+ "version": "0.0.13",
9
9
  "engines": {
10
10
  "vscode": "^1.85.0"
11
11
  },