@tonk/cli 0.1.14 → 0.2.1

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 (59) hide show
  1. package/README.md +84 -5
  2. package/dist/commands/hello/index.d.ts +3 -0
  3. package/dist/commands/hello/index.d.ts.map +1 -0
  4. package/dist/commands/hello/index.js +291 -0
  5. package/dist/commands/hello/index.js.map +1 -0
  6. package/dist/commands/hello.d.ts.map +1 -1
  7. package/dist/commands/hello.js +69 -6
  8. package/dist/commands/hello.js.map +1 -1
  9. package/dist/commands/init.d.ts +3 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +66 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/kill.d.ts +3 -0
  14. package/dist/commands/kill.d.ts.map +1 -0
  15. package/dist/commands/kill.js +38 -0
  16. package/dist/commands/kill.js.map +1 -0
  17. package/dist/commands/ls.d.ts +3 -0
  18. package/dist/commands/ls.d.ts.map +1 -0
  19. package/dist/commands/ls.js +31 -0
  20. package/dist/commands/ls.js.map +1 -0
  21. package/dist/commands/ps.d.ts +3 -0
  22. package/dist/commands/ps.d.ts.map +1 -0
  23. package/dist/commands/ps.js +34 -0
  24. package/dist/commands/ps.js.map +1 -0
  25. package/dist/commands/push.d.ts +3 -0
  26. package/dist/commands/push.d.ts.map +1 -0
  27. package/dist/commands/push.js +150 -0
  28. package/dist/commands/push.js.map +1 -0
  29. package/dist/commands/start.d.ts +3 -0
  30. package/dist/commands/start.d.ts.map +1 -0
  31. package/dist/commands/start.js +43 -0
  32. package/dist/commands/start.js.map +1 -0
  33. package/dist/tonk.js +71 -12
  34. package/dist/tonk.js.map +1 -1
  35. package/package.json +12 -4
  36. package/dist/commands/config.d.ts +0 -3
  37. package/dist/commands/config.d.ts.map +0 -1
  38. package/dist/commands/config.js +0 -338
  39. package/dist/commands/config.js.map +0 -1
  40. package/dist/commands/deploy.d.ts +0 -3
  41. package/dist/commands/deploy.d.ts.map +0 -1
  42. package/dist/commands/deploy.js +0 -460
  43. package/dist/commands/deploy.js.map +0 -1
  44. package/dist/commands/dev.d.ts +0 -3
  45. package/dist/commands/dev.d.ts.map +0 -1
  46. package/dist/commands/dev.js +0 -89
  47. package/dist/commands/dev.js.map +0 -1
  48. package/dist/commands/prettyPrint.d.ts +0 -3
  49. package/dist/commands/prettyPrint.d.ts.map +0 -1
  50. package/dist/commands/prettyPrint.js +0 -51
  51. package/dist/commands/prettyPrint.js.map +0 -1
  52. package/dist/commands/serve.d.ts +0 -3
  53. package/dist/commands/serve.d.ts.map +0 -1
  54. package/dist/commands/serve.js +0 -212
  55. package/dist/commands/serve.js.map +0 -1
  56. package/dist/lib/launchGUI.d.ts +0 -2
  57. package/dist/lib/launchGUI.d.ts.map +0 -1
  58. package/dist/lib/launchGUI.js +0 -175
  59. package/dist/lib/launchGUI.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"prettyPrint.js","sourceRoot":"","sources":["../../src/commands/prettyPrint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAS,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,mCAAmC;AACnC,MAAM,QAAQ,GAAG;IACf,+BAA+B;IAC/B,OAAO,CAAqB,KAAqB;QAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CACpB,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAC3D,CAAC;IACJ,CAAC;IACD,SAAS,CAAqB,KAAuB;QACnD,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACxD,CAAC;IACD,IAAI,CAAqB,KAAkB;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC5C,KAAK,CAAC,MAAM,CACV,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CACjE,IAAI,CAAC,MAAM,CACZ,EAAE,CACJ,CACF,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,KAAkB;QACrB,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAChD,CAAC;IACD,QAAQ,CAAC,KAAsB;QAC7B,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,gCAAgC;IAChC,IAAI,CAAC,KAAkB;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,EAAE,CAAqB,KAAgB;QACrC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,CAAqB,KAAoB;QAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF,CAAC;AACF,4CAA4C;AAC5C,MAAM,CAAC,GAAG,CAAC,EAAC,QAAQ,EAAC,CAAC,CAAC;AAEvB,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACjD,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,yBAAyB,EAAE,oCAAoC,CAAC;KACzE,MAAM,CAAC,YAAY,CAAC,EAAE;IACrB,qCAAqC;IACrC,MAAM,QAAQ,GAAG,EAAE;SAChB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;SAC1C,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const serveCommand: Command;
3
- //# sourceMappingURL=serve.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AA2BlC,eAAO,MAAM,YAAY,SAuQrB,CAAC"}
@@ -1,212 +0,0 @@
1
- import { Command } from 'commander';
2
- import path from 'path';
3
- import fs from 'fs';
4
- import { createServer } from '@tonk/server';
5
- import chalk from 'chalk';
6
- function normalizePath(inputPath) {
7
- // If path starts with ~, expand to home directory
8
- if (inputPath.startsWith('~/')) {
9
- const homedir = process.env.HOME || process.env.USERPROFILE || '/home/node';
10
- return path.join(homedir, inputPath.substring(2));
11
- }
12
- // If path is an absolute path not in the user's home directory and not already expanded from ~,
13
- // redirect it to tonk-data
14
- if (inputPath.startsWith('/') &&
15
- !inputPath.startsWith(process.env.HOME || process.env.USERPROFILE || '') &&
16
- !inputPath.includes('node_modules')) {
17
- const homedir = process.env.HOME || process.env.USERPROFILE || '/home/node';
18
- return path.join(homedir, 'tonk-data', inputPath);
19
- }
20
- return inputPath;
21
- }
22
- export const serveCommand = new Command('serve')
23
- .description('Start a Tonk app in production mode')
24
- .option('-p, --port <port>', 'Port to run the server on', '8080')
25
- .option('-d, --dist <path>', 'Path to the dist directory for single app mode')
26
- .option('-u, --userhub', 'Run in userhub mode')
27
- .option('-f, --filesystem <path>', 'Filesystem path for document storage')
28
- .action(async (options) => {
29
- const projectRoot = process.cwd();
30
- const port = parseInt(options.port, 10);
31
- const configFilePath = path.join(projectRoot, 'tonk.config.json');
32
- // Determine whether we're using single app mode or hub mode
33
- let distPath;
34
- if (options.userhub) {
35
- if (!options.filesystem) {
36
- console.error(chalk.red(`Error: cannot run in hub mode without a filesystem path`));
37
- process.exit(1);
38
- }
39
- // do nothing
40
- }
41
- else if (options.dist) {
42
- // Single app mode: serve a single app from dist
43
- distPath = path.isAbsolute(options.dist)
44
- ? options.dist
45
- : path.join(projectRoot, options.dist);
46
- // Check if the dist directory exists
47
- if (!fs.existsSync(distPath)) {
48
- console.error(chalk.red(`Error: Dist directory not found at ${distPath}. Make sure you've built the project first.`));
49
- console.log(chalk.yellow(`Tip: Run 'pnpm run build' or 'yarn build' before serving.`));
50
- process.exit(1);
51
- }
52
- // Check if dist/index.html exists
53
- const indexPath = path.join(distPath, 'index.html');
54
- if (!fs.existsSync(indexPath)) {
55
- console.error(chalk.red(`Error: index.html not found in ${distPath}. The build output may be incomplete.`));
56
- process.exit(1);
57
- }
58
- }
59
- else {
60
- // Neither hub nor dist specified, default to 'dist' in current directory
61
- distPath = path.join(projectRoot, 'dist');
62
- if (!fs.existsSync(distPath)) {
63
- console.error(chalk.red(`Error: No --dist or --hub option provided, and default dist directory not found at ${distPath}.`));
64
- process.exit(1);
65
- }
66
- // Check if dist/index.html exists
67
- const indexPath = path.join(distPath, 'index.html');
68
- if (!fs.existsSync(indexPath)) {
69
- console.error(chalk.red(`Error: index.html not found in ${distPath}. The build output may be incomplete.`));
70
- process.exit(1);
71
- }
72
- }
73
- // Check for Backblaze and Filesystem configurations
74
- let backblazeConfig = null;
75
- let filesystemConfig = null;
76
- let primaryStorage = null;
77
- // Check if filesystem path was provided via command line
78
- const hasFilesystemFlag = !!options.filesystem;
79
- if (fs.existsSync(configFilePath)) {
80
- try {
81
- const configData = JSON.parse(fs.readFileSync(configFilePath, 'utf8'));
82
- // If backblaze is configured and enabled in the config file
83
- if (configData.backblaze && configData.backblaze.enabled) {
84
- backblazeConfig = {
85
- enabled: true,
86
- applicationKeyId: configData.backblaze.applicationKeyId,
87
- applicationKey: configData.backblaze.applicationKey,
88
- bucketId: configData.backblaze.bucketId,
89
- bucketName: configData.backblaze.bucketName,
90
- syncInterval: configData.backblaze.syncInterval || 300000, // 5 minutes default
91
- maxRetries: configData.backblaze.maxRetries || 3,
92
- };
93
- console.log(chalk.blue('Backblaze B2 backup enabled from config'));
94
- }
95
- // If filesystem storage is configured and enabled in the config file
96
- // and no command line path was provided
97
- if (!hasFilesystemFlag &&
98
- configData.filesystem &&
99
- configData.filesystem.enabled) {
100
- let storagePath = configData.filesystem.storagePath || '~/tonk-data';
101
- storagePath = normalizePath(storagePath);
102
- filesystemConfig = {
103
- enabled: true,
104
- storagePath,
105
- syncInterval: configData.filesystem.syncInterval || 30000, // 30 seconds default
106
- createIfMissing: configData.filesystem.createIfMissing !== false, // default to true
107
- };
108
- console.log(chalk.blue('Filesystem storage enabled from config'));
109
- }
110
- // Check for primary storage configuration
111
- if (configData.primaryStorage &&
112
- (configData.primaryStorage === 'backblaze' ||
113
- configData.primaryStorage === 'filesystem')) {
114
- primaryStorage = configData.primaryStorage;
115
- console.log(chalk.blue(`Primary storage set to ${primaryStorage} from config`));
116
- }
117
- }
118
- catch (error) {
119
- console.warn(chalk.yellow(`Warning: Could not parse config file at ${configFilePath}. Storage backups will not be enabled.`));
120
- console.warn(chalk.yellow(`Error details: ${error}`));
121
- }
122
- }
123
- // If filesystem path was provided via command line, override config settings
124
- if (hasFilesystemFlag) {
125
- const storagePath = normalizePath(options.filesystem);
126
- filesystemConfig = {
127
- enabled: true,
128
- storagePath,
129
- syncInterval: 30000, // 30 seconds default
130
- createIfMissing: true, // default to true
131
- };
132
- console.log(chalk.blue(`Filesystem storage enabled with path: ${storagePath}`));
133
- // If no primary storage set and we have backblaze, set filesystem as primary
134
- if (!primaryStorage && backblazeConfig) {
135
- primaryStorage = 'filesystem';
136
- console.log(chalk.blue('Primary storage set to filesystem from command line argument'));
137
- }
138
- }
139
- console.log(chalk.blue('Starting Tonk production server...'));
140
- try {
141
- // Start the production server with storage configs if available
142
- const serverConfig = {
143
- port,
144
- mode: 'production',
145
- verbose: true,
146
- };
147
- if (distPath) {
148
- serverConfig.distPath = distPath;
149
- }
150
- // Add Backblaze configuration if available
151
- if (backblazeConfig) {
152
- serverConfig.storage = {
153
- backblaze: backblazeConfig,
154
- };
155
- }
156
- // Add Filesystem configuration if available
157
- if (filesystemConfig) {
158
- serverConfig.filesystemStorage = filesystemConfig;
159
- }
160
- // Set primary storage if both are configured
161
- if (primaryStorage && backblazeConfig && filesystemConfig) {
162
- serverConfig.primaryStorage = primaryStorage;
163
- }
164
- const server = await createServer(serverConfig);
165
- // Log success info
166
- console.log(chalk.green(`Server running at http://localhost:${port}`));
167
- if (distPath) {
168
- console.log(chalk.green(`Serving single app from: ${distPath}`));
169
- }
170
- if (backblazeConfig) {
171
- console.log(chalk.green(`
172
- Backblaze B2 backup is enabled for your Automerge documents.
173
- Documents will be synced to your B2 bucket: ${backblazeConfig.bucketName}
174
- `));
175
- }
176
- if (filesystemConfig) {
177
- console.log(chalk.green(`
178
- Filesystem storage is enabled for your Automerge documents.
179
- Documents will be stored at: ${filesystemConfig.storagePath}
180
- `));
181
- }
182
- if (primaryStorage && backblazeConfig && filesystemConfig) {
183
- console.log(chalk.green(`
184
- Primary storage is set to: ${primaryStorage}
185
- `));
186
- }
187
- console.log(chalk.blue('Press Ctrl+C to stop the server'));
188
- // Handle process termination
189
- const cleanup = () => {
190
- console.log(chalk.yellow('\nShutting down server...'));
191
- server
192
- .stop()
193
- .then(() => {
194
- console.log(chalk.green('Server shutdown complete.'));
195
- // Force exit after brief delay to ensure any pending operations complete
196
- setTimeout(() => process.exit(0), 2000);
197
- })
198
- .catch(err => {
199
- console.error(chalk.red('Error during shutdown:'), err);
200
- // Force exit even on error
201
- process.exit(1);
202
- });
203
- };
204
- process.on('SIGINT', cleanup);
205
- process.on('SIGTERM', cleanup);
206
- }
207
- catch (error) {
208
- console.error(chalk.red('Failed to start server:'), error);
209
- process.exit(1);
210
- }
211
- });
212
- //# sourceMappingURL=serve.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function launchTonkGUI(): void;
2
- //# sourceMappingURL=launchGUI.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launchGUI.d.ts","sourceRoot":"","sources":["../../src/lib/launchGUI.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,SAmJ5B"}
@@ -1,175 +0,0 @@
1
- import chalk from 'chalk';
2
- import { spawn } from 'child_process';
3
- import fs from 'fs';
4
- import path from 'path';
5
- import { fileURLToPath } from 'url';
6
- export function launchTonkGUI() {
7
- // Use import.meta.url and fileURLToPath instead of __dirname
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = path.dirname(__filename);
10
- // Determine the paths - CLI is in src/commands, so we need to go up to the project root
11
- const projectRoot = path.resolve(__dirname, '../../..');
12
- const electronAppPath = path.resolve(projectRoot, 'hub');
13
- const hubUIPath = path.resolve(electronAppPath, 'hub-ui');
14
- // Check if the Electron app exists
15
- if (!fs.existsSync(electronAppPath)) {
16
- console.error(chalk.red(`Electron app not found at ${electronAppPath}. Please check your installation.`));
17
- throw new Error(`Electron app not found at ${electronAppPath}. Please check your installation.`);
18
- }
19
- // Check if the hub UI exists
20
- if (!fs.existsSync(hubUIPath)) {
21
- console.error(chalk.red(`Hub UI not found at ${hubUIPath}. Please check your installation.`));
22
- throw new Error(`Hub UI not found at ${hubUIPath}. Please check your installation.`);
23
- }
24
- let uiProcess = null;
25
- let electronProcess = null;
26
- // Function to cleanly terminate both processes
27
- const cleanupProcesses = () => {
28
- console.log(chalk.yellow('\nShutting down Tonk GUI...'));
29
- if (electronProcess) {
30
- try {
31
- electronProcess.kill('SIGTERM');
32
- electronProcess = null;
33
- }
34
- catch (err) {
35
- console.error(chalk.red(`Error terminating Electron process: ${err.message}`));
36
- }
37
- }
38
- if (uiProcess) {
39
- try {
40
- // First try a graceful termination
41
- uiProcess.kill('SIGTERM');
42
- // Force kill after a short timeout if still running
43
- setTimeout(() => {
44
- if (uiProcess) {
45
- try {
46
- // On macOS, we need SIGKILL to ensure termination
47
- uiProcess.kill('SIGKILL');
48
- uiProcess = null;
49
- console.log(chalk.yellow('Force-terminated UI process'));
50
- }
51
- catch (killErr) {
52
- console.error(chalk.red(`Failed to force-kill UI process: ${killErr.message}`));
53
- }
54
- }
55
- }, 1000);
56
- }
57
- catch (err) {
58
- console.error(chalk.red(`Error terminating UI process: ${err.message}`));
59
- // Try force kill if normal termination failed
60
- try {
61
- uiProcess.kill('SIGKILL');
62
- uiProcess = null;
63
- }
64
- catch (killErr) {
65
- console.error(chalk.red(`Failed to force-kill UI process: ${killErr.message}`));
66
- }
67
- }
68
- }
69
- // Also try to kill any process that might be using port 3333
70
- try {
71
- // For macOS/Linux
72
- const killCommand = process.platform === 'win32'
73
- ? spawn('cmd', [
74
- '/c',
75
- 'FOR /F "tokens=5" %P IN (\'netstat -ano ^| findstr :3333 ^| findstr LISTENING\') DO taskkill /F /PID %P',
76
- ])
77
- : spawn('sh', ['-c', 'lsof -ti:3333 | xargs kill -9']);
78
- killCommand.on('error', err => {
79
- console.error(chalk.red(`Failed to kill process on port 3333: ${err.message}`));
80
- });
81
- }
82
- catch (err) {
83
- console.error(chalk.red(`Error killing process on port 3333: ${err.message}`));
84
- }
85
- console.log(chalk.yellow('Tonk GUI shutdown complete.'));
86
- };
87
- try {
88
- // Start the webpack development server for the hub UI
89
- console.log(chalk.blue('Starting Hub UI development server...'));
90
- uiProcess = startUIServer(hubUIPath);
91
- // Give the UI server a moment to start
92
- setTimeout(() => {
93
- // Launch the Electron app
94
- console.log(chalk.blue('Starting Electron app...'));
95
- electronProcess = startElectronApp(electronAppPath, cleanupProcesses);
96
- // Handle process termination
97
- process.on('SIGINT', cleanupProcesses);
98
- process.on('SIGTERM', cleanupProcesses);
99
- process.on('exit', cleanupProcesses);
100
- }, 2000); // Wait 2 seconds before starting Electron
101
- }
102
- catch (error) {
103
- console.error(chalk.red(`Error launching Tonk GUI: ${error.message}`));
104
- cleanupProcesses();
105
- throw new Error(`Error launching Tonk GUI: ${error.message}`);
106
- }
107
- }
108
- function startUIServer(hubUIPath) {
109
- console.log(chalk.blue(`Starting webpack dev server in ${hubUIPath}...`));
110
- const uiProcess = spawn('pnpm', ['run', 'start'], {
111
- cwd: hubUIPath,
112
- stdio: 'pipe',
113
- shell: true,
114
- detached: false, // Ensure process is not detached from parent
115
- });
116
- uiProcess.stdout.on('data', data => {
117
- const output = data.toString();
118
- console.log(chalk.green(output.trim()));
119
- });
120
- uiProcess.stderr.on('data', data => {
121
- const output = data.toString();
122
- console.error(chalk.yellow(output.trim()));
123
- });
124
- uiProcess.on('error', err => {
125
- console.error(chalk.red(`Failed to start UI server: ${err.message}`));
126
- });
127
- uiProcess.on('close', code => {
128
- if (code !== 0 && code !== null) {
129
- console.log(chalk.yellow(`UI server exited with code ${code}`));
130
- }
131
- });
132
- return uiProcess;
133
- }
134
- function startElectronApp(electronAppPath, cleanupCallback) {
135
- console.log(chalk.blue(`Starting Electron app in ${electronAppPath}...`));
136
- // Check if package.json exists in the electron app directory
137
- const packageJsonPath = path.join(electronAppPath, 'package.json');
138
- if (!fs.existsSync(packageJsonPath)) {
139
- console.error(chalk.red(`No package.json found in ${electronAppPath}`));
140
- throw new Error(`No package.json found in ${electronAppPath}`);
141
- }
142
- // Use npm run dev instead of npx electron .
143
- const electronProcess = spawn('pnpm', ['run', 'dev'], {
144
- cwd: electronAppPath,
145
- stdio: 'pipe',
146
- shell: true,
147
- env: {
148
- ...process.env,
149
- ELECTRON_START_URL: 'http://localhost:3333',
150
- // Enable Node.js integration in Electron
151
- NODE_ENV: 'development',
152
- },
153
- });
154
- electronProcess.stdout.on('data', data => {
155
- const output = data.toString();
156
- console.log(chalk.blue(output.trim()));
157
- });
158
- electronProcess.stderr.on('data', data => {
159
- const output = data.toString();
160
- console.error(chalk.red(output.trim()));
161
- });
162
- electronProcess.on('error', err => {
163
- console.error(chalk.red(`Failed to start Electron app: ${err.message}`));
164
- });
165
- electronProcess.on('close', code => {
166
- if (code !== 0 && code !== null) {
167
- console.log(chalk.yellow(`Electron app exited with code ${code}`));
168
- }
169
- console.log(chalk.yellow('Electron app closed, shutting down UI server...'));
170
- // Call the cleanup function when Electron exits
171
- cleanupCallback();
172
- });
173
- return electronProcess;
174
- }
175
- //# sourceMappingURL=launchGUI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launchGUI.js","sourceRoot":"","sources":["../../src/lib/launchGUI.ts"],"names":[],"mappings":"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"}