launchbase 1.0.8 → 1.1.0

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/bin/launchbase.js CHANGED
@@ -7,7 +7,7 @@ const crypto = require('crypto');
7
7
  const fs = require('fs-extra');
8
8
  const { execSync, spawn } = require('child_process');
9
9
 
10
- const VERSION = '1.0.8';
10
+ const VERSION = '1.1.0';
11
11
  const program = new Command();
12
12
 
13
13
  function findAvailablePort(startPort = 5432, maxAttempts = 100) {
@@ -422,20 +422,12 @@ program
422
422
  // Replace placeholders with dynamic ports
423
423
  const replacements = {
424
424
  '__APP_NAME__': appName,
425
+ '__DB_PORT__': dbPort.toString(),
425
426
  '"name": "launchbase-template"': `"name": "${appName}"`,
426
- '"PORT=3000"': `"PORT=${apiPort}"`,
427
- 'PORT=3000': `PORT=${apiPort}`,
428
- 'localhost:3000': `localhost:${apiPort}`,
429
- 'localhost:5173': `localhost:${frontendPort}`,
430
- 'localhost:5433': `localhost:${dbPort}`,
431
- 'localhost:5432': `localhost:${dbPort}`,
432
- '"5433:5432"': `"${dbPort}:5432"`,
433
- '"5432:5432"': `"${dbPort}:5432"`,
434
- '"3000:3000"': `"${apiPort}:3000"`,
435
427
  };
436
428
 
437
429
  // Update files with port replacements
438
- const filesToReplace = ['package.json', '.env.example', 'README.md', 'docker-compose.yml', '.env'];
430
+ const filesToReplace = ['package.json', '.env.example', 'README.md', 'docker-compose.yml'];
439
431
  for (const rel of filesToReplace) {
440
432
  const fp = path.join(targetDir, rel);
441
433
  if (await fs.pathExists(fp)) {
@@ -443,30 +435,31 @@ program
443
435
  }
444
436
  }
445
437
 
446
- // Generate .env with secrets
438
+ // Generate .env with secrets and correct ports
447
439
  const envExamplePath = path.join(targetDir, '.env.example');
448
440
  const envPath = path.join(targetDir, '.env');
449
441
 
450
442
  if (await fs.pathExists(envExamplePath)) {
451
443
  let env = await fs.readFile(envExamplePath, 'utf8');
444
+ // Replace app name
445
+ env = env.replace(/__APP_NAME__/g, appName);
446
+ // Replace secrets
452
447
  env = env.replace('JWT_ACCESS_SECRET=__CHANGE_ME__', `JWT_ACCESS_SECRET=${randomSecret(32)}`);
453
448
  env = env.replace('JWT_REFRESH_SECRET=__CHANGE_ME__', `JWT_REFRESH_SECRET=${randomSecret(32)}`);
454
- // Ensure ports are correct
449
+ // Replace ports
455
450
  env = env.replace(/PORT=\d+/, `PORT=${apiPort}`);
456
- env = env.replace(/localhost:\d+.*__APP_NAME__/g, `localhost:${dbPort}/${appName}`);
451
+ env = env.replace(/localhost:\d+\/__APP_NAME__/g, `localhost:${dbPort}/${appName}`);
452
+ env = env.replace(/localhost:5433/g, `localhost:${dbPort}`);
453
+ env = env.replace(/localhost:5432/g, `localhost:${dbPort}`);
454
+ env = env.replace(/localhost:3000/g, `localhost:${apiPort}`);
455
+ env = env.replace(/localhost:5173/g, `localhost:${frontendPort}`);
457
456
  await fs.writeFile(envPath, env, 'utf8');
458
457
  }
459
458
 
460
- // Update docker-compose.yml with correct ports
461
- const dockerComposePath = path.join(targetDir, 'docker-compose.yml');
462
- if (await fs.pathExists(dockerComposePath)) {
463
- let compose = await fs.readFile(dockerComposePath, 'utf8');
464
- compose = compose.replace(/"(\d+):5432"/, `"${dbPort}:5432"`);
465
- compose = compose.replace(/"(\d+):3000"/, `"${apiPort}:3000"`);
466
- await fs.writeFile(dockerComposePath, compose, 'utf8');
467
- }
468
-
469
459
  console.log('āœ… Project files created\n');
460
+ console.log(` Database port: ${dbPort}`);
461
+ console.log(` API port: ${apiPort}`);
462
+ console.log(` Frontend port: ${frontendPort}\n`);
470
463
 
471
464
  // Install dependencies
472
465
  console.log('šŸ“¦ Installing dependencies...\n');
@@ -538,18 +531,20 @@ program
538
531
  env: { ...process.env, PORT: apiPort.toString() }
539
532
  });
540
533
 
541
- // Start frontend after delay if included
534
+ // Start frontend if included
535
+ let frontend = null;
542
536
  if (options.template) {
543
537
  const frontendPath = path.join(targetDir, 'frontend');
544
538
  if (await fs.pathExists(frontendPath)) {
545
- setTimeout(() => {
546
- const frontend = spawn('npm', ['run', 'dev'], {
547
- cwd: frontendPath,
548
- stdio: 'inherit',
549
- shell: true,
550
- env: { ...process.env, VITE_API_URL: `http://localhost:${apiPort}`, PORT: frontendPort.toString() }
551
- });
552
- }, 5000);
539
+ console.log('šŸŽØ Starting frontend development server...\n');
540
+ frontend = spawn('npm', ['run', 'dev'], {
541
+ cwd: frontendPath,
542
+ stdio: 'inherit',
543
+ shell: true,
544
+ env: { ...process.env, VITE_API_URL: `http://localhost:${apiPort}`, PORT: frontendPort.toString() }
545
+ });
546
+ } else {
547
+ console.log('āš ļø Frontend folder not found at ' + frontendPath + '\n');
553
548
  }
554
549
  }
555
550
 
@@ -557,6 +552,7 @@ program
557
552
  process.on('SIGINT', () => {
558
553
  console.log('\n\nšŸ‘‹ Shutting down...');
559
554
  backend.kill();
555
+ if (frontend) frontend.kill();
560
556
  process.exit(0);
561
557
  });
562
558
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "launchbase",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "Generate production-ready NestJS backends with authentication, multi-tenancy, billing, and deployment in minutes",
5
5
  "author": "LaunchBase",
6
6
  "keywords": [
@@ -15,7 +15,7 @@ FRONTEND_URL=http://localhost:5173
15
15
  # Database
16
16
  # ===========================================
17
17
  # Local PostgreSQL (with Docker)
18
- DATABASE_URL=postgresql://postgres:postgres@localhost:5433/__APP_NAME__?schema=public
18
+ DATABASE_URL=postgresql://postgres:postgres@localhost:__DB_PORT__/__APP_NAME__?schema=public
19
19
  # SQLite (for simple local dev)
20
20
  # DATABASE_URL="file:./dev.db"
21
21
 
@@ -7,7 +7,7 @@ services:
7
7
  POSTGRES_PASSWORD: postgres
8
8
  POSTGRES_DB: launchbase
9
9
  ports:
10
- - "5433:5432"
10
+ - "__DB_PORT__:5432"
11
11
  volumes:
12
12
  - db_data:/var/lib/postgresql/data
13
13
  healthcheck:
@@ -16,18 +16,5 @@ services:
16
16
  timeout: 5s
17
17
  retries: 5
18
18
 
19
- api:
20
- build: .
21
- restart: unless-stopped
22
- env_file:
23
- - .env
24
- environment:
25
- DATABASE_URL: ${DATABASE_URL}
26
- ports:
27
- - "3000:3000"
28
- depends_on:
29
- db:
30
- condition: service_healthy
31
-
32
19
  volumes:
33
20
  db_data: