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 +118 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +821 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|