zerostart-cli 0.0.25 → 0.0.26
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 +3 -131
- 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.26');
|
|
87
87
|
program
|
|
88
88
|
.command('deploy-vercel')
|
|
89
89
|
.description('Deploy the current project to Vercel')
|
|
@@ -493,12 +493,12 @@ program
|
|
|
493
493
|
type: 'list',
|
|
494
494
|
name: 'deploymentTarget',
|
|
495
495
|
message: 'Select Deployment Provider:',
|
|
496
|
-
choices: ['Vercel', '
|
|
496
|
+
choices: ['Vercel', 'None'],
|
|
497
497
|
default: 'None'
|
|
498
498
|
}
|
|
499
499
|
]);
|
|
500
500
|
// 4. Install Dependencies & Build (Required for Deployment)
|
|
501
|
-
if (deploymentTarget !== 'None') {
|
|
501
|
+
if (deploymentTarget !== 'None' && config.language !== types_1.ProjectLanguage.HTMLCSS) {
|
|
502
502
|
console.log();
|
|
503
503
|
const iSpinner = (0, ora_1.default)('Installing dependencies...').start();
|
|
504
504
|
try {
|
|
@@ -598,134 +598,6 @@ program
|
|
|
598
598
|
}
|
|
599
599
|
}
|
|
600
600
|
}
|
|
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
601
|
if (!answers.createRemote || !githubToken && authMethod !== 'GitHub CLI') {
|
|
730
602
|
console.log(chalk_1.default.bold.yellow(' To push to GitHub later:'));
|
|
731
603
|
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++";
|