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 +21 -132
- package/out/managers/TemplateManager.js +56 -0
- package/out/types.js +1 -0
- package/package.json +1 -1
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.
|
|
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
|
-
//
|
|
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', '
|
|
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++";
|