create-letswhim 2.0.1 → 2.0.2

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.
Files changed (2) hide show
  1. package/index.js +67 -39
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -5,34 +5,61 @@ import fs from 'fs';
5
5
  import pc from 'picocolors';
6
6
  import prompts from 'prompts';
7
7
 
8
- // --- Fungsi Animasi Spinner (Efek Gerak) ---
9
- function createSpinner(message) {
10
- const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
11
- let i = 0;
12
- const interval = setInterval(() => {
13
- process.stdout.write(`\r${pc.blue(frames[i])} ${pc.gray(message)}`);
14
- i = (i + 1) % frames.length;
15
- }, 80);
16
-
17
- return {
18
- stop: (success = true) => {
19
- clearInterval(interval);
20
- process.stdout.write('\r'); // Bersihkan baris
21
- if (success) {
22
- console.log(`${pc.blue('✓')} ${pc.gray(message)}`);
23
- } else {
24
- console.log(`${pc.red('×')} ${pc.gray(message)}`);
25
- }
8
+ // --- FRAME 1: Orang Jalan di Tempat Bawa Papan ---
9
+ const walkingFrames = [
10
+ ` ${pc.blue(' ( ) ')}
11
+ ${pc.blue(' /| |\\ ')}
12
+ ${pc.blue(' / \\ ')}
13
+ ${pc.cyan('~~~~~~~~~~')}`,
14
+ ` ${pc.blue(' ( ) ')}
15
+ ${pc.blue(' | |/ ')}
16
+ ${pc.blue(' | | ')}
17
+ ${pc.cyan('~~~~~~~~~~')}`
18
+ ];
19
+
20
+ // --- FRAME 2: Orang Menerjang Ombak (Victory) ---
21
+ const surfingArt = `
22
+ ${pc.blue(' ( ) /')}
23
+ ${pc.blue(' /| |/')}
24
+ ${pc.blue(' /_|_|/')} ${pc.white("let's just start")}
25
+ ${pc.cyan('~')} ${pc.blue(' / \\')}
26
+ ${pc.cyan('~~~')} ${pc.blue(' / \\')}
27
+ ${pc.cyan('~~~~~')} ${pc.blue(' / \\')}
28
+ ${pc.cyan('~~~~~~~~~~~~~~~~~~~~~~~~~~~~')}
29
+ `;
30
+
31
+ async function startLoading(message) {
32
+ const total = 40;
33
+ let frameIndex = 0;
34
+ console.log('\n\n\n\n');
35
+
36
+ for (let i = 0; i <= total; i++) {
37
+ const percent = Math.round((i / total) * 100);
38
+ const bar = pc.blue('█').repeat(i) + pc.gray('░').repeat(total - i);
39
+
40
+ // Reset kursor ke atas (5 baris)
41
+ process.stdout.write('\u001b[5A');
42
+
43
+ // Render Frame Jalan
44
+ console.log(walkingFrames[frameIndex]);
45
+
46
+ // Render Progress Bar
47
+ console.log(`${pc.cyan('▹')} ${pc.white(message)}`);
48
+ process.stdout.write(` ${bar} ${pc.blue(percent + '%')}\r`);
49
+
50
+ if (i % 3 === 0) frameIndex = frameIndex === 0 ? 1 : 0;
51
+ await new Promise(resolve => setTimeout(resolve, 50));
26
52
  }
27
- };
53
+ console.log('\n');
28
54
  }
29
55
 
30
56
  async function init() {
31
- // Header - NASA Blue Style
32
- console.log(`\n${pc.bold(pc.blue('🌊 LETSWHIM'))} ${pc.gray('v1.1.6')}`);
57
+ // Clear Terminal Biar Aesthetic
58
+ process.stdout.write('\x1Bc');
59
+
60
+ console.log(`\n${pc.bold(pc.blue('🌊 LETSWHIM'))} ${pc.gray('v2.0.2')}`);
33
61
  console.log(`${pc.white('The Ultralight Web Engine for Modern Logic')}\n`);
34
62
 
35
- // 1. Tanya nama project (Interaktif ala Astro)
36
63
  const response = await prompts({
37
64
  type: 'text',
38
65
  name: 'projectName',
@@ -49,39 +76,40 @@ async function init() {
49
76
  process.exit(1);
50
77
  }
51
78
 
52
- console.log(''); // Spasi baris
53
-
54
- // 2. Mulai Animasi "Gerak" (Spinning)
55
- const loader = createSpinner('Syncing LetsWhim template...');
79
+ // 1. ANIMASI JALAN DI TEMPAT
80
+ await startLoading('Preparing your surfboard...');
56
81
 
57
82
  try {
58
- // Proses Clone
83
+ // 2. PROSES CLONE
84
+ process.stdout.write(`${pc.blue('▹')} ${pc.gray('Catching the waves (Cloning template)...')}`);
59
85
  execSync(`git clone ${repoUrl} "${projectName}"`, { stdio: 'ignore' });
60
86
 
61
- // Bersihkan Git lama
87
+ // 3. PAKSA HAPUS .GIT (Anti ENOTEMPTY)
62
88
  const gitFolder = path.join(targetDir, '.git');
63
89
  if (fs.existsSync(gitFolder)) {
64
- fs.rmSync(gitFolder, { recursive: true, force: true });
90
+ try {
91
+ fs.rmSync(gitFolder, { recursive: true, force: true });
92
+ } catch (e) {
93
+ const cmd = process.platform === 'win32' ? `rmdir /s /q "${gitFolder}"` : `rm -rf "${gitFolder}"`;
94
+ execSync(cmd);
95
+ }
65
96
  }
66
97
 
67
- // Stop animasi dengan tanda sukses
68
- loader.stop(true);
98
+ // 4. DISPLAY SURFER MENERJANG OMBAK
99
+ console.log(`\n\n${pc.bold(pc.blue('🚀 MISSION ACCOMPLISHED'))}`);
100
+ console.log(surfingArt);
69
101
 
70
- // 3. Pesan Final & Instruksi
71
- console.log(`\n${pc.bold(pc.blue('🚀 MISSION ACCOMPLISHED'))}`);
72
- console.log(`${pc.gray('Your project is ready at')} ${pc.cyan(`./${projectName}`)}`);
102
+ console.log(`${pc.gray('Project created at')} ${pc.cyan(`./${projectName}`)}`);
73
103
 
74
- console.log(`\n${pc.bold(pc.white('Next steps:'))}`);
104
+ console.log(`\n${pc.bold(pc.white('Next steps to surf:'))}`);
75
105
  console.log(` ${pc.blue('1.')} cd ${pc.white(projectName)}`);
76
106
  console.log(` ${pc.blue('2.')} npm install`);
77
107
  console.log(` ${pc.blue('3.')} npm run dev`);
78
108
 
79
- console.log(`\n${pc.gray('Note: Start editing in')} ${pc.blue('start/pages/index.lw')}`);
80
- console.log(`${pc.gray('Happy hacking, Rifky! 🏄‍♂️')}\n`);
109
+ console.log(`\n${pc.gray("Happy surfing, Developer!")} 🏄‍♂️\n`);
81
110
 
82
111
  } catch (error) {
83
- loader.stop(false);
84
- console.log(`\n${pc.red('✖')} ${pc.bold('Launch aborted:')} ${error.message}`);
112
+ console.log(`\n${pc.red('✖')} ${pc.bold('Wipeout! (Error):')} ${pc.gray(error.message)}`);
85
113
  }
86
114
  }
87
115
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-letswhim",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "The official ultralight CLI to initialize your LetsWhim project in seconds.",
5
5
  "type": "module",
6
6
  "main": "index.js",