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.
- package/dist/commands/build.js +79 -15
- package/package.json +1 -1
- package/src/commands/build.ts +80 -17
package/dist/commands/build.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
44
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
package/src/commands/build.ts
CHANGED
|
@@ -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
|
-
|
|
41
|
+
// Step 2: Copy Next.js output
|
|
42
|
+
const copySpinner = ora('Copying Next.js build...').start()
|
|
33
43
|
try {
|
|
34
|
-
const
|
|
35
|
-
fs.
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
76
|
+
# Wait for server to be ready
|
|
77
|
+
sleep 3
|
|
54
78
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
}
|