Skip to content

Commit 94ff6c4

Browse files
committed
feat: add module exports for preload scripts
1 parent f6843e6 commit 94ff6c4

File tree

17 files changed

+174
-95
lines changed

17 files changed

+174
-95
lines changed

build/esbuild/esbuild.config.base.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function createConfig(opts = {}) {
55
return {
66
bundle: true,
77
platform: opts.platform || 'node',
8-
target: 'es2020',
8+
target: 'esnext',
99
sourcemap: !prod,
1010
minify: false,
1111
external: [],
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
dist
2-
*.map
2+
*.map
3+
*.preload.js

packages/electron-chrome-extensions/README.md

Lines changed: 70 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,18 @@ Simple browser using Electron's [default session](https://www.electronjs.org/doc
2626

2727
```js
2828
const { app, BrowserWindow } = require('electron')
29-
const { ElectronChromeExtensions } = require('electron-chrome-extensions')(
30-
(async function main() {
31-
await app.whenReady()
29+
const { ElectronChromeExtensions } = require('electron-chrome-extensions')
3230

33-
const extensions = new ElectronChromeExtensions()
34-
const browserWindow = new BrowserWindow()
31+
app.whenReady().then(() => {
32+
const extensions = new ElectronChromeExtensions()
33+
const browserWindow = new BrowserWindow()
3534

36-
// Adds the active tab of the browser
37-
extensions.addTab(browserWindow.webContents, browserWindow)
35+
// Adds the active tab of the browser
36+
extensions.addTab(browserWindow.webContents, browserWindow)
3837

39-
browserWindow.loadURL('https://samuelmaddock.com')
40-
browserWindow.show()
41-
})(),
42-
)
38+
browserWindow.loadURL('https://samuelmaddock.com')
39+
browserWindow.show()
40+
})
4341
```
4442

4543
### Advanced
@@ -50,45 +48,68 @@ Multi-tab browser with full support for Chrome extension APIs.
5048
5149
```js
5250
const { app, session, BrowserWindow } = require('electron')
53-
const { ElectronChromeExtensions } = require('electron-chrome-extensions')(
54-
(async function main() {
55-
await app.whenReady()
51+
const { ElectronChromeExtensions } = require('electron-chrome-extensions')
52+
53+
app.whenReady().then(() => {
54+
const browserSession = session.fromPartition('persist:custom')
55+
56+
const extensions = new ElectronChromeExtensions({
57+
session: browserSession,
58+
createTab(details) {
59+
// Optionally implemented for chrome.tabs.create support
60+
},
61+
selectTab(tab, browserWindow) {
62+
// Optionally implemented for chrome.tabs.update support
63+
},
64+
removeTab(tab, browserWindow) {
65+
// Optionally implemented for chrome.tabs.remove support
66+
},
67+
createWindow(details) {
68+
// Optionally implemented for chrome.windows.create support
69+
},
70+
})
71+
72+
const browserWindow = new BrowserWindow({
73+
webPreferences: {
74+
// Same session given to Extensions class
75+
session: browserSession,
76+
// Recommended options for loading remote content
77+
sandbox: true,
78+
contextIsolation: true,
79+
},
80+
})
5681

57-
const browserSession = session.fromPartition('persist:custom')
82+
// Adds the active tab of the browser
83+
extensions.addTab(browserWindow.webContents, browserWindow)
5884

59-
const extensions = new ElectronChromeExtensions({
60-
session: browserSession,
61-
createTab(details) {
62-
// Optionally implemented for chrome.tabs.create support
63-
},
64-
selectTab(tab, browserWindow) {
65-
// Optionally implemented for chrome.tabs.update support
66-
},
67-
removeTab(tab, browserWindow) {
68-
// Optionally implemented for chrome.tabs.remove support
69-
},
70-
createWindow(details) {
71-
// Optionally implemented for chrome.windows.create support
72-
},
73-
})
74-
75-
const browserWindow = new BrowserWindow({
76-
webPreferences: {
77-
// Same session given to Extensions class
78-
session: browserSession,
79-
// Recommended options for loading remote content
80-
sandbox: true,
81-
contextIsolation: true,
82-
},
83-
})
84-
85-
// Adds the active tab of the browser
86-
extensions.addTab(browserWindow.webContents, browserWindow)
87-
88-
browserWindow.loadURL('https://samuelmaddock.com')
89-
browserWindow.show()
90-
})(),
91-
)
85+
browserWindow.loadURL('https://samuelmaddock.com')
86+
browserWindow.show()
87+
})
88+
```
89+
90+
### Including the preload script
91+
92+
This module requires including its preload script. Be sure to copy it next to your app's entry
93+
point script so it works in your packaged app.
94+
95+
```js
96+
const fs = require('node:fs')
97+
const path = require('node:path')
98+
99+
const preloadPath = require.resolve('electron-chrome-extensions/preload')
100+
const buildPath = './path/to/entry/point'
101+
102+
fs.cp(preloadPath, path.join(buildPath, path.basename(preloadPath)))
103+
```
104+
105+
For bundlers, you can try using [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin), [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy), or [rollup-plugin-copy](https://github.com/vladshcherbin/rollup-plugin-copy).
106+
107+
The `modulePath` option can be used for loading the preload from elsewhere.
108+
109+
```js
110+
new ElectronChromeExtensions({
111+
modulePath: path.resolve('./out', 'node_modules', 'electron-chrome-extensions'),
112+
})
92113
```
93114

94115
## API
@@ -221,7 +242,7 @@ To enable the element on a webpage, you must define a preload script which injec
221242
Inject the browserAction API to make the `<browser-action-list>` element accessible in your application.
222243

223244
```js
224-
import { injectBrowserAction } from 'electron-chrome-extensions/dist/browser-action'
245+
import { injectBrowserAction } from 'electron-chrome-extensions/browser-action'
225246

226247
// Inject <browser-action-list> element into our page
227248
if (location.href === 'webui://browser-chrome.html') {

packages/electron-chrome-extensions/esbuild.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ build(browserESMConfig)
2525

2626
const preloadConfig = createConfig({
2727
entryPoints: ['src/preload.ts'],
28-
outfile: 'dist/preload.js',
28+
outfile: 'dist/chrome-extension-api.preload.js',
2929
platform: 'browser',
3030
external,
3131
sourcemap: false,

packages/electron-chrome-extensions/package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,17 @@
1111
"import": "./dist/esm/index.mjs",
1212
"require": "./dist/cjs/index.js"
1313
},
14+
"./browser-action": {
15+
"types": "./dist/types/browser-action.d.ts",
16+
"import": "./dist/esm/browser-action.mjs",
17+
"require": "./dist/cjs/browser-action.js"
18+
},
1419
"./dist/browser-action": {
1520
"types": "./dist/types/browser-action.d.ts",
1621
"import": "./dist/esm/browser-action.mjs",
1722
"require": "./dist/cjs/browser-action.js"
18-
}
23+
},
24+
"./preload": "./chrome-extension-api.preload.js"
1925
},
2026
"scripts": {
2127
"build": "yarn clean && tsc && node esbuild.config.js",

packages/electron-chrome-extensions/src/browser/index.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { session as electronSession } from 'electron'
22
import { EventEmitter } from 'node:events'
33
import path from 'node:path'
4-
import { promises as fs } from 'node:fs'
4+
import { existsSync } from 'node:fs'
55

66
import { BrowserActionAPI } from './api/browser-action'
77
import { TabsAPI } from './api/tabs'
@@ -85,7 +85,11 @@ export class ElectronChromeExtensions extends EventEmitter {
8585
store,
8686
}
8787

88-
this.modulePath = modulePath || path.join(__dirname, '../..')
88+
console.log('***load', {
89+
resolve: require.resolve('electron-chrome-extensions/preload'),
90+
require: require('electron-chrome-extensions')
91+
})
92+
this.modulePath = modulePath || __dirname
8993

9094
this.api = {
9195
browserAction: new BrowserActionAPI(this.ctx),
@@ -112,7 +116,7 @@ export class ElectronChromeExtensions extends EventEmitter {
112116
private async prependPreload() {
113117
const { session } = this.ctx
114118

115-
const preloadPath = path.join(this.modulePath, 'dist/preload.js')
119+
const preloadPath = path.join(this.modulePath, 'chrome-extension-api.preload.js')
116120

117121
if ('registerPreloadScript' in session) {
118122
session.registerPreloadScript({
@@ -130,16 +134,12 @@ export class ElectronChromeExtensions extends EventEmitter {
130134
session.setPreloads([...session.getPreloads(), preloadPath])
131135
}
132136

133-
let preloadExists = false
134-
try {
135-
const stat = await fs.stat(preloadPath)
136-
preloadExists = stat.isFile()
137-
} catch {}
138-
139-
if (!preloadExists) {
140-
console.error(
141-
`Unable to access electron-chrome-extensions preload file (${preloadPath}). Consider configuring the 'modulePath' constructor option.`,
137+
if (!existsSync(preloadPath)) {
138+
const preloadError = new Error(
139+
`electron-chrome-extensions: Preload file not found at "${preloadPath}". ` +
140+
'Copy "electron-chrome-extensions/preload" into your build files and/or configure the modulePath option.',
142141
)
142+
console.error(preloadError)
143143
}
144144
}
145145

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
dist
1+
dist
2+
*.preload.js

packages/electron-chrome-web-store/README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,31 @@ app.whenReady().then(async () => {
5757
})
5858
```
5959

60+
### Including the preload script
61+
62+
This module requires including its preload script. Be sure to copy it next to your app's entry
63+
point script so it works in your packaged app.
64+
65+
```js
66+
const fs = require('node:fs')
67+
const path = require('node:path')
68+
69+
const preloadPath = require.resolve('electron-chrome-web-store/preload')
70+
const buildPath = './path/to/entry/point'
71+
72+
fs.cp(preloadPath, path.join(buildPath, path.basename(preloadPath)))
73+
```
74+
75+
For bundlers, you can try using [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin), [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy), or [rollup-plugin-copy](https://github.com/vladshcherbin/rollup-plugin-copy).
76+
77+
The `modulePath` option can be used for loading the preload from elsewhere.
78+
79+
```js
80+
installChromeWebStore({
81+
modulePath: path.resolve('./out', 'node_modules', 'electron-chrome-web-store'),
82+
})
83+
```
84+
6085
## API
6186

6287
### `installChromeWebStore`

packages/electron-chrome-web-store/esbuild.config.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ const { createConfig, build, EXTERNAL_BASE } = require('../../build/esbuild/esbu
33

44
console.log(`building ${packageJson.name}`)
55

6-
const external = [...EXTERNAL_BASE, 'adm-zip', 'pbf']
6+
const external = [
7+
...EXTERNAL_BASE,
8+
'adm-zip',
9+
'pbf',
10+
'electron-chrome-web-store/preload'
11+
]
712

813
const esmOnlyModules = ['pbf']
914

@@ -26,8 +31,8 @@ build(browserConfig)
2631
build(browserESMConfig)
2732

2833
const preloadConfig = createConfig({
29-
entryPoints: ['src/renderer/web-store-preload.ts'],
30-
outfile: 'dist/renderer/web-store-preload.js',
34+
entryPoints: ['src/renderer/web-store.preload.ts'],
35+
outfile: 'web-store.preload.js',
3136
platform: 'browser',
3237
external,
3338
sourcemap: false,

packages/electron-chrome-web-store/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"types": "./dist/types/browser/index.d.ts",
1111
"import": "./dist/esm/browser/index.mjs",
1212
"require": "./dist/cjs/browser/index.js"
13-
}
13+
},
14+
"./preload": "./web-store.preload.js"
1415
},
1516
"scripts": {
1617
"build": "yarn clean && tsc && node esbuild.config.js",

0 commit comments

Comments
 (0)