@cordy/electro-cli 1.0.8 → 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 +54 -71
- 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) {
|
|
@@ -816,6 +816,7 @@ async function resolveExternals(root) {
|
|
|
816
816
|
...Object.keys(pkg.dependencies ?? {}),
|
|
817
817
|
...Object.keys(pkg.optionalDependencies ?? {})
|
|
818
818
|
]);
|
|
819
|
+
deps.delete("@cordy/electro");
|
|
819
820
|
const builtins = builtinModules.flatMap((m) => [m, `node:${m}`]);
|
|
820
821
|
const depsArray = [...deps];
|
|
821
822
|
const deepPattern = depsArray.length > 0 ? new RegExp(`^(${depsArray.map(escapeRegExp).join("|")})/.+`) : null;
|
|
@@ -875,7 +876,7 @@ function createNodeConfig(opts) {
|
|
|
875
876
|
},
|
|
876
877
|
ssr: {
|
|
877
878
|
target: "node",
|
|
878
|
-
noExternal: []
|
|
879
|
+
noExternal: ["@cordy/electro"]
|
|
879
880
|
},
|
|
880
881
|
resolve: { conditions: resolveConditions },
|
|
881
882
|
logLevel: opts.logLevel ?? "warn",
|
|
@@ -904,9 +905,9 @@ function resolveSourcemap(mode) {
|
|
|
904
905
|
}
|
|
905
906
|
function createRendererConfig(opts) {
|
|
906
907
|
const input = {};
|
|
907
|
-
for (const
|
|
908
|
-
const sourceDir = dirname(
|
|
909
|
-
input[
|
|
908
|
+
for (const view of opts.views) {
|
|
909
|
+
const sourceDir = dirname(view.__source);
|
|
910
|
+
input[view.name] = resolve(sourceDir, view.entry);
|
|
910
911
|
}
|
|
911
912
|
const isBuild = !!opts.outDir;
|
|
912
913
|
const config = {
|
|
@@ -2635,15 +2636,15 @@ async function build$1(options) {
|
|
|
2635
2636
|
const root = loaded.root;
|
|
2636
2637
|
const outDir = resolve(root, options.outDir);
|
|
2637
2638
|
const codegenDir = resolve(root, ".electro");
|
|
2638
|
-
const
|
|
2639
|
+
const views = config.views ?? [];
|
|
2639
2640
|
const srcDir = resolve(root, "src");
|
|
2640
2641
|
session({
|
|
2641
2642
|
root,
|
|
2642
2643
|
main: resolve(dirname(config.runtime.__source), config.runtime.entry),
|
|
2643
|
-
preload:
|
|
2644
|
-
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,
|
|
2645
2646
|
mode: "build",
|
|
2646
|
-
windows:
|
|
2647
|
+
windows: views.map((w) => ({
|
|
2647
2648
|
name: w.name,
|
|
2648
2649
|
entry: resolve(dirname(w.__source), w.entry)
|
|
2649
2650
|
}))
|
|
@@ -2652,7 +2653,7 @@ async function build$1(options) {
|
|
|
2652
2653
|
try {
|
|
2653
2654
|
const { files, envTypes } = generate({
|
|
2654
2655
|
scanResult: await scan(srcDir),
|
|
2655
|
-
|
|
2656
|
+
views,
|
|
2656
2657
|
outputDir: codegenDir,
|
|
2657
2658
|
srcDir
|
|
2658
2659
|
});
|
|
@@ -2687,7 +2688,7 @@ async function build$1(options) {
|
|
|
2687
2688
|
stepFail("main", err instanceof Error ? err.message : String(err));
|
|
2688
2689
|
process.exit(1);
|
|
2689
2690
|
}
|
|
2690
|
-
if (
|
|
2691
|
+
if (views.length > 0) try {
|
|
2691
2692
|
buildScope("preload");
|
|
2692
2693
|
await buildPreload({
|
|
2693
2694
|
config,
|
|
@@ -2703,12 +2704,12 @@ async function build$1(options) {
|
|
|
2703
2704
|
stepFail("preload", err instanceof Error ? err.message : String(err));
|
|
2704
2705
|
process.exit(1);
|
|
2705
2706
|
}
|
|
2706
|
-
if (
|
|
2707
|
+
if (views.length > 0) try {
|
|
2707
2708
|
buildScope("renderer");
|
|
2708
|
-
const userViteConfigs =
|
|
2709
|
+
const userViteConfigs = views.filter((w) => w.vite).map((w) => w.vite);
|
|
2709
2710
|
await build(createRendererConfig({
|
|
2710
2711
|
root,
|
|
2711
|
-
|
|
2712
|
+
views,
|
|
2712
2713
|
userViteConfigs: userViteConfigs.length > 0 ? userViteConfigs : void 0,
|
|
2713
2714
|
logLevel: "info",
|
|
2714
2715
|
customLogger: logger,
|
|
@@ -2716,7 +2717,7 @@ async function build$1(options) {
|
|
|
2716
2717
|
minify: options.minify,
|
|
2717
2718
|
sourcemap: options.sourcemap
|
|
2718
2719
|
}));
|
|
2719
|
-
await flattenRendererOutput(resolve(outDir, "renderer"),
|
|
2720
|
+
await flattenRendererOutput(resolve(outDir, "renderer"), views, root);
|
|
2720
2721
|
} catch (err) {
|
|
2721
2722
|
stepFail("renderer", err instanceof Error ? err.message : String(err));
|
|
2722
2723
|
process.exit(1);
|
|
@@ -2726,14 +2727,6 @@ async function build$1(options) {
|
|
|
2726
2727
|
async function buildMain(args) {
|
|
2727
2728
|
const runtimeEntry = args.config.runtime.entry;
|
|
2728
2729
|
const entry = resolve(dirname(args.config.runtime.__source), runtimeEntry);
|
|
2729
|
-
const windowDefs = (args.config.windows ?? []).map((w) => ({
|
|
2730
|
-
name: w.name,
|
|
2731
|
-
type: w.type,
|
|
2732
|
-
lifecycle: w.lifecycle,
|
|
2733
|
-
autoShow: w.autoShow,
|
|
2734
|
-
behavior: w.behavior,
|
|
2735
|
-
window: w.window
|
|
2736
|
-
}));
|
|
2737
2730
|
await build(createNodeConfig({
|
|
2738
2731
|
scope: "main",
|
|
2739
2732
|
root: args.root,
|
|
@@ -2750,14 +2743,13 @@ async function buildMain(args) {
|
|
|
2750
2743
|
userViteConfig: args.config.runtime.vite,
|
|
2751
2744
|
sourcemap: args.sourcemap,
|
|
2752
2745
|
customLogger: args.logger,
|
|
2753
|
-
logLevel: "info"
|
|
2754
|
-
define: { __ELECTRO_WINDOW_DEFINITIONS__: JSON.stringify(windowDefs) }
|
|
2746
|
+
logLevel: "info"
|
|
2755
2747
|
}));
|
|
2756
2748
|
}
|
|
2757
2749
|
async function buildPreload(args) {
|
|
2758
|
-
const
|
|
2750
|
+
const views = args.config.views ?? [];
|
|
2759
2751
|
const input = {};
|
|
2760
|
-
for (const
|
|
2752
|
+
for (const view of views) input[view.name] = resolve(args.codegenDir, `generated/preload/${view.name}.gen.ts`);
|
|
2761
2753
|
const firstEntry = Object.values(input)[0];
|
|
2762
2754
|
const preloadOutDir = resolve(args.outDir, "preload");
|
|
2763
2755
|
const preloadPlugins = [
|
|
@@ -2808,12 +2800,12 @@ async function buildPreload(args) {
|
|
|
2808
2800
|
* (e.g., `src/windows/main/index.html`) to `{name}/index.html`.
|
|
2809
2801
|
* Adjusts relative asset references to match the new depth.
|
|
2810
2802
|
*/
|
|
2811
|
-
async function flattenRendererOutput(rendererDir,
|
|
2803
|
+
async function flattenRendererOutput(rendererDir, views, root) {
|
|
2812
2804
|
const dirsToClean = /* @__PURE__ */ new Set();
|
|
2813
|
-
for (const
|
|
2814
|
-
const relPath = relative(root, resolve(dirname(
|
|
2805
|
+
for (const view of views) {
|
|
2806
|
+
const relPath = relative(root, resolve(dirname(view.__source), view.entry));
|
|
2815
2807
|
const oldHtmlPath = resolve(rendererDir, relPath);
|
|
2816
|
-
const newHtmlPath = resolve(rendererDir,
|
|
2808
|
+
const newHtmlPath = resolve(rendererDir, view.name, "index.html");
|
|
2817
2809
|
if (oldHtmlPath === newHtmlPath) continue;
|
|
2818
2810
|
let html = await readFile(oldHtmlPath, "utf-8");
|
|
2819
2811
|
const depthDiff = relPath.split("/").length - 1 - 1;
|
|
@@ -2826,7 +2818,7 @@ async function flattenRendererOutput(rendererDir, windows, root) {
|
|
|
2826
2818
|
await writeFile(newHtmlPath, html);
|
|
2827
2819
|
await unlink(oldHtmlPath);
|
|
2828
2820
|
const topDir = relPath.split("/")[0];
|
|
2829
|
-
if (topDir !==
|
|
2821
|
+
if (topDir !== view.name) dirsToClean.add(resolve(rendererDir, topDir));
|
|
2830
2822
|
}
|
|
2831
2823
|
for (const dir of dirsToClean) await rm(dir, {
|
|
2832
2824
|
recursive: true,
|
|
@@ -2884,16 +2876,16 @@ var DevServer = class {
|
|
|
2884
2876
|
this.root = loaded.root;
|
|
2885
2877
|
this.outputDir = this.outDirOverride ? resolve(this.root, this.outDirOverride) : resolve(this.root, ".electro");
|
|
2886
2878
|
this.configPaths.add(loaded.configPath);
|
|
2887
|
-
for (const
|
|
2888
|
-
const
|
|
2879
|
+
for (const view of this.config.views ?? []) this.configPaths.add(view.__source);
|
|
2880
|
+
const views = this.config.views ?? [];
|
|
2889
2881
|
const srcDir = resolve(this.root, "src");
|
|
2890
2882
|
const mainEntry = resolve(dirname(this.config.runtime.__source), this.config.runtime.entry);
|
|
2891
2883
|
session({
|
|
2892
2884
|
root: this.root,
|
|
2893
2885
|
main: mainEntry,
|
|
2894
|
-
preload:
|
|
2895
|
-
renderer:
|
|
2896
|
-
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) => ({
|
|
2897
2889
|
name: w.name,
|
|
2898
2890
|
entry: resolve(dirname(w.__source), w.entry)
|
|
2899
2891
|
}))
|
|
@@ -2906,7 +2898,7 @@ var DevServer = class {
|
|
|
2906
2898
|
stepFail("codegen", err instanceof Error ? err.message : String(err));
|
|
2907
2899
|
throw err;
|
|
2908
2900
|
}
|
|
2909
|
-
if (
|
|
2901
|
+
if (views.length > 0) {
|
|
2910
2902
|
const rendererTimer = startTimer();
|
|
2911
2903
|
try {
|
|
2912
2904
|
await this.startRenderer();
|
|
@@ -2923,7 +2915,7 @@ var DevServer = class {
|
|
|
2923
2915
|
return;
|
|
2924
2916
|
}
|
|
2925
2917
|
const externals = await resolveExternals(this.root);
|
|
2926
|
-
if (
|
|
2918
|
+
if (views.length > 0) {
|
|
2927
2919
|
const preloadTimer = startTimer();
|
|
2928
2920
|
try {
|
|
2929
2921
|
await this.buildPreload(externals);
|
|
@@ -2990,7 +2982,7 @@ var DevServer = class {
|
|
|
2990
2982
|
this.lastScanResult = scanResult;
|
|
2991
2983
|
const { files, envTypes } = generate({
|
|
2992
2984
|
scanResult,
|
|
2993
|
-
|
|
2985
|
+
views: this.config.views ?? [],
|
|
2994
2986
|
outputDir,
|
|
2995
2987
|
srcDir
|
|
2996
2988
|
});
|
|
@@ -3005,11 +2997,11 @@ var DevServer = class {
|
|
|
3005
2997
|
await writeFile(envTypesPath, envTypes.content);
|
|
3006
2998
|
}
|
|
3007
2999
|
async startRenderer() {
|
|
3008
|
-
const
|
|
3009
|
-
const userViteConfigs =
|
|
3000
|
+
const views = this.config.views ?? [];
|
|
3001
|
+
const userViteConfigs = views.filter((w) => w.vite).map((w) => w.vite);
|
|
3010
3002
|
this.rendererServer = await createServer(createRendererConfig({
|
|
3011
3003
|
root: this.root,
|
|
3012
|
-
|
|
3004
|
+
views,
|
|
3013
3005
|
userViteConfigs: userViteConfigs.length > 0 ? userViteConfigs : void 0,
|
|
3014
3006
|
logLevel: this.logLevel,
|
|
3015
3007
|
clearScreen: this.clearScreen
|
|
@@ -3020,10 +3012,10 @@ var DevServer = class {
|
|
|
3020
3012
|
this.rendererUrl = `http://localhost:${typeof addr === "object" && addr ? addr.port : 5173}`;
|
|
3021
3013
|
}
|
|
3022
3014
|
async buildPreload(externals) {
|
|
3023
|
-
const
|
|
3015
|
+
const views = this.config.views ?? [];
|
|
3024
3016
|
const preloadOutDir = resolve(this.outputDir, "preload");
|
|
3025
3017
|
const input = {};
|
|
3026
|
-
for (const
|
|
3018
|
+
for (const view of views) input[view.name] = resolve(this.outputDir, `generated/preload/${view.name}.gen.ts`);
|
|
3027
3019
|
const firstEntry = Object.values(input)[0];
|
|
3028
3020
|
const baseConfig = createNodeConfig({
|
|
3029
3021
|
scope: "preload",
|
|
@@ -3085,14 +3077,6 @@ var DevServer = class {
|
|
|
3085
3077
|
async buildMain(externals) {
|
|
3086
3078
|
const runtimeEntry = this.config.runtime.entry;
|
|
3087
3079
|
const entry = resolve(dirname(this.config.runtime.__source), runtimeEntry);
|
|
3088
|
-
const windowDefs = (this.config.windows ?? []).map((w) => ({
|
|
3089
|
-
name: w.name,
|
|
3090
|
-
type: w.type,
|
|
3091
|
-
lifecycle: w.lifecycle,
|
|
3092
|
-
autoShow: w.autoShow,
|
|
3093
|
-
behavior: w.behavior,
|
|
3094
|
-
window: w.window
|
|
3095
|
-
}));
|
|
3096
3080
|
const mainConfig = createNodeConfig({
|
|
3097
3081
|
scope: "main",
|
|
3098
3082
|
root: this.root,
|
|
@@ -3108,8 +3092,7 @@ var DevServer = class {
|
|
|
3108
3092
|
logLevel: this.logLevel,
|
|
3109
3093
|
clearScreen: this.clearScreen,
|
|
3110
3094
|
userViteConfig: this.config.runtime.vite,
|
|
3111
|
-
sourcemap: this.sourcemap
|
|
3112
|
-
define: { __ELECTRO_WINDOW_DEFINITIONS__: JSON.stringify(windowDefs) }
|
|
3095
|
+
sourcemap: this.sourcemap
|
|
3113
3096
|
});
|
|
3114
3097
|
const self = this;
|
|
3115
3098
|
let firstBuild = true;
|
|
@@ -3146,10 +3129,10 @@ var DevServer = class {
|
|
|
3146
3129
|
const addr = this.rendererServer.httpServer?.address();
|
|
3147
3130
|
const port = typeof addr === "object" && addr ? addr.port : 5173;
|
|
3148
3131
|
env.ELECTRO_RENDERER_BASE = `http://localhost:${port}`;
|
|
3149
|
-
for (const
|
|
3150
|
-
const entryPath = resolve(dirname(
|
|
3132
|
+
for (const view of this.config.views ?? []) {
|
|
3133
|
+
const entryPath = resolve(dirname(view.__source), view.entry);
|
|
3151
3134
|
const relPath = relative(this.root, entryPath);
|
|
3152
|
-
env[`ELECTRO_DEV_URL_${
|
|
3135
|
+
env[`ELECTRO_DEV_URL_${view.name}`] = `http://localhost:${port}/${relPath}`;
|
|
3153
3136
|
}
|
|
3154
3137
|
}
|
|
3155
3138
|
const proc = await launchElectron({
|
|
@@ -3286,15 +3269,15 @@ async function generate$1(options) {
|
|
|
3286
3269
|
console.error("Error: electro.config.ts must have a default export");
|
|
3287
3270
|
process.exit(1);
|
|
3288
3271
|
}
|
|
3289
|
-
const
|
|
3290
|
-
console.log(`Loaded config with ${
|
|
3272
|
+
const views = config.views ?? [];
|
|
3273
|
+
console.log(`Loaded config with ${views.length} view(s)`);
|
|
3291
3274
|
const srcDir = resolve(process.cwd(), "src");
|
|
3292
3275
|
console.log(`Scanning ${srcDir}...`);
|
|
3293
3276
|
const scanResult = await scan(srcDir);
|
|
3294
3277
|
console.log(`Found ${scanResult.features.length} feature(s)`);
|
|
3295
3278
|
const { files, envTypes } = generate({
|
|
3296
3279
|
scanResult,
|
|
3297
|
-
|
|
3280
|
+
views,
|
|
3298
3281
|
outputDir,
|
|
3299
3282
|
srcDir
|
|
3300
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.
|
|
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",
|