nextdesk 0.1.2 → 0.1.4

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.
@@ -17,7 +17,14 @@ async function build(options) {
17
17
  process.exit(1);
18
18
  }
19
19
  const appName = (0, nextjs_1.getAppName)(cwd);
20
+ const outputDir = path_1.default.join(cwd, 'dist-desktop');
20
21
  console.log(chalk_1.default.bold(`\n📦 Building ${appName} for desktop...\n`));
22
+ // Clean output directory
23
+ if (fs_1.default.existsSync(outputDir)) {
24
+ fs_1.default.rmSync(outputDir, { recursive: true });
25
+ }
26
+ fs_1.default.mkdirSync(outputDir, { recursive: true });
27
+ // Step 1: Build Next.js app
21
28
  const nextSpinner = (0, ora_1.default)('Building Next.js app...').start();
22
29
  try {
23
30
  await (0, execa_1.default)('npm', ['run', 'build'], { cwd, stdio: 'pipe' });
@@ -27,31 +34,88 @@ async function build(options) {
27
34
  nextSpinner.fail(`Next.js build failed: ${err.message}`);
28
35
  process.exit(1);
29
36
  }
30
- const bundleSpinner = (0, ora_1.default)('Bundling desktop runtime...').start();
37
+ // Step 2: Copy Next.js output
38
+ const copySpinner = (0, ora_1.default)('Copying Next.js build...').start();
39
+ try {
40
+ const nextOut = path_1.default.join(cwd, '.next');
41
+ fs_1.default.cpSync(nextOut, path_1.default.join(outputDir, '.next'), { recursive: true });
42
+ copySpinner.succeed('Next.js build copied');
43
+ }
44
+ catch (err) {
45
+ copySpinner.fail(`Failed to copy Next.js build: ${err.message}`);
46
+ process.exit(1);
47
+ }
48
+ // Step 3: Copy runtime binary
49
+ const runtimeSpinner = (0, ora_1.default)('Copying runtime...').start();
31
50
  try {
32
- const outputDir = path_1.default.join(cwd, 'dist-desktop');
33
- fs_1.default.mkdirSync(outputDir, { recursive: true });
34
51
  const runtime = (0, nextjs_1.getRuntimeBinary)();
35
52
  const outputBinary = path_1.default.join(outputDir, appName);
36
53
  fs_1.default.copyFileSync(runtime, outputBinary);
37
54
  fs_1.default.chmodSync(outputBinary, 0o755);
38
- const nextOut = path_1.default.join(cwd, '.next');
39
- fs_1.default.cpSync(nextOut, path_1.default.join(outputDir, '.next'), { recursive: true });
40
- fs_1.default.writeFileSync(path_1.default.join(outputDir, 'run.sh'), `#!/bin/bash
55
+ runtimeSpinner.succeed('Runtime copied');
56
+ }
57
+ catch (err) {
58
+ runtimeSpinner.fail(`Failed to copy runtime: ${err.message}`);
59
+ process.exit(1);
60
+ }
61
+ // Step 4: Create run script
62
+ const scriptSpinner = (0, ora_1.default)('Creating run script...').start();
63
+ try {
64
+ const runScript = `#!/bin/bash
65
+ APP_NAME="${appName}"
41
66
  PORT=3000
67
+
68
+ # Start Next.js production server in background
69
+ echo "Starting $APP_NAME server..."
42
70
  npm run start &
43
- sleep 2
44
- ./${appName} http://localhost:$PORT "${appName}"
45
- `);
71
+
72
+ # Wait for server to be ready
73
+ sleep 3
74
+
75
+ # Launch desktop app
76
+ cd "$(dirname "$0")"
77
+ "./$APP_NAME" "http://localhost:$PORT" "$APP_NAME"
78
+ `;
79
+ fs_1.default.writeFileSync(path_1.default.join(outputDir, 'run.sh'), runScript);
46
80
  fs_1.default.chmodSync(path_1.default.join(outputDir, 'run.sh'), 0o755);
47
- bundleSpinner.succeed('Runtime bundled');
48
- console.log(chalk_1.default.bold('\n✨ Build complete!\n'));
49
- console.log(chalk_1.default.gray(` Output: ${chalk_1.default.cyan(outputDir)}`));
50
- console.log(chalk_1.default.gray(` Binary: ${chalk_1.default.cyan(outputBinary)}`));
51
- console.log(chalk_1.default.gray(` Run: ${chalk_1.default.cyan('cd ' + outputDir + ' && ./run.sh')}\n`));
81
+ // Also create Windows batch file
82
+ const runBat = `@echo off
83
+ set APP_NAME=${appName}
84
+ echo Starting %APP_NAME% server...
85
+ start /b npm run start
86
+ timeout /t 3 /nobreak >nul
87
+ "%~dp0%APP_NAME%.exe" "http://localhost:3000" "%APP_NAME%"
88
+ `;
89
+ fs_1.default.writeFileSync(path_1.default.join(outputDir, 'run.bat'), runBat);
90
+ scriptSpinner.succeed('Run scripts created');
91
+ }
92
+ catch (err) {
93
+ scriptSpinner.fail(`Failed to create scripts: ${err.message}`);
94
+ process.exit(1);
95
+ }
96
+ // Step 5: Copy package.json for npm install in output
97
+ const depsSpinner = (0, ora_1.default)('Setting up dependencies...').start();
98
+ try {
99
+ const packageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(cwd, 'package.json'), 'utf-8'));
100
+ fs_1.default.writeFileSync(path_1.default.join(outputDir, 'package.json'), JSON.stringify({
101
+ name: appName,
102
+ version: packageJson.version || '1.0.0',
103
+ private: true,
104
+ scripts: {
105
+ start: 'next start'
106
+ }
107
+ }, null, 2));
108
+ depsSpinner.succeed('Dependencies configured');
52
109
  }
53
110
  catch (err) {
54
- bundleSpinner.fail(`Bundling failed: ${err.message}`);
111
+ depsSpinner.fail(`Failed to setup dependencies: ${err.message}`);
55
112
  process.exit(1);
56
113
  }
114
+ console.log(chalk_1.default.bold('\n✨ Build complete!\n'));
115
+ console.log(chalk_1.default.gray(` Output: ${chalk_1.default.cyan(outputDir)}`));
116
+ console.log(chalk_1.default.gray(` To run:`));
117
+ console.log(chalk_1.default.cyan(` cd ${outputDir}`));
118
+ console.log(chalk_1.default.cyan(` npm install`));
119
+ console.log(chalk_1.default.cyan(` ./run.sh # Linux/Mac`));
120
+ console.log(chalk_1.default.cyan(` run.bat # Windows\n`));
57
121
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextdesk",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Turn your Next.js app into a 5MB desktop app in 30 seconds",
5
5
  "bin": {
6
6
  "nextdesk": "./dist/index.js"
@@ -18,8 +18,17 @@ export async function build(options: BuildOptions) {
18
18
  }
19
19
 
20
20
  const appName = getAppName(cwd)
21
+ const outputDir = path.join(cwd, 'dist-desktop')
22
+
21
23
  console.log(chalk.bold(`\n📦 Building ${appName} for desktop...\n`))
22
24
 
25
+ // Clean output directory
26
+ if (fs.existsSync(outputDir)) {
27
+ fs.rmSync(outputDir, { recursive: true })
28
+ }
29
+ fs.mkdirSync(outputDir, { recursive: true })
30
+
31
+ // Step 1: Build Next.js app
23
32
  const nextSpinner = ora('Building Next.js app...').start()
24
33
  try {
25
34
  await execa('npm', ['run', 'build'], { cwd, stdio: 'pipe' })
@@ -29,36 +38,90 @@ export async function build(options: BuildOptions) {
29
38
  process.exit(1)
30
39
  }
31
40
 
32
- const bundleSpinner = ora('Bundling desktop runtime...').start()
41
+ // Step 2: Copy Next.js output
42
+ const copySpinner = ora('Copying Next.js build...').start()
33
43
  try {
34
- const outputDir = path.join(cwd, 'dist-desktop')
35
- fs.mkdirSync(outputDir, { recursive: true })
44
+ const nextOut = path.join(cwd, '.next')
45
+ fs.cpSync(nextOut, path.join(outputDir, '.next'), { recursive: true })
46
+ copySpinner.succeed('Next.js build copied')
47
+ } catch (err: any) {
48
+ copySpinner.fail(`Failed to copy Next.js build: ${err.message}`)
49
+ process.exit(1)
50
+ }
36
51
 
52
+ // Step 3: Copy runtime binary
53
+ const runtimeSpinner = ora('Copying runtime...').start()
54
+ try {
37
55
  const runtime = getRuntimeBinary()
38
56
  const outputBinary = path.join(outputDir, appName)
39
57
  fs.copyFileSync(runtime, outputBinary)
40
58
  fs.chmodSync(outputBinary, 0o755)
59
+ runtimeSpinner.succeed('Runtime copied')
60
+ } catch (err: any) {
61
+ runtimeSpinner.fail(`Failed to copy runtime: ${err.message}`)
62
+ process.exit(1)
63
+ }
41
64
 
42
- const nextOut = path.join(cwd, '.next')
43
- fs.cpSync(nextOut, path.join(outputDir, '.next'), { recursive: true })
44
-
45
- fs.writeFileSync(path.join(outputDir, 'run.sh'), `#!/bin/bash
65
+ // Step 4: Create run script
66
+ const scriptSpinner = ora('Creating run script...').start()
67
+ try {
68
+ const runScript = `#!/bin/bash
69
+ APP_NAME="${appName}"
46
70
  PORT=3000
71
+
72
+ # Start Next.js production server in background
73
+ echo "Starting $APP_NAME server..."
47
74
  npm run start &
48
- sleep 2
49
- ./${appName} http://localhost:$PORT "${appName}"
50
- `)
51
- fs.chmodSync(path.join(outputDir, 'run.sh'), 0o755)
52
75
 
53
- bundleSpinner.succeed('Runtime bundled')
76
+ # Wait for server to be ready
77
+ sleep 3
54
78
 
55
- console.log(chalk.bold('\n✨ Build complete!\n'))
56
- console.log(chalk.gray(` Output: ${chalk.cyan(outputDir)}`))
57
- console.log(chalk.gray(` Binary: ${chalk.cyan(outputBinary)}`))
58
- console.log(chalk.gray(` Run: ${chalk.cyan('cd ' + outputDir + ' && ./run.sh')}\n`))
79
+ # Launch desktop app
80
+ cd "$(dirname "$0")"
81
+ "./$APP_NAME" "http://localhost:$PORT" "$APP_NAME"
82
+ `
83
+ fs.writeFileSync(path.join(outputDir, 'run.sh'), runScript)
84
+ fs.chmodSync(path.join(outputDir, 'run.sh'), 0o755)
85
+
86
+ // Also create Windows batch file
87
+ const runBat = `@echo off
88
+ set APP_NAME=${appName}
89
+ echo Starting %APP_NAME% server...
90
+ start /b npm run start
91
+ timeout /t 3 /nobreak >nul
92
+ "%~dp0%APP_NAME%.exe" "http://localhost:3000" "%APP_NAME%"
93
+ `
94
+ fs.writeFileSync(path.join(outputDir, 'run.bat'), runBat)
95
+
96
+ scriptSpinner.succeed('Run scripts created')
97
+ } catch (err: any) {
98
+ scriptSpinner.fail(`Failed to create scripts: ${err.message}`)
99
+ process.exit(1)
100
+ }
59
101
 
102
+ // Step 5: Copy package.json for npm install in output
103
+ const depsSpinner = ora('Setting up dependencies...').start()
104
+ try {
105
+ const packageJson = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'))
106
+ fs.writeFileSync(path.join(outputDir, 'package.json'), JSON.stringify({
107
+ name: appName,
108
+ version: packageJson.version || '1.0.0',
109
+ private: true,
110
+ scripts: {
111
+ start: 'next start'
112
+ }
113
+ }, null, 2))
114
+ depsSpinner.succeed('Dependencies configured')
60
115
  } catch (err: any) {
61
- bundleSpinner.fail(`Bundling failed: ${err.message}`)
116
+ depsSpinner.fail(`Failed to setup dependencies: ${err.message}`)
62
117
  process.exit(1)
63
118
  }
119
+
120
+ console.log(chalk.bold('\n✨ Build complete!\n'))
121
+ console.log(chalk.gray(` Output: ${chalk.cyan(outputDir)}`))
122
+ console.log(chalk.gray(` To run:`))
123
+ console.log(chalk.cyan(` cd ${outputDir}`))
124
+ console.log(chalk.cyan(` npm install`))
125
+ console.log(chalk.cyan(` ./run.sh # Linux/Mac`))
126
+ console.log(chalk.cyan(` run.bat # Windows\n`))
64
127
  }