create-fleetbo-project 1.0.5 → 1.0.6

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.
@@ -12,8 +12,7 @@ const projectName = process.argv[2];
12
12
  const tokenArgIndex = process.argv.indexOf('--token');
13
13
  const bootstrapToken = tokenArgIndex !== -1 ? process.argv[tokenArgIndex + 1] : null;
14
14
  const repoUrl = 'https://github.com/FleetFleetbo/dev.fleetbo.io/archive/refs/heads/main.zip';
15
- // ⚠️ REPLACE WITH YOUR bootstrapProject FUNCTION URL
16
- const bootstrapUrl = 'https://us-central1-myapp-259bf.cloudfunctions.net/bootstrapProject';
15
+ const bootstrapUrl = 'https://us-central1-myapp-259bf.cloudfunctions.net/bootstrapProject';
17
16
 
18
17
  // --- Validation ---
19
18
  if (!projectName || !bootstrapToken) {
@@ -26,49 +25,129 @@ if (!projectName || !bootstrapToken) {
26
25
  async function setupProject() {
27
26
  console.log(chalk.blue(`Creating your Fleetbo project "${projectName}"...`));
28
27
  const spinner = ora();
29
-
28
+
30
29
  try {
30
+ // 1. Fetch configuration
31
31
  spinner.start('Fetching secure configuration...');
32
32
  const response = await axios.post(bootstrapUrl, { token: bootstrapToken });
33
33
  const projectSecrets = response.data;
34
34
  spinner.succeed(chalk.green('Configuration retrieved!'));
35
+
36
+ console.log(chalk.dim('Config received:'), {
37
+ fleetboDB: projectSecrets.fleetboDB ? '✓' : '✗',
38
+ appId: projectSecrets.appId ? '✓' : '✗'
39
+ });
35
40
 
41
+ // 2. Download template
36
42
  spinner.start('Downloading template...');
37
- const responseStream = await new Promise((resolve, reject) => https.get(repoUrl, res => resolve(res)).on('error', err => reject(err)));
43
+ const responseStream = await new Promise((resolve, reject) =>
44
+ https.get(repoUrl, res => resolve(res)).on('error', err => reject(err))
45
+ );
38
46
  spinner.succeed(chalk.green('Template downloaded.'));
39
47
 
48
+ // 3. Unzip files
40
49
  spinner.start('Unzipping files...');
41
50
  await new Promise((resolve, reject) => {
42
- responseStream.pipe(unzipper.Extract({ path: '.' }))
43
- .on('finish', resolve).on('error', reject);
51
+ responseStream.pipe(unzipper.Extract({ path: '.' }))
52
+ .on('finish', resolve)
53
+ .on('error', reject);
44
54
  });
45
- fs.renameSync(`dev.fleetbo.io-main`, projectName);
46
- spinner.succeed(chalk.green('Files unzipped.'));
55
+
56
+ // Rename directory
57
+ const extractedDir = 'dev.fleetbo.io-main';
58
+ if (fs.existsSync(extractedDir)) {
59
+ fs.renameSync(extractedDir, projectName);
60
+ spinner.succeed(chalk.green('Files unzipped.'));
61
+ } else {
62
+ throw new Error(`Extracted directory not found: ${extractedDir}`);
63
+ }
47
64
 
48
- process.chdir(projectName);
65
+ // 4. Change to project directory
66
+ const projectPath = path.resolve(projectName);
67
+ process.chdir(projectPath);
68
+ console.log(chalk.dim(`Working directory: ${process.cwd()}`));
49
69
 
70
+ // 5. Configure project
50
71
  spinner.start('Configuring project...');
51
- const envContent = `REACT_APP_FLEETBO_DB_KEY="${projectSecrets.fleetboDB}"\nREACT_APP_ENTERPRISE_ID=${projectSecrets.appId}\n`;
52
- fs.writeFileSync('.env', envContent, 'utf8');
53
72
 
73
+ // Create .env file
74
+ const envContent = `REACT_APP_FLEETBO_DB_KEY="${projectSecrets.fleetboDB}"
75
+ REACT_APP_ENTERPRISE_ID=${projectSecrets.appId}
76
+ `;
77
+ const envPath = path.join(process.cwd(), '.env');
78
+ fs.writeFileSync(envPath, envContent, 'utf8');
79
+
80
+ // Verify .env was created
81
+ if (fs.existsSync(envPath)) {
82
+ console.log(chalk.green('✓ .env file created successfully'));
83
+ console.log(chalk.dim(` Location: ${envPath}`));
84
+ } else {
85
+ throw new Error('.env file was not created');
86
+ }
87
+
88
+ // Update package.json
54
89
  const packageJsonPath = path.join(process.cwd(), 'package.json');
55
90
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
56
91
  packageJson.name = projectName;
57
92
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8');
93
+
58
94
  spinner.succeed(chalk.green('Project configured.'));
59
95
 
96
+ // 6. Create .env.example for reference
97
+ const envExampleContent = `# Fleetbo Configuration
98
+ # These values are automatically configured during project setup
99
+ REACT_APP_FLEETBO_DB_KEY="your-fleetbo-db-key"
100
+ REACT_APP_ENTERPRISE_ID=your-app-id
101
+ `;
102
+ fs.writeFileSync('.env.example', envExampleContent, 'utf8');
103
+ console.log(chalk.dim('✓ .env.example created'));
104
+
105
+ // 7. Ensure .gitignore includes .env
106
+ const gitignorePath = path.join(process.cwd(), '.gitignore');
107
+ if (fs.existsSync(gitignorePath)) {
108
+ let gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');
109
+ if (!gitignoreContent.includes('.env')) {
110
+ gitignoreContent += '\n# Environment variables\n.env\n.env.local\n';
111
+ fs.writeFileSync(gitignorePath, gitignoreContent, 'utf8');
112
+ console.log(chalk.dim('✓ .gitignore updated'));
113
+ }
114
+ }
115
+
116
+ // 8. Install dependencies
60
117
  spinner.start('Installing dependencies (this may take a few minutes)...');
61
118
  execSync('npm install', { stdio: 'inherit' });
62
119
  spinner.succeed(chalk.green('Dependencies installed.'));
63
120
 
64
- console.log(chalk.green.bold('\n🚀 Your Fleetbo project is ready!'));
65
- console.log(`\nTo get started:`);
66
- console.log(chalk.cyan(` cd ${projectName}`));
67
- console.log(chalk.cyan(` npm start`));
121
+ // 9. Final verification
122
+ console.log(chalk.green.bold('\n🚀 Your Fleetbo project is ready!\n'));
123
+
124
+ // Verify configuration
125
+ if (fs.existsSync(envPath)) {
126
+ console.log(chalk.green('✓ Configuration file verified'));
127
+ } else {
128
+ console.log(chalk.yellow('⚠️ Warning: .env file not found after setup'));
129
+ }
130
+
131
+ console.log(chalk.cyan('\nTo get started:'));
132
+ console.log(chalk.cyan(` cd ${projectName}`));
133
+ console.log(chalk.cyan(` npm start`));
134
+
135
+ console.log(chalk.dim('\nNote: Your .env file contains sensitive credentials and is excluded from git.'));
68
136
 
69
137
  } catch (error) {
70
138
  if (spinner.isSpinning) spinner.fail();
71
- console.error(chalk.red('\n❌ An error occurred:'), error.response ? error.response.data : error.message);
139
+ console.error(chalk.red('\n❌ An error occurred:'));
140
+
141
+ if (error.response) {
142
+ console.error(chalk.red('API Error:'), error.response.data);
143
+ } else if (error.code === 'ENOENT') {
144
+ console.error(chalk.red('File Error:'), error.message);
145
+ console.error(chalk.yellow('This might be a permissions issue.'));
146
+ } else {
147
+ console.error(chalk.red(error.message));
148
+ }
149
+
150
+ console.error(chalk.dim('\nStack trace:'), error.stack);
72
151
  process.exit(1);
73
152
  }
74
153
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fleetbo-project",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Creates a new Fleetbo project.",
5
5
  "main": "install-react-template.js",
6
6
  "bin": {