@cordy/electro-cli 1.0.9 → 1.1.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/dist/index.mjs +52 -70
- package/package.json +4 -4
package/dist/index.mjs
CHANGED
|
@@ -490,7 +490,7 @@ const cac = (name = "") => new CAC(name);
|
|
|
490
490
|
|
|
491
491
|
//#endregion
|
|
492
492
|
//#region package.json
|
|
493
|
-
var version$1 = "1.0
|
|
493
|
+
var version$1 = "1.1.0";
|
|
494
494
|
|
|
495
495
|
//#endregion
|
|
496
496
|
//#region src/dev/logger.ts
|
|
@@ -714,23 +714,23 @@ function validateConfig(config) {
|
|
|
714
714
|
error(`Main entry not found: ${mainEntry}`);
|
|
715
715
|
process.exit(1);
|
|
716
716
|
}
|
|
717
|
-
const
|
|
717
|
+
const views = config.views ?? [];
|
|
718
718
|
const names = /* @__PURE__ */ new Set();
|
|
719
|
-
for (const
|
|
720
|
-
if (names.has(
|
|
721
|
-
error(`Duplicate
|
|
719
|
+
for (const view of views) {
|
|
720
|
+
if (names.has(view.name)) {
|
|
721
|
+
error(`Duplicate view name "${view.name}". View names must be unique.`);
|
|
722
722
|
process.exit(1);
|
|
723
723
|
}
|
|
724
|
-
names.add(
|
|
724
|
+
names.add(view.name);
|
|
725
725
|
}
|
|
726
|
-
for (const
|
|
727
|
-
const
|
|
728
|
-
if (!existsSync(
|
|
729
|
-
error(`
|
|
726
|
+
for (const view of views) {
|
|
727
|
+
const viewEntry = resolve(dirname(view.__source), view.entry);
|
|
728
|
+
if (!existsSync(viewEntry)) {
|
|
729
|
+
error(`View "${view.name}" entry not found: ${viewEntry}`);
|
|
730
730
|
process.exit(1);
|
|
731
731
|
}
|
|
732
732
|
}
|
|
733
|
-
for (const
|
|
733
|
+
for (const view of views) if (view.features && view.features.length === 0) warn(`View "${view.name}" has an empty features array — it won't have access to any services.`);
|
|
734
734
|
}
|
|
735
735
|
/** Validate --sourcemap CLI value. Warns on unrecognized values. */
|
|
736
736
|
function validateSourcemap(value) {
|
|
@@ -905,9 +905,9 @@ function resolveSourcemap(mode) {
|
|
|
905
905
|
}
|
|
906
906
|
function createRendererConfig(opts) {
|
|
907
907
|
const input = {};
|
|
908
|
-
for (const
|
|
909
|
-
const sourceDir = dirname(
|
|
910
|
-
input[
|
|
908
|
+
for (const view of opts.views) {
|
|
909
|
+
const sourceDir = dirname(view.__source);
|
|
910
|
+
input[view.name] = resolve(sourceDir, view.entry);
|
|
911
911
|
}
|
|
912
912
|
const isBuild = !!opts.outDir;
|
|
913
913
|
const config = {
|
|
@@ -2636,15 +2636,15 @@ async function build$1(options) {
|
|
|
2636
2636
|
const root = loaded.root;
|
|
2637
2637
|
const outDir = resolve(root, options.outDir);
|
|
2638
2638
|
const codegenDir = resolve(root, ".electro");
|
|
2639
|
-
const
|
|
2639
|
+
const views = config.views ?? [];
|
|
2640
2640
|
const srcDir = resolve(root, "src");
|
|
2641
2641
|
session({
|
|
2642
2642
|
root,
|
|
2643
2643
|
main: resolve(dirname(config.runtime.__source), config.runtime.entry),
|
|
2644
|
-
preload:
|
|
2645
|
-
renderer:
|
|
2644
|
+
preload: views.length > 0 ? resolve(codegenDir, "generated/preload") : null,
|
|
2645
|
+
renderer: views.length > 0 ? resolve(root, dirname(relative(root, views[0].__source))) : null,
|
|
2646
2646
|
mode: "build",
|
|
2647
|
-
windows:
|
|
2647
|
+
windows: views.map((w) => ({
|
|
2648
2648
|
name: w.name,
|
|
2649
2649
|
entry: resolve(dirname(w.__source), w.entry)
|
|
2650
2650
|
}))
|
|
@@ -2653,7 +2653,7 @@ async function build$1(options) {
|
|
|
2653
2653
|
try {
|
|
2654
2654
|
const { files, envTypes } = generate({
|
|
2655
2655
|
scanResult: await scan(srcDir),
|
|
2656
|
-
|
|
2656
|
+
views,
|
|
2657
2657
|
outputDir: codegenDir,
|
|
2658
2658
|
srcDir
|
|
2659
2659
|
});
|
|
@@ -2688,7 +2688,7 @@ async function build$1(options) {
|
|
|
2688
2688
|
stepFail("main", err instanceof Error ? err.message : String(err));
|
|
2689
2689
|
process.exit(1);
|
|
2690
2690
|
}
|
|
2691
|
-
if (
|
|
2691
|
+
if (views.length > 0) try {
|
|
2692
2692
|
buildScope("preload");
|
|
2693
2693
|
await buildPreload({
|
|
2694
2694
|
config,
|
|
@@ -2704,12 +2704,12 @@ async function build$1(options) {
|
|
|
2704
2704
|
stepFail("preload", err instanceof Error ? err.message : String(err));
|
|
2705
2705
|
process.exit(1);
|
|
2706
2706
|
}
|
|
2707
|
-
if (
|
|
2707
|
+
if (views.length > 0) try {
|
|
2708
2708
|
buildScope("renderer");
|
|
2709
|
-
const userViteConfigs =
|
|
2709
|
+
const userViteConfigs = views.filter((w) => w.vite).map((w) => w.vite);
|
|
2710
2710
|
await build(createRendererConfig({
|
|
2711
2711
|
root,
|
|
2712
|
-
|
|
2712
|
+
views,
|
|
2713
2713
|
userViteConfigs: userViteConfigs.length > 0 ? userViteConfigs : void 0,
|
|
2714
2714
|
logLevel: "info",
|
|
2715
2715
|
customLogger: logger,
|
|
@@ -2717,7 +2717,7 @@ async function build$1(options) {
|
|
|
2717
2717
|
minify: options.minify,
|
|
2718
2718
|
sourcemap: options.sourcemap
|
|
2719
2719
|
}));
|
|
2720
|
-
await flattenRendererOutput(resolve(outDir, "renderer"),
|
|
2720
|
+
await flattenRendererOutput(resolve(outDir, "renderer"), views, root);
|
|
2721
2721
|
} catch (err) {
|
|
2722
2722
|
stepFail("renderer", err instanceof Error ? err.message : String(err));
|
|
2723
2723
|
process.exit(1);
|
|
@@ -2727,14 +2727,6 @@ async function build$1(options) {
|
|
|
2727
2727
|
async function buildMain(args) {
|
|
2728
2728
|
const runtimeEntry = args.config.runtime.entry;
|
|
2729
2729
|
const entry = resolve(dirname(args.config.runtime.__source), runtimeEntry);
|
|
2730
|
-
const windowDefs = (args.config.windows ?? []).map((w) => ({
|
|
2731
|
-
name: w.name,
|
|
2732
|
-
type: w.type,
|
|
2733
|
-
lifecycle: w.lifecycle,
|
|
2734
|
-
autoShow: w.autoShow,
|
|
2735
|
-
behavior: w.behavior,
|
|
2736
|
-
window: w.window
|
|
2737
|
-
}));
|
|
2738
2730
|
await build(createNodeConfig({
|
|
2739
2731
|
scope: "main",
|
|
2740
2732
|
root: args.root,
|
|
@@ -2751,14 +2743,13 @@ async function buildMain(args) {
|
|
|
2751
2743
|
userViteConfig: args.config.runtime.vite,
|
|
2752
2744
|
sourcemap: args.sourcemap,
|
|
2753
2745
|
customLogger: args.logger,
|
|
2754
|
-
logLevel: "info"
|
|
2755
|
-
define: { __ELECTRO_WINDOW_DEFINITIONS__: JSON.stringify(windowDefs) }
|
|
2746
|
+
logLevel: "info"
|
|
2756
2747
|
}));
|
|
2757
2748
|
}
|
|
2758
2749
|
async function buildPreload(args) {
|
|
2759
|
-
const
|
|
2750
|
+
const views = args.config.views ?? [];
|
|
2760
2751
|
const input = {};
|
|
2761
|
-
for (const
|
|
2752
|
+
for (const view of views) input[view.name] = resolve(args.codegenDir, `generated/preload/${view.name}.gen.ts`);
|
|
2762
2753
|
const firstEntry = Object.values(input)[0];
|
|
2763
2754
|
const preloadOutDir = resolve(args.outDir, "preload");
|
|
2764
2755
|
const preloadPlugins = [
|
|
@@ -2809,12 +2800,12 @@ async function buildPreload(args) {
|
|
|
2809
2800
|
* (e.g., `src/windows/main/index.html`) to `{name}/index.html`.
|
|
2810
2801
|
* Adjusts relative asset references to match the new depth.
|
|
2811
2802
|
*/
|
|
2812
|
-
async function flattenRendererOutput(rendererDir,
|
|
2803
|
+
async function flattenRendererOutput(rendererDir, views, root) {
|
|
2813
2804
|
const dirsToClean = /* @__PURE__ */ new Set();
|
|
2814
|
-
for (const
|
|
2815
|
-
const relPath = relative(root, resolve(dirname(
|
|
2805
|
+
for (const view of views) {
|
|
2806
|
+
const relPath = relative(root, resolve(dirname(view.__source), view.entry));
|
|
2816
2807
|
const oldHtmlPath = resolve(rendererDir, relPath);
|
|
2817
|
-
const newHtmlPath = resolve(rendererDir,
|
|
2808
|
+
const newHtmlPath = resolve(rendererDir, view.name, "index.html");
|
|
2818
2809
|
if (oldHtmlPath === newHtmlPath) continue;
|
|
2819
2810
|
let html = await readFile(oldHtmlPath, "utf-8");
|
|
2820
2811
|
const depthDiff = relPath.split("/").length - 1 - 1;
|
|
@@ -2827,7 +2818,7 @@ async function flattenRendererOutput(rendererDir, windows, root) {
|
|
|
2827
2818
|
await writeFile(newHtmlPath, html);
|
|
2828
2819
|
await unlink(oldHtmlPath);
|
|
2829
2820
|
const topDir = relPath.split("/")[0];
|
|
2830
|
-
if (topDir !==
|
|
2821
|
+
if (topDir !== view.name) dirsToClean.add(resolve(rendererDir, topDir));
|
|
2831
2822
|
}
|
|
2832
2823
|
for (const dir of dirsToClean) await rm(dir, {
|
|
2833
2824
|
recursive: true,
|
|
@@ -2885,16 +2876,16 @@ var DevServer = class {
|
|
|
2885
2876
|
this.root = loaded.root;
|
|
2886
2877
|
this.outputDir = this.outDirOverride ? resolve(this.root, this.outDirOverride) : resolve(this.root, ".electro");
|
|
2887
2878
|
this.configPaths.add(loaded.configPath);
|
|
2888
|
-
for (const
|
|
2889
|
-
const
|
|
2879
|
+
for (const view of this.config.views ?? []) this.configPaths.add(view.__source);
|
|
2880
|
+
const views = this.config.views ?? [];
|
|
2890
2881
|
const srcDir = resolve(this.root, "src");
|
|
2891
2882
|
const mainEntry = resolve(dirname(this.config.runtime.__source), this.config.runtime.entry);
|
|
2892
2883
|
session({
|
|
2893
2884
|
root: this.root,
|
|
2894
2885
|
main: mainEntry,
|
|
2895
|
-
preload:
|
|
2896
|
-
renderer:
|
|
2897
|
-
windows:
|
|
2886
|
+
preload: views.length > 0 ? resolve(this.outputDir, "generated/preload") : null,
|
|
2887
|
+
renderer: views.length > 0 ? resolve(this.root, dirname(relative(this.root, views[0].__source))) : null,
|
|
2888
|
+
windows: views.map((w) => ({
|
|
2898
2889
|
name: w.name,
|
|
2899
2890
|
entry: resolve(dirname(w.__source), w.entry)
|
|
2900
2891
|
}))
|
|
@@ -2907,7 +2898,7 @@ var DevServer = class {
|
|
|
2907
2898
|
stepFail("codegen", err instanceof Error ? err.message : String(err));
|
|
2908
2899
|
throw err;
|
|
2909
2900
|
}
|
|
2910
|
-
if (
|
|
2901
|
+
if (views.length > 0) {
|
|
2911
2902
|
const rendererTimer = startTimer();
|
|
2912
2903
|
try {
|
|
2913
2904
|
await this.startRenderer();
|
|
@@ -2924,7 +2915,7 @@ var DevServer = class {
|
|
|
2924
2915
|
return;
|
|
2925
2916
|
}
|
|
2926
2917
|
const externals = await resolveExternals(this.root);
|
|
2927
|
-
if (
|
|
2918
|
+
if (views.length > 0) {
|
|
2928
2919
|
const preloadTimer = startTimer();
|
|
2929
2920
|
try {
|
|
2930
2921
|
await this.buildPreload(externals);
|
|
@@ -2991,7 +2982,7 @@ var DevServer = class {
|
|
|
2991
2982
|
this.lastScanResult = scanResult;
|
|
2992
2983
|
const { files, envTypes } = generate({
|
|
2993
2984
|
scanResult,
|
|
2994
|
-
|
|
2985
|
+
views: this.config.views ?? [],
|
|
2995
2986
|
outputDir,
|
|
2996
2987
|
srcDir
|
|
2997
2988
|
});
|
|
@@ -3006,11 +2997,11 @@ var DevServer = class {
|
|
|
3006
2997
|
await writeFile(envTypesPath, envTypes.content);
|
|
3007
2998
|
}
|
|
3008
2999
|
async startRenderer() {
|
|
3009
|
-
const
|
|
3010
|
-
const userViteConfigs =
|
|
3000
|
+
const views = this.config.views ?? [];
|
|
3001
|
+
const userViteConfigs = views.filter((w) => w.vite).map((w) => w.vite);
|
|
3011
3002
|
this.rendererServer = await createServer(createRendererConfig({
|
|
3012
3003
|
root: this.root,
|
|
3013
|
-
|
|
3004
|
+
views,
|
|
3014
3005
|
userViteConfigs: userViteConfigs.length > 0 ? userViteConfigs : void 0,
|
|
3015
3006
|
logLevel: this.logLevel,
|
|
3016
3007
|
clearScreen: this.clearScreen
|
|
@@ -3021,10 +3012,10 @@ var DevServer = class {
|
|
|
3021
3012
|
this.rendererUrl = `http://localhost:${typeof addr === "object" && addr ? addr.port : 5173}`;
|
|
3022
3013
|
}
|
|
3023
3014
|
async buildPreload(externals) {
|
|
3024
|
-
const
|
|
3015
|
+
const views = this.config.views ?? [];
|
|
3025
3016
|
const preloadOutDir = resolve(this.outputDir, "preload");
|
|
3026
3017
|
const input = {};
|
|
3027
|
-
for (const
|
|
3018
|
+
for (const view of views) input[view.name] = resolve(this.outputDir, `generated/preload/${view.name}.gen.ts`);
|
|
3028
3019
|
const firstEntry = Object.values(input)[0];
|
|
3029
3020
|
const baseConfig = createNodeConfig({
|
|
3030
3021
|
scope: "preload",
|
|
@@ -3086,14 +3077,6 @@ var DevServer = class {
|
|
|
3086
3077
|
async buildMain(externals) {
|
|
3087
3078
|
const runtimeEntry = this.config.runtime.entry;
|
|
3088
3079
|
const entry = resolve(dirname(this.config.runtime.__source), runtimeEntry);
|
|
3089
|
-
const windowDefs = (this.config.windows ?? []).map((w) => ({
|
|
3090
|
-
name: w.name,
|
|
3091
|
-
type: w.type,
|
|
3092
|
-
lifecycle: w.lifecycle,
|
|
3093
|
-
autoShow: w.autoShow,
|
|
3094
|
-
behavior: w.behavior,
|
|
3095
|
-
window: w.window
|
|
3096
|
-
}));
|
|
3097
3080
|
const mainConfig = createNodeConfig({
|
|
3098
3081
|
scope: "main",
|
|
3099
3082
|
root: this.root,
|
|
@@ -3109,8 +3092,7 @@ var DevServer = class {
|
|
|
3109
3092
|
logLevel: this.logLevel,
|
|
3110
3093
|
clearScreen: this.clearScreen,
|
|
3111
3094
|
userViteConfig: this.config.runtime.vite,
|
|
3112
|
-
sourcemap: this.sourcemap
|
|
3113
|
-
define: { __ELECTRO_WINDOW_DEFINITIONS__: JSON.stringify(windowDefs) }
|
|
3095
|
+
sourcemap: this.sourcemap
|
|
3114
3096
|
});
|
|
3115
3097
|
const self = this;
|
|
3116
3098
|
let firstBuild = true;
|
|
@@ -3147,10 +3129,10 @@ var DevServer = class {
|
|
|
3147
3129
|
const addr = this.rendererServer.httpServer?.address();
|
|
3148
3130
|
const port = typeof addr === "object" && addr ? addr.port : 5173;
|
|
3149
3131
|
env.ELECTRO_RENDERER_BASE = `http://localhost:${port}`;
|
|
3150
|
-
for (const
|
|
3151
|
-
const entryPath = resolve(dirname(
|
|
3132
|
+
for (const view of this.config.views ?? []) {
|
|
3133
|
+
const entryPath = resolve(dirname(view.__source), view.entry);
|
|
3152
3134
|
const relPath = relative(this.root, entryPath);
|
|
3153
|
-
env[`ELECTRO_DEV_URL_${
|
|
3135
|
+
env[`ELECTRO_DEV_URL_${view.name}`] = `http://localhost:${port}/${relPath}`;
|
|
3154
3136
|
}
|
|
3155
3137
|
}
|
|
3156
3138
|
const proc = await launchElectron({
|
|
@@ -3287,15 +3269,15 @@ async function generate$1(options) {
|
|
|
3287
3269
|
console.error("Error: electro.config.ts must have a default export");
|
|
3288
3270
|
process.exit(1);
|
|
3289
3271
|
}
|
|
3290
|
-
const
|
|
3291
|
-
console.log(`Loaded config with ${
|
|
3272
|
+
const views = config.views ?? [];
|
|
3273
|
+
console.log(`Loaded config with ${views.length} view(s)`);
|
|
3292
3274
|
const srcDir = resolve(process.cwd(), "src");
|
|
3293
3275
|
console.log(`Scanning ${srcDir}...`);
|
|
3294
3276
|
const scanResult = await scan(srcDir);
|
|
3295
3277
|
console.log(`Found ${scanResult.features.length} feature(s)`);
|
|
3296
3278
|
const { files, envTypes } = generate({
|
|
3297
3279
|
scanResult,
|
|
3298
|
-
|
|
3280
|
+
views,
|
|
3299
3281
|
outputDir,
|
|
3300
3282
|
srcDir
|
|
3301
3283
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cordy/electro-cli",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "CLI for @cordy/electro — dev server, build, and code generation commands",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -47,15 +47,15 @@
|
|
|
47
47
|
"prepublishOnly": "bun run build"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@cordy/electro": "1.0
|
|
50
|
+
"@cordy/electro": "1.1.0",
|
|
51
51
|
"electron": ">=40.4.1",
|
|
52
52
|
"vite": ">=8.0.0"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@cordy/electro-generator": "1.0
|
|
55
|
+
"@cordy/electro-generator": "1.1.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@cordy/electro": "1.0
|
|
58
|
+
"@cordy/electro": "1.1.0",
|
|
59
59
|
"@types/node": "^25.2.3",
|
|
60
60
|
"cac": "^6.7.14",
|
|
61
61
|
"electron": "^40.4.1",
|