@cordy/electro-generator 1.2.15 → 1.2.17

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 +23 -5
  2. package/package.json +3 -3
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { dirname, join, relative } from "node:path";
1
+ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
2
2
  import { PolicyEngine } from "@cordy/electro";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { Visitor, parseSync } from "oxc-parser";
@@ -28,7 +28,7 @@ function methodStub(featureId, serviceId, method) {
28
28
  * Structure: `window.electro.{featureId}.{serviceId}.{method}()`
29
29
  * Only EXPOSED scope services are included.
30
30
  */
31
- function generatePreload(viewName, features, policy, preloadExtension) {
31
+ function generatePreload(viewName, features, policy, preloadExtensions = []) {
32
32
  const allowedFeatures = features.filter((f) => policy.canAccess(viewName, f.id));
33
33
  const featureEntries = [];
34
34
  for (const feature of allowedFeatures) {
@@ -61,12 +61,25 @@ import { contextBridge, ipcRenderer } from "electron";
61
61
 
62
62
  contextBridge.exposeInMainWorld("electro", ${featureEntries.length > 0 ? `{\n${featureEntries.join("\n")}\n}` : "{}"});
63
63
  `;
64
- if (preloadExtension) content += `\n// User extension\nimport "${preloadExtension}";\n`;
64
+ if (preloadExtensions.length > 0) {
65
+ content += `\n// User extensions\n`;
66
+ for (const extension of preloadExtensions) content += `import "${extension}";\n`;
67
+ }
65
68
  return {
66
69
  path: `generated/preload/${viewName}.gen.ts`,
67
70
  content
68
71
  };
69
72
  }
73
+ function toRuntimeImportPathFrom(outputFilePath, sourceFilePath) {
74
+ const rel = relative(dirname(outputFilePath), sourceFilePath).replaceAll("\\", "/");
75
+ return rel.startsWith(".") ? rel : `./${rel}`;
76
+ }
77
+ function resolvePreloadExtensionImport(view, generatedPreloadPath, specifier) {
78
+ const trimmed = specifier.trim();
79
+ if (trimmed.length === 0) return trimmed;
80
+ if (!(trimmed.startsWith(".") || isAbsolute(trimmed))) return trimmed;
81
+ return toRuntimeImportPathFrom(generatedPreloadPath, isAbsolute(trimmed) ? trimmed : resolve(dirname(view.__source), trimmed));
82
+ }
70
83
  /**
71
84
  * Generate bridge type declarations for a specific view.
72
85
  * Makes `window.electro` type-safe in the renderer.
@@ -235,13 +248,18 @@ ${generateViewTypes(views)}${generateWindowApiTypes(windows, srcDir)}}
235
248
  * Generate all output files from scan results and view definitions.
236
249
  */
237
250
  function generate(input) {
238
- const { scanResult, views, srcDir } = input;
251
+ const { scanResult, views, srcDir, outputDir } = input;
239
252
  const policy = new PolicyEngine(views);
240
253
  const files = [];
241
254
  for (const view of views) {
242
255
  const knownIds = new Set(scanResult.features.map((f) => f.id));
243
256
  for (const fId of view.features ?? []) if (!knownIds.has(fId)) console.warn(`[generator] View "${view.name}" references unknown feature "${fId}"`);
244
- files.push(generatePreload(view.name, scanResult.features, policy, view.preload));
257
+ const generatedPreloadPath = join(outputDir, "generated", "preload", `${view.name}.gen.ts`);
258
+ const preloadExtensions = /* @__PURE__ */ new Set();
259
+ if (typeof view.preload === "string" && view.preload.length > 0) preloadExtensions.add(resolvePreloadExtensionImport(view, generatedPreloadPath, view.preload));
260
+ const webPreferencesPreload = view.webPreferences?.preload;
261
+ if (typeof webPreferencesPreload === "string" && webPreferencesPreload.length > 0) preloadExtensions.add(resolvePreloadExtensionImport(view, generatedPreloadPath, webPreferencesPreload));
262
+ files.push(generatePreload(view.name, scanResult.features, policy, [...preloadExtensions]));
245
263
  files.push(generateBridgeTypes(view, scanResult.features, policy));
246
264
  }
247
265
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cordy/electro-generator",
3
- "version": "1.2.15",
3
+ "version": "1.2.17",
4
4
  "description": "Code generator for @cordy/electro — scans features and emits preload scripts and bridge types",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -44,14 +44,14 @@
44
44
  "prepublishOnly": "bun run build"
45
45
  },
46
46
  "peerDependencies": {
47
- "@cordy/electro": "1.2.15"
47
+ "@cordy/electro": "1.2.17"
48
48
  },
49
49
  "dependencies": {
50
50
  "oxc-parser": "^0.114.0",
51
51
  "tinyglobby": "^0.2.15"
52
52
  },
53
53
  "devDependencies": {
54
- "@cordy/electro": "1.2.15",
54
+ "@cordy/electro": "1.2.17",
55
55
  "tsdown": "^0.20.3",
56
56
  "vitest": "v4.1.0-beta.3"
57
57
  }