@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.
Files changed (2) hide show
  1. package/dist/index.mjs +54 -71
  2. 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.8";
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 windows = config.windows ?? [];
717
+ const views = config.views ?? [];
718
718
  const names = /* @__PURE__ */ new Set();
719
- for (const win of windows) {
720
- if (names.has(win.name)) {
721
- error(`Duplicate window name "${win.name}". Window names must be unique.`);
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(win.name);
724
+ names.add(view.name);
725
725
  }
726
- for (const win of windows) {
727
- const winEntry = resolve(dirname(win.__source), win.entry);
728
- if (!existsSync(winEntry)) {
729
- error(`Window "${win.name}" entry not found: ${winEntry}`);
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 win of windows) if (win.features && win.features.length === 0) warn(`Window "${win.name}" has an empty features array — it won't have access to any services.`);
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 win of opts.windows) {
908
- const sourceDir = dirname(win.__source);
909
- input[win.name] = resolve(sourceDir, win.entry);
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 windows = config.windows ?? [];
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: windows.length > 0 ? resolve(codegenDir, "generated/preload") : null,
2644
- renderer: windows.length > 0 ? resolve(root, dirname(relative(root, windows[0].__source))) : null,
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: windows.map((w) => ({
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
- windows,
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 (windows.length > 0) try {
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 (windows.length > 0) try {
2707
+ if (views.length > 0) try {
2707
2708
  buildScope("renderer");
2708
- const userViteConfigs = windows.filter((w) => w.vite).map((w) => w.vite);
2709
+ const userViteConfigs = views.filter((w) => w.vite).map((w) => w.vite);
2709
2710
  await build(createRendererConfig({
2710
2711
  root,
2711
- windows,
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"), windows, root);
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 windows = args.config.windows ?? [];
2750
+ const views = args.config.views ?? [];
2759
2751
  const input = {};
2760
- for (const win of windows) input[win.name] = resolve(args.codegenDir, `generated/preload/${win.name}.gen.ts`);
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, windows, root) {
2803
+ async function flattenRendererOutput(rendererDir, views, root) {
2812
2804
  const dirsToClean = /* @__PURE__ */ new Set();
2813
- for (const win of windows) {
2814
- const relPath = relative(root, resolve(dirname(win.__source), win.entry));
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, win.name, "index.html");
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 !== win.name) dirsToClean.add(resolve(rendererDir, 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 win of this.config.windows ?? []) this.configPaths.add(win.__source);
2888
- const windows = this.config.windows ?? [];
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: windows.length > 0 ? resolve(this.outputDir, "generated/preload") : null,
2895
- renderer: windows.length > 0 ? resolve(this.root, dirname(relative(this.root, windows[0].__source))) : null,
2896
- windows: windows.map((w) => ({
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 (windows.length > 0) {
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 (windows.length > 0) {
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
- windows: this.config.windows ?? [],
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 windows = this.config.windows ?? [];
3009
- const userViteConfigs = windows.filter((w) => w.vite).map((w) => w.vite);
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
- windows,
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 windows = this.config.windows ?? [];
3015
+ const views = this.config.views ?? [];
3024
3016
  const preloadOutDir = resolve(this.outputDir, "preload");
3025
3017
  const input = {};
3026
- for (const win of windows) input[win.name] = resolve(this.outputDir, `generated/preload/${win.name}.gen.ts`);
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 win of this.config.windows ?? []) {
3150
- const entryPath = resolve(dirname(win.__source), win.entry);
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_${win.name}`] = `http://localhost:${port}/${relPath}`;
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 windows = config.windows ?? [];
3290
- console.log(`Loaded config with ${windows.length} window(s)`);
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
- windows,
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.8",
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.8",
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.8"
55
+ "@cordy/electro-generator": "1.1.0"
56
56
  },
57
57
  "devDependencies": {
58
- "@cordy/electro": "1.0.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",