electronizer 1.0.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/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # Electronizer ⚡
2
+
3
+ A CLI tool to convert React, Vite, and Next.js projects into Electron desktop applications.
4
+
5
+ ## Features
6
+
7
+ - 🔍 **Auto Project Detection**: Automatically detects React, Vite, and Next.js projects
8
+ - ⚙️ **Easy Setup**: Electron integration with a single command
9
+ - 📦 **Cross-Platform Build**: Package for Windows, macOS, and Linux
10
+ - 🔥 **Hot Reload**: Instant changes in development mode
11
+ - 🛡️ **Secure**: Context isolation and preload script support
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ # Global installation
17
+ npm install -g electronizer
18
+
19
+ # Or with npx
20
+ npx electronizer init
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ### Convert Project to Electron
26
+
27
+ In your existing React/Vite/Next.js project root directory:
28
+
29
+ ```bash
30
+ # Interactive mode
31
+ electronizer init
32
+
33
+ # Quick mode (with default settings)
34
+ electronizer init -y
35
+
36
+ # With custom settings
37
+ electronizer init --name "My App" --width 1400 --height 900
38
+
39
+ # With icon
40
+ electronizer init --name "My App" --icon ./assets/icon.png
41
+ ```
42
+
43
+ ### Development
44
+
45
+ ```bash
46
+ # Electron + Dev server together
47
+ npm run electron:dev
48
+ ```
49
+
50
+ ### Build & Distribution
51
+
52
+ ```bash
53
+ # For all platforms
54
+ npm run electron:dist
55
+
56
+ # Platform specific
57
+ npm run electron:dist:win # Windows
58
+ npm run electron:dist:mac # macOS
59
+ npm run electron:dist:linux # Linux
60
+ ```
61
+
62
+ ## Commands
63
+
64
+ | Command | Description |
65
+ |---------|-------------|
66
+ | `electronizer init` | Configure project for Electron |
67
+ | `electronizer init -y` | Quick setup with default settings |
68
+ | `electronizer info` | Show project information |
69
+ | `electronizer --help` | Help menu |
70
+
71
+ ## Generated Files
72
+
73
+ ```
74
+ project/
75
+ ├── electron/
76
+ │ ├── main.js # Electron main process
77
+ │ └── preload.js # Preload script
78
+ ├── electron-builder.json # Build configuration
79
+ └── package.json # Updated scripts
80
+ ```
81
+
82
+ ## Added npm Scripts
83
+
84
+ | Script | Description |
85
+ |--------|-------------|
86
+ | `npm run electron` | Start Electron |
87
+ | `npm run electron:dev` | Dev mode (hot reload) |
88
+ | `npm run electron:build` | Production build |
89
+ | `npm run electron:dist` | Create distribution package |
90
+ | `npm run electron:dist:mac` | Package for macOS |
91
+ | `npm run electron:dist:win` | Package for Windows |
92
+ | `npm run electron:dist:linux` | Package for Linux |
93
+ | `npm run electron:dist:all` | Package for all platforms |
94
+
95
+ ## Supported Projects
96
+
97
+ | Project Type | Status |
98
+ |--------------|--------|
99
+ | Vite + React | ✅ Full support |
100
+ | Create React App | ✅ Full support |
101
+ | Next.js | ⚠️ Requires static export |
102
+ | Vue (Vite) | ✅ Works |
103
+ | Svelte (Vite) | ✅ Works |
104
+
105
+ ### Next.js Notes
106
+
107
+ For Next.js projects, you need to create a static build with `next export`:
108
+
109
+ ```json
110
+ // next.config.js
111
+ module.exports = {
112
+ output: 'export',
113
+ }
114
+ ```
115
+
116
+ ## License
117
+
118
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,821 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const commander_1 = require("commander");
41
+ const inquirer_1 = __importDefault(require("inquirer"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const path_1 = __importDefault(require("path"));
44
+ const fs_extra_1 = __importDefault(require("fs-extra"));
45
+ // ============================================================================
46
+ // UTILS
47
+ // ============================================================================
48
+ const log = {
49
+ info: (msg) => console.log(chalk_1.default.blue('ℹ'), msg),
50
+ success: (msg) => console.log(chalk_1.default.green('✔'), msg),
51
+ warning: (msg) => console.log(chalk_1.default.yellow('⚠'), msg),
52
+ error: (msg) => console.log(chalk_1.default.red('✖'), msg),
53
+ step: (step, msg) => console.log(chalk_1.default.cyan(`[${step}]`), msg),
54
+ };
55
+ async function readPackageJson(dir) {
56
+ const pkgPath = path_1.default.join(dir, 'package.json');
57
+ if (!await fs_extra_1.default.pathExists(pkgPath))
58
+ return null;
59
+ try {
60
+ return await fs_extra_1.default.readJson(pkgPath);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ // ============================================================================
67
+ // ICON UTILS
68
+ // ============================================================================
69
+ function getIconExtension(platform) {
70
+ switch (platform) {
71
+ case 'darwin': return '.icns';
72
+ case 'win32': return '.ico';
73
+ default: return '.png';
74
+ }
75
+ }
76
+ function getSupportedIconFormats() {
77
+ return ['.png', '.ico', '.icns'];
78
+ }
79
+ async function validateAndCopyIcon(iconPath, targetDir) {
80
+ if (!iconPath)
81
+ return null;
82
+ const resolvedPath = path_1.default.resolve(iconPath);
83
+ // Check if file exists
84
+ if (!await fs_extra_1.default.pathExists(resolvedPath)) {
85
+ log.warning(`Icon file not found: ${resolvedPath}`);
86
+ return null;
87
+ }
88
+ const ext = path_1.default.extname(resolvedPath).toLowerCase();
89
+ const supportedFormats = getSupportedIconFormats();
90
+ if (!supportedFormats.includes(ext)) {
91
+ log.warning(`Unsupported icon format: ${ext}. Supported: ${supportedFormats.join(', ')}`);
92
+ return null;
93
+ }
94
+ // Create resources directory
95
+ const resourcesDir = path_1.default.join(targetDir, 'electron', 'resources');
96
+ await fs_extra_1.default.ensureDir(resourcesDir);
97
+ // Copy icon to resources
98
+ const iconName = `icon${ext}`;
99
+ const destPath = path_1.default.join(resourcesDir, iconName);
100
+ await fs_extra_1.default.copy(resolvedPath, destPath);
101
+ log.success(`Icon copied: ${iconName}`);
102
+ // If PNG, also create placeholder names for other platforms (electron-builder can convert)
103
+ if (ext === '.png') {
104
+ // electron-builder can auto-convert PNG to other formats
105
+ return iconName;
106
+ }
107
+ return iconName;
108
+ }
109
+ // ============================================================================
110
+ // DETECTOR
111
+ // ============================================================================
112
+ async function detectProject(dir) {
113
+ const pkg = await readPackageJson(dir);
114
+ if (!pkg)
115
+ return null;
116
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
117
+ // Detect project type
118
+ let type = 'unknown';
119
+ if (deps['vite'])
120
+ type = 'vite';
121
+ else if (deps['react-scripts'])
122
+ type = 'react';
123
+ else if (deps['react'])
124
+ type = 'vite';
125
+ // Next.js → wrapper mode (uses BrowserView)
126
+ if (deps['next']) {
127
+ return {
128
+ type: 'wrapper',
129
+ name: pkg.name || 'electron-app',
130
+ version: pkg.version || '1.0.0',
131
+ hasTypeScript: false,
132
+ isESModule: false,
133
+ devPort: 3000,
134
+ buildDir: '',
135
+ };
136
+ }
137
+ // Detect TypeScript
138
+ const hasTypeScript = !!deps['typescript'] || await fs_extra_1.default.pathExists(path_1.default.join(dir, 'tsconfig.json'));
139
+ // Detect ESM
140
+ const isESModule = pkg.type === 'module';
141
+ // Project defaults
142
+ const defaults = {
143
+ vite: { devPort: 5173, buildDir: 'dist' },
144
+ react: { devPort: 3000, buildDir: 'build' },
145
+ wrapper: { devPort: 0, buildDir: '' },
146
+ unknown: { devPort: 3000, buildDir: 'dist' },
147
+ };
148
+ return {
149
+ type,
150
+ name: pkg.name || 'electron-app',
151
+ version: pkg.version || '1.0.0',
152
+ hasTypeScript,
153
+ isESModule,
154
+ ...defaults[type],
155
+ };
156
+ }
157
+ function getProjectTypeName(type) {
158
+ const names = {
159
+ vite: 'Vite',
160
+ react: 'Create React App',
161
+ wrapper: 'Web Wrapper (BrowserView)',
162
+ unknown: 'Unknown',
163
+ };
164
+ return names[type];
165
+ }
166
+ // ============================================================================
167
+ // TEMPLATES
168
+ // ============================================================================
169
+ function getMainTemplate(info, config) {
170
+ const preloadExt = info.isESModule ? 'cjs' : 'js';
171
+ const buildDir = info.buildDir;
172
+ return `const { app, BrowserWindow, shell } = require('electron');
173
+ const path = require('path');
174
+
175
+ try {
176
+ if (require('electron-squirrel-startup')) app.quit();
177
+ } catch (e) {}
178
+
179
+ let mainWindow;
180
+ const isDev = !app.isPackaged;
181
+
182
+ function createWindow() {
183
+ mainWindow = new BrowserWindow({
184
+ width: ${config.width},
185
+ height: ${config.height},
186
+ webPreferences: {
187
+ nodeIntegration: false,
188
+ contextIsolation: true,
189
+ preload: path.join(__dirname, 'preload.${preloadExt}'),
190
+ },
191
+ show: false,
192
+ backgroundColor: '#1a1a1a',
193
+ });
194
+
195
+ mainWindow.once('ready-to-show', () => mainWindow.show());
196
+
197
+ mainWindow.webContents.setWindowOpenHandler(({ url }) => {
198
+ shell.openExternal(url);
199
+ return { action: 'deny' };
200
+ });
201
+
202
+ if (isDev) {
203
+ const devUrl = 'http://localhost:${info.devPort}';
204
+ const checkServer = () => {
205
+ mainWindow.loadURL(devUrl).catch(() => setTimeout(checkServer, 1000));
206
+ };
207
+ checkServer();
208
+ mainWindow.webContents.openDevTools();
209
+ } else {
210
+ // In production, use app.getAppPath() for correct asar paths
211
+ const appPath = app.getAppPath();
212
+ const indexPath = path.join(appPath, '${buildDir}', 'index.html');
213
+ mainWindow.loadFile(indexPath);
214
+ }
215
+ }
216
+
217
+ app.whenReady().then(() => {
218
+ createWindow();
219
+ app.on('activate', () => {
220
+ if (BrowserWindow.getAllWindows().length === 0) createWindow();
221
+ });
222
+ });
223
+
224
+ app.on('window-all-closed', () => {
225
+ if (process.platform !== 'darwin') app.quit();
226
+ });
227
+ `;
228
+ }
229
+ function getPreloadTemplate() {
230
+ return `const { contextBridge, ipcRenderer } = require('electron');
231
+
232
+ contextBridge.exposeInMainWorld('electronAPI', {
233
+ platform: process.platform,
234
+ getVersion: () => ipcRenderer.invoke('get-version'),
235
+ minimize: () => ipcRenderer.send('window-minimize'),
236
+ maximize: () => ipcRenderer.send('window-maximize'),
237
+ close: () => ipcRenderer.send('window-close'),
238
+ });
239
+ `;
240
+ }
241
+ // Wrapper mode template - Simple BrowserWindow approach (no BrowserView)
242
+ function getWrapperMainTemplate(config) {
243
+ return `const { app, BrowserWindow, shell } = require('electron');
244
+ const path = require('path');
245
+
246
+ try {
247
+ if (require('electron-squirrel-startup')) app.quit();
248
+ } catch (e) {}
249
+
250
+ let mainWindow;
251
+ const TARGET_URL = '${config.targetUrl}';
252
+ const APP_NAME = '${config.appName}';
253
+
254
+ function createWindow() {
255
+ mainWindow = new BrowserWindow({
256
+ width: ${config.width},
257
+ height: ${config.height},
258
+ title: APP_NAME,
259
+ backgroundColor: '#ffffff',
260
+ webPreferences: {
261
+ nodeIntegration: false,
262
+ contextIsolation: true,
263
+ // Enable DevTools for debugging (press F12 or Cmd+Option+I)
264
+ devTools: true,
265
+ // Enable hardware acceleration for proper rendering
266
+ backgroundThrottling: false,
267
+ offscreen: false,
268
+ },
269
+ show: false,
270
+ });
271
+
272
+ // Show window when ready
273
+ mainWindow.once('ready-to-show', () => mainWindow.show());
274
+
275
+ // Handle external links - open in default browser
276
+ mainWindow.webContents.setWindowOpenHandler(({ url }) => {
277
+ // Keep payment gateways in the app
278
+ if (url.includes('shopier') || url.includes('iyzico') || url.includes('paytr') ||
279
+ url.includes('param') || url.includes('3dsecure') || url.includes('bank') ||
280
+ url.startsWith(TARGET_URL)) {
281
+ mainWindow.loadURL(url);
282
+ return { action: 'deny' };
283
+ }
284
+ // Open other links in default browser
285
+ shell.openExternal(url);
286
+ return { action: 'deny' };
287
+ });
288
+
289
+ // Log navigation for debugging
290
+ mainWindow.webContents.on('will-navigate', (event, url) => {
291
+ console.log('Navigating to:', url);
292
+ });
293
+
294
+ // Log console messages for debugging
295
+ mainWindow.webContents.on('console-message', (event, level, message, line, sourceId) => {
296
+ if (level >= 2) { // Only warnings and errors
297
+ console.log('Web Console:', message);
298
+ }
299
+ });
300
+
301
+ // Handle load failures
302
+ mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL, isMainFrame) => {
303
+ if (!isMainFrame) return;
304
+ console.log('Load failed:', errorCode, errorDescription, validatedURL);
305
+
306
+ // Show simple error page for network errors
307
+ if (errorCode === -106 || errorCode === -105 || errorCode === -102) {
308
+ mainWindow.loadURL(\`data:text/html;charset=utf-8,
309
+ <html>
310
+ <head><style>
311
+ body { font-family: -apple-system, sans-serif; background: #1a1a2e; color: white;
312
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
313
+ height: 100vh; margin: 0; text-align: center; }
314
+ h1 { margin-bottom: 16px; }
315
+ button { background: #4f46e5; color: white; border: none; padding: 12px 24px;
316
+ border-radius: 8px; cursor: pointer; font-size: 16px; }
317
+ </style></head>
318
+ <body>
319
+ <h1>Connection Error</h1>
320
+ <p>Unable to load \${APP_NAME}</p>
321
+ <button onclick="location.href='\${TARGET_URL}'">Try Again</button>
322
+ </body>
323
+ </html>
324
+ \`);
325
+ }
326
+ });
327
+
328
+ // Load the target URL directly
329
+ mainWindow.loadURL(TARGET_URL);
330
+ }
331
+
332
+ app.whenReady().then(() => {
333
+ createWindow();
334
+ app.on('activate', () => {
335
+ if (BrowserWindow.getAllWindows().length === 0) createWindow();
336
+ });
337
+ });
338
+
339
+ app.on('window-all-closed', () => {
340
+ if (process.platform !== 'darwin') app.quit();
341
+ });
342
+ `;
343
+ }
344
+ // ============================================================================
345
+ // GENERATOR
346
+ // ============================================================================
347
+ async function generateElectronFiles(dir, info, config) {
348
+ const electronDir = path_1.default.join(dir, 'electron');
349
+ const ext = info.isESModule ? 'cjs' : 'js';
350
+ await fs_extra_1.default.ensureDir(electronDir);
351
+ log.step(1, 'Electron directory created');
352
+ await fs_extra_1.default.writeFile(path_1.default.join(electronDir, `main.${ext}`), getMainTemplate(info, config));
353
+ log.step(2, `main.${ext} created`);
354
+ await fs_extra_1.default.writeFile(path_1.default.join(electronDir, `preload.${ext}`), getPreloadTemplate());
355
+ log.step(3, `preload.${ext} created`);
356
+ // Handle icon if provided
357
+ let iconName = null;
358
+ if (config.iconPath) {
359
+ iconName = await validateAndCopyIcon(config.iconPath, dir);
360
+ }
361
+ // electron-builder.json - use correct build directory
362
+ // extraMetadata removes "type": "module" to prevent ESM issues in production
363
+ const extraMeta = { main: `electron/main.${ext}` };
364
+ if (info.isESModule) {
365
+ // Override type to commonjs for Electron compatibility in production
366
+ extraMeta['type'] = 'commonjs';
367
+ }
368
+ // Build config with optional icon settings
369
+ const builderConfig = {
370
+ appId: 'com.electron.' + info.name.replace(/[^a-zA-Z0-9]/g, ''),
371
+ productName: info.name,
372
+ directories: { output: 'electron-dist', buildResources: 'electron/resources' },
373
+ files: ['electron/**/*', `${info.buildDir}/**/*`, 'package.json'],
374
+ extraMetadata: extraMeta,
375
+ mac: {
376
+ category: 'public.app-category.utilities',
377
+ target: ['dmg', 'zip'],
378
+ ...(iconName && { icon: `electron/resources/${iconName}` })
379
+ },
380
+ win: {
381
+ target: [
382
+ { target: 'nsis', arch: ['x64', 'ia32'] },
383
+ { target: 'portable', arch: ['x64', 'ia32'] }
384
+ ],
385
+ ...(iconName && { icon: `electron/resources/${iconName}` })
386
+ },
387
+ linux: {
388
+ target: ['AppImage', 'deb'],
389
+ category: 'Utility',
390
+ ...(iconName && { icon: `electron/resources/${iconName}` })
391
+ },
392
+ };
393
+ await fs_extra_1.default.writeJson(path_1.default.join(dir, 'electron-builder.json'), builderConfig, { spaces: 2 });
394
+ log.step(4, 'electron-builder.json created');
395
+ // Update package.json
396
+ const pkg = await readPackageJson(dir);
397
+ pkg.main = `electron/main.${ext}`;
398
+ pkg.devDependencies = pkg.devDependencies || {};
399
+ pkg.devDependencies['electron'] = '^28.0.0';
400
+ pkg.devDependencies['electron-builder'] = '^24.9.1';
401
+ pkg.devDependencies['concurrently'] = '^8.2.2';
402
+ pkg.devDependencies['wait-on'] = '^7.2.0';
403
+ pkg.scripts = pkg.scripts || {};
404
+ const port = info.devPort;
405
+ const startCmd = info.type === 'react' ? 'start' : 'dev';
406
+ pkg.scripts['electron'] = 'electron .';
407
+ pkg.scripts['electron:dev'] = `concurrently "npm run ${startCmd}" "wait-on http://localhost:${port} && electron ."`;
408
+ pkg.scripts['electron:build'] = 'npm run build && electron-builder';
409
+ pkg.scripts['electron:dist'] = 'electron-builder';
410
+ pkg.scripts['electron:dist:win'] = 'electron-builder --win';
411
+ pkg.scripts['electron:dist:mac'] = 'electron-builder --mac';
412
+ pkg.scripts['electron:dist:linux'] = 'electron-builder --linux';
413
+ pkg.scripts['electron:dist:all'] = 'electron-builder --mac --win --linux';
414
+ await fs_extra_1.default.writeJson(path_1.default.join(dir, 'package.json'), pkg, { spaces: 2 });
415
+ log.step(5, 'package.json updated');
416
+ if (info.isESModule) {
417
+ log.info('ESM project detected - using .cjs extension');
418
+ }
419
+ // Vite project configuration
420
+ if (info.type === 'vite') {
421
+ await configureViteForElectron(dir);
422
+ }
423
+ }
424
+ // Configure Vite for Electron (add base: './' for file:// protocol)
425
+ async function configureViteForElectron(dir) {
426
+ const configFiles = ['vite.config.js', 'vite.config.ts', 'vite.config.mjs'];
427
+ let configPath = null;
428
+ // Find existing config file
429
+ for (const file of configFiles) {
430
+ const fullPath = path_1.default.join(dir, file);
431
+ if (await fs_extra_1.default.pathExists(fullPath)) {
432
+ configPath = fullPath;
433
+ break;
434
+ }
435
+ }
436
+ if (configPath) {
437
+ // Read existing config
438
+ let content = await fs_extra_1.default.readFile(configPath, 'utf-8');
439
+ // Check if base already exists
440
+ if (content.includes("base:") || content.includes("base :")) {
441
+ log.info('vite.config already has base setting');
442
+ return;
443
+ }
444
+ // Add base: './' to existing config
445
+ if (content.includes('defineConfig({')) {
446
+ content = content.replace(/defineConfig\s*\(\s*\{/, "defineConfig({\n base: './',");
447
+ }
448
+ else if (content.includes('export default {')) {
449
+ content = content.replace(/export\s+default\s*\{/, "export default {\n base: './',");
450
+ }
451
+ await fs_extra_1.default.writeFile(configPath, content);
452
+ log.step(6, `${path_1.default.basename(configPath)} updated - added base: './'`);
453
+ }
454
+ else {
455
+ // No vite config found, skip (rare case)
456
+ log.warning('vite.config not found');
457
+ }
458
+ }
459
+ // Generate wrapper mode files (BrowserView approach)
460
+ async function generateWrapperFiles(dir, config) {
461
+ const electronDir = path_1.default.join(dir, 'electron');
462
+ await fs_extra_1.default.ensureDir(electronDir);
463
+ log.step(1, 'Electron directory created');
464
+ await fs_extra_1.default.writeFile(path_1.default.join(electronDir, 'main.js'), getWrapperMainTemplate(config));
465
+ log.step(2, 'main.js created (Wrapper Mode)');
466
+ // Handle icon if provided
467
+ let iconName = null;
468
+ if (config.iconPath) {
469
+ iconName = await validateAndCopyIcon(config.iconPath, dir);
470
+ }
471
+ // electron-builder.json for wrapper mode with optional icon
472
+ const builderConfig = {
473
+ appId: 'com.wrapper.' + config.appName.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(),
474
+ productName: config.appName,
475
+ directories: { output: 'electron-dist', buildResources: 'electron/resources' },
476
+ files: ['electron/**/*', 'package.json'],
477
+ extraMetadata: { main: 'electron/main.js' },
478
+ mac: {
479
+ category: 'public.app-category.utilities',
480
+ target: ['dmg', 'zip'],
481
+ ...(iconName && { icon: `electron/resources/${iconName}` })
482
+ },
483
+ win: {
484
+ target: [
485
+ { target: 'nsis', arch: ['x64', 'ia32'] },
486
+ { target: 'portable', arch: ['x64', 'ia32'] }
487
+ ],
488
+ ...(iconName && { icon: `electron/resources/${iconName}` })
489
+ },
490
+ linux: {
491
+ target: ['AppImage', 'deb'],
492
+ category: 'Utility',
493
+ ...(iconName && { icon: `electron/resources/${iconName}` })
494
+ },
495
+ };
496
+ await fs_extra_1.default.writeJson(path_1.default.join(dir, 'electron-builder.json'), builderConfig, { spaces: 2 });
497
+ log.step(3, 'electron-builder.json created');
498
+ // Create minimal package.json for wrapper
499
+ const appNameSlug = config.appName.toLowerCase().replace(/[^a-z0-9]/g, '-');
500
+ const pkg = {
501
+ name: appNameSlug,
502
+ version: '1.0.0',
503
+ description: `${config.appName} - Desktop Application`,
504
+ author: {
505
+ name: config.appName,
506
+ email: `info@${appNameSlug}.app`,
507
+ },
508
+ homepage: config.targetUrl,
509
+ main: 'electron/main.js',
510
+ scripts: {
511
+ 'start': 'electron .',
512
+ 'dist': 'electron-builder',
513
+ 'dist:win': 'electron-builder --win',
514
+ 'dist:mac': 'electron-builder --mac',
515
+ 'dist:linux': 'electron-builder --linux',
516
+ 'dist:all': 'electron-builder --mac --win --linux',
517
+ },
518
+ devDependencies: {
519
+ 'electron': '^28.0.0',
520
+ 'electron-builder': '^24.9.1',
521
+ },
522
+ };
523
+ // Only create package.json if not exists (for non-project wrapper)
524
+ const existingPkg = await readPackageJson(dir);
525
+ if (!existingPkg) {
526
+ await fs_extra_1.default.writeJson(path_1.default.join(dir, 'package.json'), pkg, { spaces: 2 });
527
+ log.step(4, 'package.json created');
528
+ }
529
+ else {
530
+ existingPkg.main = 'electron/main.js';
531
+ existingPkg.devDependencies = existingPkg.devDependencies || {};
532
+ existingPkg.devDependencies['electron'] = '^28.0.0';
533
+ existingPkg.devDependencies['electron-builder'] = '^24.9.1';
534
+ existingPkg.scripts = existingPkg.scripts || {};
535
+ existingPkg.scripts['electron'] = 'electron .';
536
+ existingPkg.scripts['electron:dist'] = 'electron-builder';
537
+ await fs_extra_1.default.writeJson(path_1.default.join(dir, 'package.json'), existingPkg, { spaces: 2 });
538
+ log.step(4, 'package.json updated');
539
+ }
540
+ }
541
+ // Post-setup actions: install deps, test, and/or build
542
+ async function runPostSetupActions(targetDir, isWrapper = false) {
543
+ const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
544
+ console.log('');
545
+ log.info('Installing dependencies...\n');
546
+ // Run npm install
547
+ await new Promise((resolve, reject) => {
548
+ const npmInstall = spawn('npm', ['install'], {
549
+ cwd: targetDir,
550
+ stdio: 'inherit',
551
+ shell: true,
552
+ });
553
+ npmInstall.on('close', (code) => {
554
+ if (code === 0)
555
+ resolve();
556
+ else
557
+ reject(new Error(`npm install failed with code ${code}`));
558
+ });
559
+ });
560
+ console.log('');
561
+ log.success('Dependencies installed!\n');
562
+ // Ask what to do next
563
+ const { action } = await inquirer_1.default.prompt([
564
+ {
565
+ type: 'list',
566
+ name: 'action',
567
+ message: 'What would you like to do?',
568
+ choices: [
569
+ { name: '🧪 Test (open the app)', value: 'test' },
570
+ { name: '📦 Create Distribution Package', value: 'dist' },
571
+ { name: '⏭️ Do Nothing For Now', value: 'nothing' },
572
+ ],
573
+ },
574
+ ]);
575
+ if (action === 'nothing') {
576
+ console.log('');
577
+ log.info('Okay! You can use the following commands later:\n');
578
+ if (isWrapper) {
579
+ console.log(chalk_1.default.gray(` cd ${targetDir}`));
580
+ console.log(chalk_1.default.gray(' npm start # For testing'));
581
+ console.log(chalk_1.default.gray(' npm run dist # For distribution package'));
582
+ }
583
+ else {
584
+ console.log(chalk_1.default.gray(' npm run electron:dev # Test in development mode'));
585
+ console.log(chalk_1.default.gray(' npm run electron:dist # For distribution package'));
586
+ }
587
+ console.log('');
588
+ return;
589
+ }
590
+ if (action === 'test') {
591
+ console.log('');
592
+ log.info('Starting application...\n');
593
+ const testCmd = isWrapper ? 'start' : 'electron:dev';
594
+ const testProcess = spawn('npm', ['run', testCmd], {
595
+ cwd: targetDir,
596
+ stdio: 'inherit',
597
+ shell: true,
598
+ });
599
+ // Don't wait for test process to finish
600
+ testProcess.unref();
601
+ return;
602
+ }
603
+ if (action === 'dist') {
604
+ // Ask for platforms
605
+ const { platforms } = await inquirer_1.default.prompt([
606
+ {
607
+ type: 'checkbox',
608
+ name: 'platforms',
609
+ message: 'Which platforms should we build for?',
610
+ choices: [
611
+ { name: '🌐 All Platforms', value: 'all', checked: false },
612
+ { name: '🍎 macOS', value: 'mac', checked: process.platform === 'darwin' },
613
+ { name: '🪟 Windows', value: 'win', checked: false },
614
+ { name: '🐧 Linux', value: 'linux', checked: false },
615
+ ],
616
+ validate: (input) => {
617
+ if (input.length === 0) {
618
+ return 'You must select at least one platform!';
619
+ }
620
+ return true;
621
+ },
622
+ },
623
+ ]);
624
+ console.log('');
625
+ // Check if "all" is selected
626
+ const selectedPlatforms = platforms.includes('all')
627
+ ? ['mac', 'win', 'linux']
628
+ : platforms;
629
+ log.info(`Creating distribution packages: ${selectedPlatforms.join(', ')}\n`);
630
+ // Build all selected platforms in a single command for efficiency
631
+ const platformFlags = selectedPlatforms.map(p => `--${p}`).join(' ');
632
+ const distCmd = isWrapper ? 'dist' : 'electron:dist';
633
+ log.info(`📦 Building packages: ${selectedPlatforms.map(p => p.toUpperCase()).join(', ')}...`);
634
+ await new Promise((resolve, reject) => {
635
+ const buildProcess = spawn('npm', ['run', distCmd, '--', ...selectedPlatforms.map(p => `--${p}`)], {
636
+ cwd: targetDir,
637
+ stdio: 'inherit',
638
+ shell: true,
639
+ });
640
+ buildProcess.on('close', (code) => {
641
+ if (code === 0)
642
+ resolve();
643
+ else
644
+ reject(new Error(`Build failed`));
645
+ });
646
+ });
647
+ log.success(`✅ All packages created!`);
648
+ console.log('');
649
+ log.success(chalk_1.default.bold('All packages have been created! 🎉'));
650
+ log.info(`Packages located at: ${chalk_1.default.cyan(path_1.default.join(targetDir, 'electron-dist'))}`);
651
+ console.log('');
652
+ }
653
+ }
654
+ // ============================================================================
655
+ // CLI
656
+ // ============================================================================
657
+ const VERSION = '1.0.0';
658
+ const banner = `
659
+ ${chalk_1.default.cyan('╔═══════════════════════════════════════════════════════════╗')}
660
+ ${chalk_1.default.cyan('║')} ${chalk_1.default.bold.white('⚡ ELECTRONIZER')} ${chalk_1.default.cyan('║')}
661
+ ${chalk_1.default.cyan('║')} ${chalk_1.default.gray('React/Vite/Next.js → Electron Desktop App')} ${chalk_1.default.cyan('║')}
662
+ ${chalk_1.default.cyan('╚═══════════════════════════════════════════════════════════╝')}
663
+ `;
664
+ commander_1.program
665
+ .name('electronizer')
666
+ .description('Convert React/Vite/Next.js projects to Electron desktop apps')
667
+ .version(VERSION);
668
+ commander_1.program
669
+ .command('init')
670
+ .description('Initialize Electron in the current project')
671
+ .option('-y, --yes', 'Skip prompts and use defaults')
672
+ .option('-n, --name <name>', 'Application name')
673
+ .option('-w, --width <width>', 'Window width', '1200')
674
+ .option('-h, --height <height>', 'Window height', '800')
675
+ .option('-i, --icon <path>', 'Application icon path (.png, .ico, .icns)')
676
+ .action(async (options) => {
677
+ console.log(banner);
678
+ const cwd = process.cwd();
679
+ if (await fs_extra_1.default.pathExists(path_1.default.join(cwd, 'electron'))) {
680
+ log.warning('This project has already been initialized with Electron!');
681
+ process.exit(1);
682
+ }
683
+ log.info('Analyzing project...');
684
+ const info = await detectProject(cwd);
685
+ if (!info) {
686
+ log.error('package.json not found!');
687
+ process.exit(1);
688
+ }
689
+ // WRAPPER MODE - Next.js and unsupported frameworks
690
+ if (info.type === 'wrapper') {
691
+ console.log('');
692
+ log.warning('Next.js detected!');
693
+ log.info('Using Wrapper Mode (URL loading with BrowserView)');
694
+ console.log('');
695
+ console.log(chalk_1.default.yellow(' ℹ Wrapper Mode: Packages your website as a desktop application.'));
696
+ console.log(chalk_1.default.yellow(' ℹ Includes offline detection and loading spinner.'));
697
+ console.log(chalk_1.default.yellow(' ℹ Will be created in a separate folder (no conflict with Next.js).'));
698
+ console.log('');
699
+ // Generate default output path
700
+ const defaultOutputDir = path_1.default.join(path_1.default.dirname(cwd), `${info.name}-electron`);
701
+ const wrapperAnswers = await inquirer_1.default.prompt([
702
+ {
703
+ type: 'input',
704
+ name: 'appName',
705
+ message: 'Application name:',
706
+ default: info.name,
707
+ },
708
+ {
709
+ type: 'input',
710
+ name: 'targetUrl',
711
+ message: 'Target URL (deployed site):',
712
+ default: 'https://example.com',
713
+ validate: (input) => {
714
+ if (!input.startsWith('http://') && !input.startsWith('https://')) {
715
+ return 'URL must start with http:// or https://';
716
+ }
717
+ return true;
718
+ },
719
+ },
720
+ {
721
+ type: 'input',
722
+ name: 'outputDir',
723
+ message: 'Output folder (wrapper app will be created here):',
724
+ default: defaultOutputDir,
725
+ },
726
+ {
727
+ type: 'input',
728
+ name: 'iconPath',
729
+ message: 'Icon file path (optional):',
730
+ default: '',
731
+ suffix: chalk_1.default.gray(' (.png, .ico, .icns)'),
732
+ },
733
+ { type: 'number', name: 'width', message: 'Window width:', default: 1200 },
734
+ { type: 'number', name: 'height', message: 'Window height:', default: 800 },
735
+ ]);
736
+ const wrapperConfig = {
737
+ appName: wrapperAnswers.appName,
738
+ targetUrl: wrapperAnswers.targetUrl,
739
+ width: wrapperAnswers.width,
740
+ height: wrapperAnswers.height,
741
+ iconPath: wrapperAnswers.iconPath || undefined,
742
+ };
743
+ // Use the specified output directory
744
+ const outputDir = path_1.default.resolve(wrapperAnswers.outputDir);
745
+ // Create output directory if not exists
746
+ await fs_extra_1.default.ensureDir(outputDir);
747
+ console.log('');
748
+ log.info(`Creating wrapper files in: ${chalk_1.default.cyan(outputDir)}\n`);
749
+ await generateWrapperFiles(outputDir, wrapperConfig);
750
+ console.log('');
751
+ log.success(chalk_1.default.bold('Wrapper Mode successfully created! 🎉'));
752
+ // Run post-setup actions (install, test/dist/nothing)
753
+ await runPostSetupActions(outputDir, true);
754
+ return;
755
+ }
756
+ // NORMAL MODE - Vite, CRA
757
+ if (info.type === 'unknown') {
758
+ log.warning('Project type could not be detected.');
759
+ }
760
+ else {
761
+ log.success(`Project type: ${chalk_1.default.bold(getProjectTypeName(info.type))}`);
762
+ }
763
+ log.info(`Project name: ${chalk_1.default.bold(info.name)}`);
764
+ log.info(`TypeScript: ${info.hasTypeScript ? chalk_1.default.green('Yes') : chalk_1.default.yellow('No')}`);
765
+ log.info(`Dev port: ${chalk_1.default.bold(info.devPort)}`);
766
+ let config;
767
+ if (options.yes) {
768
+ config = {
769
+ appName: options.name || info.name,
770
+ width: parseInt(options.width, 10),
771
+ height: parseInt(options.height, 10),
772
+ singleInstance: true,
773
+ iconPath: options.icon || undefined,
774
+ };
775
+ }
776
+ else {
777
+ console.log('');
778
+ const answers = await inquirer_1.default.prompt([
779
+ { type: 'input', name: 'appName', message: 'Application name:', default: options.name || info.name },
780
+ { type: 'number', name: 'width', message: 'Window width:', default: parseInt(options.width, 10) },
781
+ { type: 'number', name: 'height', message: 'Window height:', default: parseInt(options.height, 10) },
782
+ { type: 'confirm', name: 'singleInstance', message: 'Single instance mode:', default: true },
783
+ {
784
+ type: 'input',
785
+ name: 'iconPath',
786
+ message: 'Icon file path (optional):',
787
+ default: '',
788
+ suffix: chalk_1.default.gray(' (.png, .ico, .icns)'),
789
+ },
790
+ ]);
791
+ config = {
792
+ ...answers,
793
+ iconPath: answers.iconPath || undefined,
794
+ };
795
+ }
796
+ console.log('');
797
+ log.info('Creating Electron files...\n');
798
+ await generateElectronFiles(cwd, info, config);
799
+ console.log('');
800
+ log.success(chalk_1.default.bold('Electron successfully integrated! 🎉'));
801
+ // Run post-setup actions (install, test/dist/nothing)
802
+ await runPostSetupActions(cwd, false);
803
+ });
804
+ commander_1.program
805
+ .command('info')
806
+ .description('Show project information')
807
+ .action(async () => {
808
+ const info = await detectProject(process.cwd());
809
+ if (!info) {
810
+ log.error('package.json not found!');
811
+ process.exit(1);
812
+ }
813
+ console.log(banner);
814
+ console.log(` ${chalk_1.default.gray('Type:')} ${getProjectTypeName(info.type)}`);
815
+ console.log(` ${chalk_1.default.gray('Name:')} ${info.name}`);
816
+ console.log(` ${chalk_1.default.gray('TypeScript:')} ${info.hasTypeScript ? 'Yes' : 'No'}`);
817
+ console.log(` ${chalk_1.default.gray('ESM:')} ${info.isESModule ? 'Yes' : 'No'}`);
818
+ console.log(` ${chalk_1.default.gray('Dev Port:')} ${info.devPort}\n`);
819
+ });
820
+ commander_1.program.parse();
821
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "electronizer",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to convert React/Vite/Next.js projects to Electron desktop apps",
5
+ "main": "electron/main.js",
6
+ "bin": {
7
+ "electronizer": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/hardaistee/electronizer.git"
16
+ },
17
+ "homepage": "https://github.com/hardaistee/electronizer#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/hardaistee/electronizer/issues"
20
+ },
21
+ "author": "hardaistee",
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsc -w",
25
+ "start": "node dist/index.js",
26
+ "prepublishOnly": "npm run build",
27
+ "electron": "electron .",
28
+ "electron:dev": "concurrently \"npm run dev\" \"wait-on http://localhost:3000 && electron .\"",
29
+ "electron:build": "npm run build && electron-builder",
30
+ "electron:dist": "electron-builder",
31
+ "electron:dist:win": "electron-builder --win",
32
+ "electron:dist:mac": "electron-builder --mac",
33
+ "electron:dist:linux": "electron-builder --linux"
34
+ },
35
+ "keywords": [
36
+ "electron",
37
+ "react",
38
+ "vite",
39
+ "nextjs",
40
+ "cli",
41
+ "desktop",
42
+ "converter"
43
+ ],
44
+ "license": "MIT",
45
+ "dependencies": {
46
+ "chalk": "^4.1.2",
47
+ "commander": "^11.1.0",
48
+ "fs-extra": "^11.2.0",
49
+ "inquirer": "^8.2.6"
50
+ },
51
+ "devDependencies": {
52
+ "@types/fs-extra": "^11.0.4",
53
+ "@types/inquirer": "^8.2.10",
54
+ "@types/node": "^20.10.0",
55
+ "typescript": "^5.3.2",
56
+ "electron": "^28.0.0",
57
+ "electron-builder": "^24.9.1",
58
+ "concurrently": "^8.2.2",
59
+ "wait-on": "^7.2.0"
60
+ },
61
+ "engines": {
62
+ "node": ">=16.0.0"
63
+ }
64
+ }