zerostart-cli 0.0.25 → 0.0.27

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
@@ -83,7 +83,7 @@ function showGitHubTokenHelp() {
83
83
  program
84
84
  .name('zerostart')
85
85
  .description('Create and deploy a complete project with one command')
86
- .version('0.0.25');
86
+ .version('0.0.27');
87
87
  program
88
88
  .command('deploy-vercel')
89
89
  .description('Deploy the current project to Vercel')
@@ -487,18 +487,35 @@ program
487
487
  console.log(chalk_1.default.gray(' - ') + chalk_1.default.cyan(`cd ${name}`));
488
488
  console.log(chalk_1.default.gray(' - ') + chalk_1.default.cyan('code .') + chalk_1.default.gray(' (or your favorite editor)'));
489
489
  console.log();
490
- // Deployment Integration
490
+ // Conditional logic based on language
491
+ const isWebLanguage = [types_1.ProjectLanguage.React, types_1.ProjectLanguage.HTMLCSS].includes(config.language);
492
+ if (!isWebLanguage) {
493
+ const gdbLinks = {
494
+ [types_1.ProjectLanguage.Python]: 'https://www.onlinegdb.com/online_python_compiler',
495
+ [types_1.ProjectLanguage.Java]: 'https://www.onlinegdb.com/online_java_compiler',
496
+ [types_1.ProjectLanguage.CPP]: 'https://www.onlinegdb.com/online_c++_compiler',
497
+ [types_1.ProjectLanguage.NodeJS]: 'https://www.onlinegdb.com/online_node.js_compiler'
498
+ };
499
+ const link = gdbLinks[config.language];
500
+ if (link) {
501
+ console.log(chalk_1.default.bold.yellow(' Practice Online:'));
502
+ console.log(chalk_1.default.gray(' - ') + chalk_1.default.cyan(link));
503
+ console.log();
504
+ }
505
+ return; // Skip deployment for non-web languages
506
+ }
507
+ // Deployment Integration (Only for Web)
491
508
  const { deploymentTarget } = await inquirer_1.default.prompt([
492
509
  {
493
510
  type: 'list',
494
511
  name: 'deploymentTarget',
495
512
  message: 'Select Deployment Provider:',
496
- choices: ['Vercel', 'Netlify', 'None'],
513
+ choices: ['Vercel', 'None'],
497
514
  default: 'None'
498
515
  }
499
516
  ]);
500
517
  // 4. Install Dependencies & Build (Required for Deployment)
501
- if (deploymentTarget !== 'None') {
518
+ if (deploymentTarget !== 'None' && config.language !== types_1.ProjectLanguage.HTMLCSS) {
502
519
  console.log();
503
520
  const iSpinner = (0, ora_1.default)('Installing dependencies...').start();
504
521
  try {
@@ -598,134 +615,6 @@ program
598
615
  }
599
616
  }
600
617
  }
601
- else if (deploymentTarget === 'Netlify') {
602
- const netlifyManager = new NetlifyManager_1.NetlifyManager();
603
- let netlifyInstalled = await netlifyManager.checkNetlifyInstalled();
604
- if (!netlifyInstalled) {
605
- console.log();
606
- const { installNetlify } = await inquirer_1.default.prompt([
607
- {
608
- type: 'confirm',
609
- name: 'installNetlify',
610
- message: 'Netlify CLI not found. Install it globally?',
611
- default: false
612
- }
613
- ]);
614
- if (installNetlify) {
615
- const nSpinner = (0, ora_1.default)('Installing Netlify CLI...').start();
616
- const installed = await netlifyManager.installGlobal();
617
- if (installed) {
618
- nSpinner.succeed(chalk_1.default.green('Netlify CLI installed!'));
619
- netlifyInstalled = true;
620
- }
621
- else {
622
- nSpinner.fail(chalk_1.default.red('Failed to install Netlify CLI.'));
623
- }
624
- }
625
- }
626
- if (netlifyInstalled) {
627
- // Check Auth
628
- const nSpinner = (0, ora_1.default)('Checking Netlify authentication...').start();
629
- const loggedIn = await netlifyManager.checkAuth();
630
- if (!loggedIn) {
631
- nSpinner.stop();
632
- console.log(chalk_1.default.yellow('\n Authentication required to deploy.'));
633
- const { doLogin } = await inquirer_1.default.prompt([
634
- {
635
- type: 'confirm',
636
- name: 'doLogin',
637
- message: 'Log in to Netlify now?',
638
- default: true
639
- }
640
- ]);
641
- if (doLogin) {
642
- console.log(chalk_1.default.gray(' Opening Netlify login...'));
643
- const loginSuccess = await netlifyManager.login();
644
- if (!loginSuccess) {
645
- console.log(chalk_1.default.red('\n Login failed. Skipping deployment.'));
646
- return;
647
- }
648
- console.log(chalk_1.default.green('\n Successfully logged in!'));
649
- }
650
- else {
651
- console.log(chalk_1.default.yellow(' Skipping deployment (not logged in).'));
652
- return;
653
- }
654
- }
655
- else {
656
- nSpinner.succeed(chalk_1.default.green('Authenticated with Netlify'));
657
- }
658
- const dSpinner = (0, ora_1.default)('Deploying to Netlify...').start();
659
- dSpinner.stop(); // Stop spinner to allow interactive input
660
- // Try to create site first to enforce name
661
- console.log();
662
- console.log(chalk_1.default.cyan(` Configuring Netlify site for "${config.name}"...`));
663
- // We do this interactively so if name is taken user can see error and handle it (or it just links if they own it)
664
- let siteName = config.name;
665
- let siteCreated = false;
666
- let activeSiteId = undefined;
667
- while (!siteCreated) {
668
- const result = await netlifyManager.createSite(siteName, config.path);
669
- if (result.success) {
670
- siteCreated = true;
671
- activeSiteId = result.siteId;
672
- }
673
- else if (result.reason === 'taken') {
674
- console.log(chalk_1.default.yellow(`\n The site name "${siteName}" is already taken.`));
675
- const { newName } = await inquirer_1.default.prompt([{
676
- type: 'input',
677
- name: 'newName',
678
- message: 'Enter a unique name for your Netlify site:',
679
- validate: (input) => {
680
- if (input.trim() === '')
681
- return 'Name is required';
682
- if (!/^[a-zA-Z0-9-_]+$/.test(input))
683
- return 'Use only letters, numbers, hyphens, and underscores';
684
- return true;
685
- }
686
- }]);
687
- siteName = newName;
688
- }
689
- else {
690
- console.log(chalk_1.default.red('\n Failed to create Netlify site. '));
691
- // Allow user to try to deploy anyway (maybe manual link?) or abort
692
- const { action } = await inquirer_1.default.prompt([{
693
- type: 'list',
694
- name: 'action',
695
- message: 'What would you like to do?',
696
- choices: ['Try again with a different name', 'Continue deployment (might fail or link to wrong site)', 'Abort']
697
- }]);
698
- if (action === 'Abort')
699
- return;
700
- if (action === 'Continue deployment (might fail or link to wrong site)')
701
- break;
702
- // If try again, ask for name
703
- const { retryName } = await inquirer_1.default.prompt([{
704
- type: 'input',
705
- name: 'retryName',
706
- message: 'Enter a unique name:',
707
- validate: (input) => {
708
- if (input.trim() === '')
709
- return 'Name is required';
710
- return true;
711
- }
712
- }]);
713
- siteName = retryName;
714
- }
715
- }
716
- const success = await netlifyManager.deploy(config.path, activeSiteId);
717
- if (success) {
718
- console.log();
719
- console.log(chalk_1.default.green(' ✔ Deployed to Netlify!'));
720
- console.log(chalk_1.default.gray(' Run ') + chalk_1.default.cyan('netlify open') + chalk_1.default.gray(' to view your site.'));
721
- }
722
- else {
723
- console.log();
724
- console.log(chalk_1.default.red(' ✖ Deployment failed'));
725
- 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.'));
726
- }
727
- }
728
- }
729
618
  if (!answers.createRemote || !githubToken && authMethod !== 'GitHub CLI') {
730
619
  console.log(chalk_1.default.bold.yellow(' To push to GitHub later:'));
731
620
  console.log(chalk_1.default.gray(' - Create a repository on GitHub'));
@@ -66,6 +66,9 @@ class TemplateManager {
66
66
  case types_1.ProjectLanguage.React:
67
67
  await this.createReactStructure(config);
68
68
  break;
69
+ case types_1.ProjectLanguage.HTMLCSS:
70
+ await this.createHTMLCSSStructure(config);
71
+ break;
69
72
  }
70
73
  }
71
74
  createTypeSpecificStructure(config) {
@@ -327,6 +330,59 @@ export default defineConfig({
327
330
  `);
328
331
  this.createNetlifyConfig(config);
329
332
  }
333
+ async createHTMLCSSStructure(config) {
334
+ fs.writeFileSync(path.join(config.path, 'index.html'), `
335
+ <!DOCTYPE html>
336
+ <html lang="en">
337
+ <head>
338
+ <meta charset="UTF-8">
339
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
340
+ <title>${config.name}</title>
341
+ <link rel="stylesheet" href="style.css">
342
+ </head>
343
+ <body>
344
+ <div class="container">
345
+ <h1>Welcome to ${config.name}</h1>
346
+ <p>This is a simple HTML/CSS project created by ZeroStart CLI!</p>
347
+ </div>
348
+ <script src="script.js"></script>
349
+ </body>
350
+ </html>
351
+ `);
352
+ fs.writeFileSync(path.join(config.path, 'style.css'), `
353
+ body {
354
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
355
+ background-color: #f4f4f9;
356
+ color: #333;
357
+ display: flex;
358
+ justify-content: center;
359
+ align-items: center;
360
+ height: 100vh;
361
+ margin: 0;
362
+ }
363
+
364
+ .container {
365
+ text-align: center;
366
+ background: white;
367
+ padding: 2rem;
368
+ border-radius: 8px;
369
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
370
+ }
371
+
372
+ h1 {
373
+ color: #007bff;
374
+ }
375
+ `);
376
+ fs.writeFileSync(path.join(config.path, 'script.js'), `
377
+ console.log("${config.name} initialized!");
378
+ `);
379
+ // No netlify.toml needed for static sites if direct deploy path is known,
380
+ // but we'll create a simple one for consistency.
381
+ const netlifyContent = `[build]
382
+ publish = "."
383
+ `;
384
+ fs.writeFileSync(path.join(config.path, 'netlify.toml'), netlifyContent);
385
+ }
330
386
  createNetlifyConfig(config) {
331
387
  // Only relevant for web apps (React, etc)
332
388
  // For now, we assume Vite + React
package/out/types.js CHANGED
@@ -5,6 +5,7 @@ var ProjectLanguage;
5
5
  (function (ProjectLanguage) {
6
6
  ProjectLanguage["NodeJS"] = "Node.js";
7
7
  ProjectLanguage["React"] = "React";
8
+ ProjectLanguage["HTMLCSS"] = "HTML/CSS";
8
9
  ProjectLanguage["Python"] = "Python";
9
10
  ProjectLanguage["Java"] = "Java";
10
11
  ProjectLanguage["CPP"] = "C++";
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.25",
8
+ "version": "0.0.27",
9
9
  "engines": {
10
10
  "vscode": "^1.85.0"
11
11
  },