@tomjs/vite-plugin-electron 1.11.0 → 2.0.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.
package/dist/index.js DELETED
@@ -1,492 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/index.ts
2
- var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
3
- var _path = require('path'); var _path2 = _interopRequireDefault(_path);
4
- var _lodashclonedeep = require('lodash.clonedeep'); var _lodashclonedeep2 = _interopRequireDefault(_lodashclonedeep);
5
- var _lodashmerge = require('lodash.merge'); var _lodashmerge2 = _interopRequireDefault(_lodashmerge);
6
-
7
- // src/builder.ts
8
- var _os = require('os'); var _os2 = _interopRequireDefault(_os);
9
-
10
- var _process = require('process');
11
-
12
- var _shelljs = require('shelljs'); var _shelljs2 = _interopRequireDefault(_shelljs);
13
-
14
- // src/logger.ts
15
- var _dayjs = require('dayjs'); var _dayjs2 = _interopRequireDefault(_dayjs);
16
- var _kolorist = require('kolorist');
17
-
18
- // src/constants.ts
19
- var PLUGIN_NAME = "tomjs:electron";
20
-
21
- // src/logger.ts
22
- var Logger = class {
23
- constructor(tag, withTime) {
24
- this.tag = PLUGIN_NAME;
25
- this.withTime = true;
26
- this.tag = `[${tag}]`;
27
- this.withTime = _nullishCoalesce(withTime, () => ( true));
28
- }
29
- getTime() {
30
- return `${this.withTime ? _dayjs2.default.call(void 0, ).format("HH:mm:ss") : ""} `;
31
- }
32
- /**
33
- * 调试
34
- */
35
- debug(msg, ...rest) {
36
- console.log(`${this.getTime()}${_kolorist.gray.call(void 0, this.tag)}`, msg, ...rest);
37
- }
38
- /**
39
- * 调试日志 等同 debug
40
- */
41
- log(msg, ...rest) {
42
- this.debug(msg, ...rest);
43
- }
44
- info(msg, ...rest) {
45
- console.log(`${this.getTime()}${_kolorist.blue.call(void 0, this.tag)}`, msg, ...rest);
46
- }
47
- warn(msg, ...rest) {
48
- console.log(`${this.getTime()}${_kolorist.yellow.call(void 0, this.tag)}`, msg, ...rest);
49
- }
50
- error(msg, ...rest) {
51
- console.log(`${this.getTime()}${_kolorist.red.call(void 0, this.tag)}`, msg, ...rest);
52
- }
53
- success(msg, ...rest) {
54
- console.log(`${this.getTime()}${_kolorist.green.call(void 0, this.tag)}`, msg, ...rest);
55
- }
56
- };
57
- function createLogger(tag) {
58
- return new Logger(tag || PLUGIN_NAME, true);
59
- }
60
-
61
- // src/utils.ts
62
-
63
- var _module = require('module');
64
- function readJson(path3) {
65
- if (_fs2.default.existsSync(path3)) {
66
- return JSON.parse(_fs2.default.readFileSync(path3, "utf8"));
67
- }
68
- }
69
- function writeJson(path3, data) {
70
- _fs2.default.writeFileSync(path3, JSON.stringify(data, null, 2), "utf8");
71
- }
72
- function resolveHostname(hostname) {
73
- const loopbackHosts = /* @__PURE__ */ new Set([
74
- "localhost",
75
- "127.0.0.1",
76
- "::1",
77
- "0000:0000:0000:0000:0000:0000:0000:0001"
78
- ]);
79
- const wildcardHosts = /* @__PURE__ */ new Set(["0.0.0.0", "::", "0000:0000:0000:0000:0000:0000:0000:0000"]);
80
- return loopbackHosts.has(hostname) || wildcardHosts.has(hostname) ? "localhost" : hostname;
81
- }
82
- function resolveServerUrl(server) {
83
- const addressInfo = server.httpServer.address();
84
- const isAddressInfo = (x) => x == null ? void 0 : x.address;
85
- if (isAddressInfo(addressInfo)) {
86
- const { address, port } = addressInfo;
87
- const hostname = resolveHostname(address);
88
- const options = server.config.server;
89
- const protocol = options.https ? "https" : "http";
90
- const devBase = server.config.base;
91
- const path3 = typeof options.open === "string" ? options.open : devBase;
92
- const url = path3.startsWith("http") ? path3 : `${protocol}://${hostname}:${port}${path3}`;
93
- return url;
94
- }
95
- }
96
-
97
- // src/builder.ts
98
- var logger = createLogger();
99
- function getMirror() {
100
- let mirror = process.env.ELECTRON_MIRROR;
101
- if (mirror) {
102
- return mirror;
103
- }
104
- const res = _shelljs2.default.exec("npm config get registry", { silent: true });
105
- if (res.code === 0) {
106
- let registry = res.stdout;
107
- if (!registry) {
108
- return;
109
- }
110
- registry = registry.trim();
111
- if (registry && ["registry.npmmirror.com", "registry.npm.taobao.org"].find((s) => registry.includes(s))) {
112
- mirror = "https://npmmirror.com/mirrors/electron";
113
- }
114
- }
115
- return mirror;
116
- }
117
- function getBuilderConfig(options, resolvedConfig) {
118
- var _a;
119
- const config = {
120
- directories: {
121
- buildResources: "electron/build",
122
- app: _path2.default.dirname(resolvedConfig.build.outDir),
123
- output: "release/${version}"
124
- },
125
- files: ["main", "preload", "renderer"],
126
- artifactName: "${productName}-${version}-${os}-${arch}.${ext}",
127
- electronDownload: {
128
- mirror: getMirror()
129
- },
130
- electronLanguages: ["zh-CN", "en-US"],
131
- win: {
132
- target: [
133
- {
134
- target: "nsis",
135
- arch: ["x64"]
136
- }
137
- ]
138
- },
139
- mac: {
140
- target: ["dmg"]
141
- },
142
- linux: {
143
- target: ["zip"]
144
- },
145
- nsis: {
146
- oneClick: false,
147
- perMachine: false,
148
- allowToChangeInstallationDirectory: true,
149
- deleteAppDataOnUninstall: false
150
- }
151
- };
152
- if (typeof options.builder == "boolean") {
153
- return config;
154
- }
155
- const { appId, productName } = options.builder || {};
156
- return _lodashmerge2.default.call(void 0, config, { appId, productName }, (_a = options.builder) == null ? void 0 : _a.builderConfig);
157
- }
158
- function createPkg(options, resolvedConfig) {
159
- var _a, _b;
160
- const externals = options.external || [];
161
- const viteExternals = (_a = resolvedConfig.build.rollupOptions) == null ? void 0 : _a.external;
162
- if (Array.isArray(viteExternals)) {
163
- externals.push(...viteExternals);
164
- } else if (typeof viteExternals === "string") {
165
- externals.push(viteExternals);
166
- }
167
- const pkg = readJson(_path2.default.join(process.cwd(), "package.json"));
168
- if (!pkg) {
169
- throw new Error(`package.json not found in ${process.cwd()}`);
170
- }
171
- const outDir = _path2.default.dirname(resolvedConfig.build.outDir);
172
- let main = pkg.main;
173
- if (main) {
174
- main = main.replace("./", "");
175
- main = main.substring(main.indexOf(outDir) + outDir.length);
176
- if (main.startsWith("/")) {
177
- main = main.substring(1);
178
- }
179
- } else {
180
- main = `main/index.${((_b = options == null ? void 0 : options.main) == null ? void 0 : _b.format) === "esm" ? "" : "m"}js`;
181
- }
182
- const newPkg = {
183
- name: pkg.name,
184
- version: pkg.version,
185
- description: pkg.description,
186
- type: pkg.type || "commonjs",
187
- author: getAuthor(pkg.author),
188
- main,
189
- dependencies: getDeps()
190
- };
191
- writeJson(_path2.default.join(outDir, "package.json"), newPkg);
192
- function getAuthor(author) {
193
- const uname = _os2.default.userInfo().username;
194
- if (!author) {
195
- return uname;
196
- } else if (typeof author === "string") {
197
- return author;
198
- } else if (typeof author === "object") {
199
- if (!author.name) {
200
- return uname;
201
- }
202
- const email = author.email ? ` <${author.email}>` : "";
203
- return `${author.name}${email}`;
204
- }
205
- return uname;
206
- }
207
- function checkDepName(rules, name) {
208
- return !!rules.find((s) => {
209
- if (typeof s === "string") {
210
- return s.includes(name);
211
- } else {
212
- return s.test(name);
213
- }
214
- });
215
- }
216
- function getDeps() {
217
- const deps = pkg.dependencies || {};
218
- const newDeps = {};
219
- Object.keys(deps).forEach((name) => {
220
- if (checkDepName(externals, name)) {
221
- newDeps[name] = deps[name];
222
- }
223
- });
224
- return newDeps;
225
- }
226
- return newPkg;
227
- }
228
- async function runElectronBuilder(options, resolvedConfig) {
229
- if (typeof options.builder == "boolean" && options.builder === false) {
230
- return;
231
- }
232
- logger.info("building electron app...");
233
- const DIST_PATH = _path2.default.join(_process.cwd.call(void 0, ), _path2.default.dirname(resolvedConfig.build.outDir));
234
- createPkg(options, resolvedConfig);
235
- logger.info(`create package.json and exec "npm install"`);
236
- _shelljs2.default.exec(`cd ${DIST_PATH} && npm install --emit=dev`);
237
- logger.info(`run electron-builder to package app`);
238
- const config = getBuilderConfig(options, resolvedConfig);
239
- const { build } = await Promise.resolve().then(() => _interopRequireWildcard(require("electron-builder")));
240
- await build({
241
- config
242
- });
243
- }
244
-
245
- // src/main.ts
246
- var _child_process = require('child_process');
247
- var _electron = require('electron'); var _electron2 = _interopRequireDefault(_electron);
248
- var _treekill = require('tree-kill'); var _treekill2 = _interopRequireDefault(_treekill);
249
- var _tsup = require('tsup');
250
- var logger2 = createLogger();
251
- function getBuildOptions(options) {
252
- return ["main", "preload"].filter((s) => options[s] && options[s].entry).map((s) => {
253
- options[s].__NAME__ = s;
254
- return options[s];
255
- }).map((cfg) => {
256
- return {
257
- ...cfg,
258
- splitting: false,
259
- silent: true
260
- };
261
- });
262
- }
263
- async function startup(options) {
264
- if (options.debug) {
265
- return;
266
- }
267
- await startup.exit();
268
- const args = ["."];
269
- if (options.inspect) {
270
- if (typeof options.inspect === "number") {
271
- args.push(`--inspect=${options.inspect}`);
272
- } else {
273
- args.push(`--inspect`);
274
- }
275
- }
276
- process.electronApp = _child_process.spawn.call(void 0, _electron2.default, args, {
277
- stdio: "inherit"
278
- });
279
- process.electronApp.once("exit", process.exit);
280
- process.once("exit", () => {
281
- startup.exit();
282
- process.electronApp.kill();
283
- });
284
- }
285
- startup.exit = async () => {
286
- if (!process.electronApp) {
287
- return;
288
- }
289
- process.electronApp.removeAllListeners();
290
- return new Promise((resolve, reject) => {
291
- _treekill2.default.call(void 0, process.electronApp.pid, (err) => {
292
- if (err) {
293
- reject(err);
294
- } else {
295
- resolve(true);
296
- }
297
- });
298
- });
299
- };
300
- async function runServe(options, server) {
301
- options.debug && logger2.warn(`debug mode`);
302
- const buildOptions = getBuildOptions(options);
303
- const buildCounts = [0, buildOptions.length > 1 ? 0 : 1];
304
- for (let i = 0; i < buildOptions.length; i++) {
305
- const tsOpts = buildOptions[i];
306
- const { __NAME__: name, onSuccess: _onSuccess, watch, ...tsupOptions } = tsOpts;
307
- logger2.info(`${name} build`);
308
- const onSuccess = async () => {
309
- if (typeof _onSuccess === "function") {
310
- await _onSuccess();
311
- }
312
- if (buildCounts[i] <= 0) {
313
- buildCounts[i]++;
314
- logger2.info(`${name} build success`);
315
- if (buildCounts[0] === 1 && buildCounts[1] === 1) {
316
- logger2.info("startup electron");
317
- await startup(options);
318
- }
319
- return;
320
- }
321
- logger2.success(`${name} rebuild success`);
322
- if (name === "main") {
323
- logger2.info("restart electron");
324
- await startup(options);
325
- } else {
326
- logger2.info("reload page");
327
- server.ws.send({
328
- type: "full-reload"
329
- });
330
- }
331
- };
332
- await _tsup.build.call(void 0, { onSuccess, watch: true, ...tsupOptions });
333
- }
334
- }
335
- async function runBuild(options) {
336
- const buildOptions = getBuildOptions(options);
337
- for (let i = 0; i < buildOptions.length; i++) {
338
- await _tsup.build.call(void 0, buildOptions[i]);
339
- }
340
- }
341
-
342
- // src/index.ts
343
- var isDev = process.env.NODE_ENV === "development";
344
- function getPkg() {
345
- const pkgFile = _path2.default.resolve(process.cwd(), "package.json");
346
- if (!_fs2.default.existsSync(pkgFile)) {
347
- throw new Error("Main file is not specified, and no package.json found");
348
- }
349
- const pkg = readJson(pkgFile);
350
- if (!pkg.main) {
351
- throw new Error("Main file is not specified, please check package.json");
352
- }
353
- return pkg;
354
- }
355
- function preMergeOptions(options) {
356
- const pkg = getPkg();
357
- const format = pkg.type === "module" ? "esm" : "cjs";
358
- const electron2 = {
359
- target: format === "esm" ? "node18.18" : "node16",
360
- format,
361
- shims: true,
362
- clean: true,
363
- dts: false,
364
- treeshake: !!isDev,
365
- outExtension({ format: format2 }) {
366
- return {
367
- js: format2 === "esm" ? ".mjs" : `.js`
368
- };
369
- }
370
- };
371
- const opts = _lodashmerge2.default.call(void 0,
372
- {
373
- recommended: true,
374
- debug: false,
375
- external: ["electron"],
376
- main: {
377
- ...electron2
378
- },
379
- preload: {
380
- ...electron2
381
- },
382
- builder: false
383
- },
384
- _lodashclonedeep2.default.call(void 0, options)
385
- );
386
- ["main", "preload"].forEach((prop) => {
387
- const opt = opts[prop];
388
- const fmt = opt.format;
389
- opt.format = ["cjs", "esm"].includes(fmt) ? [fmt] : [format];
390
- const entry = opt.entry;
391
- if (entry === void 0) {
392
- const filePath = `electron/${prop}/index.ts`;
393
- if (_fs2.default.existsSync(_path2.default.join(process.cwd(), filePath))) {
394
- opt.entry = [filePath];
395
- }
396
- } else if (typeof entry === "string") {
397
- opt.entry = [entry];
398
- }
399
- if (isDev) {
400
- opt.sourcemap ??= true;
401
- } else {
402
- opt.minify ??= true;
403
- }
404
- const external = opt.external || opts.external || ["electron"];
405
- opt.external = [...new Set(["electron"].concat(external))];
406
- });
407
- return opts;
408
- }
409
- function geNumberBooleanValue(value) {
410
- if (typeof value !== "string" || value.trim() === "") {
411
- return;
412
- }
413
- if (["true", "false"].includes(value)) {
414
- return value === "true";
415
- }
416
- const v = Number(value);
417
- return Number.isNaN(v) ? void 0 : v;
418
- }
419
- function getBooleanValue(value) {
420
- if (typeof value !== "string" || value.trim() === "") {
421
- return;
422
- }
423
- if (["true", "false"].includes(value)) {
424
- return value === "true";
425
- }
426
- if (["1", "0"].includes(value)) {
427
- return value === "1";
428
- }
429
- }
430
- function useElectronPlugin(options) {
431
- const opts = preMergeOptions(options);
432
- let isServer = false;
433
- let resolvedConfig;
434
- return {
435
- name: PLUGIN_NAME,
436
- config(config, env) {
437
- var _a;
438
- isServer = env.command === "serve";
439
- let outDir = ((_a = config == null ? void 0 : config.build) == null ? void 0 : _a.outDir) || "dist";
440
- opts.main ||= {};
441
- opts.preload ||= {};
442
- if (opts.recommended) {
443
- opts.main.outDir = _path2.default.join(outDir, "main");
444
- opts.preload.outDir = _path2.default.join(outDir, "preload");
445
- outDir = _path2.default.join(outDir, "renderer");
446
- } else {
447
- opts.main.outDir ||= _path2.default.join("dist-electron", "main");
448
- opts.preload.outDir ||= _path2.default.join("dist-electron", "preload");
449
- }
450
- return {
451
- build: {
452
- outDir
453
- }
454
- };
455
- },
456
- configResolved(config) {
457
- opts.debug = _nullishCoalesce(getBooleanValue(config.env.VITE_ELECTRON_DEBUG), () => ( opts.debug));
458
- opts.inspect = _nullishCoalesce(geNumberBooleanValue(config.env.VITE_ELECTRON_INSPECT), () => ( opts.inspect));
459
- opts.builder = _nullishCoalesce(getBooleanValue(config.env.VITE_ELECTRON_BUILDER), () => ( opts.builder));
460
- resolvedConfig = config;
461
- },
462
- configureServer(server) {
463
- if (!server || !server.httpServer) {
464
- return;
465
- }
466
- server.httpServer.on("listening", async () => {
467
- const env = {
468
- NODE_ENV: server.config.mode || "development",
469
- VITE_DEV_SERVER_URL: resolveServerUrl(server)
470
- };
471
- ["main", "preload"].forEach((prop) => {
472
- opts[prop].env = env;
473
- });
474
- await runServe(opts, server);
475
- });
476
- },
477
- async closeBundle() {
478
- if (isServer) {
479
- return;
480
- }
481
- await runBuild(opts);
482
- if (opts.recommended && opts.builder) {
483
- await runElectronBuilder(opts, resolvedConfig);
484
- }
485
- }
486
- };
487
- }
488
- var index_default = useElectronPlugin;
489
-
490
-
491
-
492
- exports.default = index_default; exports.useElectronPlugin = useElectronPlugin;