refactor: unify module-list format and exports/electron (#19697)

This commit is contained in:
Milan Burda 2019-08-23 11:18:58 +02:00 committed by Alexey Kuzmin
parent c6a8b7f959
commit 7825d043f2
18 changed files with 108 additions and 162 deletions

View file

@ -42,7 +42,7 @@ module.exports = ({
resolve: { resolve: {
alias: { alias: {
'@electron/internal': path.resolve(electronRoot, 'lib'), '@electron/internal': path.resolve(electronRoot, 'lib'),
'electron': path.resolve(electronRoot, 'lib', loadElectronFromAlternateTarget || target, 'api', 'exports', 'electron.js'), 'electron': path.resolve(electronRoot, 'lib', loadElectronFromAlternateTarget || target, 'api', 'exports', 'electron.ts'),
// Force timers to resolve to our dependency that doens't use window.postMessage // Force timers to resolve to our dependency that doens't use window.postMessage
'timers': path.resolve(electronRoot, 'node_modules', 'timers-browserify', 'main.js') 'timers': path.resolve(electronRoot, 'node_modules', 'timers-browserify', 'main.js')
}, },

View file

@ -130,13 +130,14 @@ auto_filenames = {
"lib/browser/api/module-keys.js", "lib/browser/api/module-keys.js",
"lib/common/api/clipboard.js", "lib/common/api/clipboard.js",
"lib/common/api/deprecate.ts", "lib/common/api/deprecate.ts",
"lib/common/api/module-list.js", "lib/common/api/module-list.ts",
"lib/common/api/native-image.js", "lib/common/api/native-image.js",
"lib/common/api/native-theme.ts", "lib/common/api/native-theme.ts",
"lib/common/api/shell.js", "lib/common/api/shell.js",
"lib/common/buffer-utils.ts", "lib/common/buffer-utils.ts",
"lib/common/clipboard-utils.ts", "lib/common/clipboard-utils.ts",
"lib/common/crash-reporter.js", "lib/common/crash-reporter.js",
"lib/common/define-properties.ts",
"lib/common/electron-binding-setup.ts", "lib/common/electron-binding-setup.ts",
"lib/common/error-utils.ts", "lib/common/error-utils.ts",
"lib/common/is-promise.ts", "lib/common/is-promise.ts",
@ -164,8 +165,8 @@ auto_filenames = {
"lib/renderer/web-view/web-view-element.ts", "lib/renderer/web-view/web-view-element.ts",
"lib/renderer/web-view/web-view-impl.ts", "lib/renderer/web-view/web-view-impl.ts",
"lib/renderer/web-view/web-view-init.ts", "lib/renderer/web-view/web-view-init.ts",
"lib/sandboxed_renderer/api/exports/electron.js", "lib/sandboxed_renderer/api/exports/electron.ts",
"lib/sandboxed_renderer/api/module-list.js", "lib/sandboxed_renderer/api/module-list.ts",
"lib/sandboxed_renderer/init.js", "lib/sandboxed_renderer/init.js",
"package.json", "package.json",
"tsconfig.electron.json", "tsconfig.electron.json",
@ -214,7 +215,7 @@ auto_filenames = {
"lib/browser/api/content-tracing.js", "lib/browser/api/content-tracing.js",
"lib/browser/api/crash-reporter.js", "lib/browser/api/crash-reporter.js",
"lib/browser/api/dialog.js", "lib/browser/api/dialog.js",
"lib/browser/api/exports/electron.js", "lib/browser/api/exports/electron.ts",
"lib/browser/api/global-shortcut.js", "lib/browser/api/global-shortcut.js",
"lib/browser/api/in-app-purchase.js", "lib/browser/api/in-app-purchase.js",
"lib/browser/api/ipc-main.ts", "lib/browser/api/ipc-main.ts",
@ -222,7 +223,7 @@ auto_filenames = {
"lib/browser/api/menu-item.js", "lib/browser/api/menu-item.js",
"lib/browser/api/menu-utils.js", "lib/browser/api/menu-utils.js",
"lib/browser/api/menu.js", "lib/browser/api/menu.js",
"lib/browser/api/module-list.js", "lib/browser/api/module-list.ts",
"lib/browser/api/net-log.js", "lib/browser/api/net-log.js",
"lib/browser/api/net.js", "lib/browser/api/net.js",
"lib/browser/api/notification.js", "lib/browser/api/notification.js",
@ -261,14 +262,14 @@ auto_filenames = {
"lib/browser/utils.ts", "lib/browser/utils.ts",
"lib/common/api/clipboard.js", "lib/common/api/clipboard.js",
"lib/common/api/deprecate.ts", "lib/common/api/deprecate.ts",
"lib/common/api/exports/electron.js", "lib/common/api/module-list.ts",
"lib/common/api/module-list.js",
"lib/common/api/native-image.js", "lib/common/api/native-image.js",
"lib/common/api/native-theme.ts", "lib/common/api/native-theme.ts",
"lib/common/api/shell.js", "lib/common/api/shell.js",
"lib/common/buffer-utils.ts", "lib/common/buffer-utils.ts",
"lib/common/clipboard-utils.ts", "lib/common/clipboard-utils.ts",
"lib/common/crash-reporter.js", "lib/common/crash-reporter.js",
"lib/common/define-properties.ts",
"lib/common/electron-binding-setup.ts", "lib/common/electron-binding-setup.ts",
"lib/common/error-utils.ts", "lib/common/error-utils.ts",
"lib/common/init.ts", "lib/common/init.ts",
@ -287,14 +288,14 @@ auto_filenames = {
"lib/browser/api/module-keys.js", "lib/browser/api/module-keys.js",
"lib/common/api/clipboard.js", "lib/common/api/clipboard.js",
"lib/common/api/deprecate.ts", "lib/common/api/deprecate.ts",
"lib/common/api/exports/electron.js", "lib/common/api/module-list.ts",
"lib/common/api/module-list.js",
"lib/common/api/native-image.js", "lib/common/api/native-image.js",
"lib/common/api/native-theme.ts", "lib/common/api/native-theme.ts",
"lib/common/api/shell.js", "lib/common/api/shell.js",
"lib/common/buffer-utils.ts", "lib/common/buffer-utils.ts",
"lib/common/clipboard-utils.ts", "lib/common/clipboard-utils.ts",
"lib/common/crash-reporter.js", "lib/common/crash-reporter.js",
"lib/common/define-properties.ts",
"lib/common/electron-binding-setup.ts", "lib/common/electron-binding-setup.ts",
"lib/common/error-utils.ts", "lib/common/error-utils.ts",
"lib/common/init.ts", "lib/common/init.ts",
@ -303,9 +304,9 @@ auto_filenames = {
"lib/common/web-view-methods.ts", "lib/common/web-view-methods.ts",
"lib/renderer/api/crash-reporter.js", "lib/renderer/api/crash-reporter.js",
"lib/renderer/api/desktop-capturer.ts", "lib/renderer/api/desktop-capturer.ts",
"lib/renderer/api/exports/electron.js", "lib/renderer/api/exports/electron.ts",
"lib/renderer/api/ipc-renderer.ts", "lib/renderer/api/ipc-renderer.ts",
"lib/renderer/api/module-list.js", "lib/renderer/api/module-list.ts",
"lib/renderer/api/remote.js", "lib/renderer/api/remote.js",
"lib/renderer/api/web-frame.ts", "lib/renderer/api/web-frame.ts",
"lib/renderer/callbacks-registry.ts", "lib/renderer/callbacks-registry.ts",
@ -338,14 +339,14 @@ auto_filenames = {
"lib/browser/api/module-keys.js", "lib/browser/api/module-keys.js",
"lib/common/api/clipboard.js", "lib/common/api/clipboard.js",
"lib/common/api/deprecate.ts", "lib/common/api/deprecate.ts",
"lib/common/api/exports/electron.js", "lib/common/api/module-list.ts",
"lib/common/api/module-list.js",
"lib/common/api/native-image.js", "lib/common/api/native-image.js",
"lib/common/api/native-theme.ts", "lib/common/api/native-theme.ts",
"lib/common/api/shell.js", "lib/common/api/shell.js",
"lib/common/buffer-utils.ts", "lib/common/buffer-utils.ts",
"lib/common/clipboard-utils.ts", "lib/common/clipboard-utils.ts",
"lib/common/crash-reporter.js", "lib/common/crash-reporter.js",
"lib/common/define-properties.ts",
"lib/common/electron-binding-setup.ts", "lib/common/electron-binding-setup.ts",
"lib/common/error-utils.ts", "lib/common/error-utils.ts",
"lib/common/init.ts", "lib/common/init.ts",
@ -353,9 +354,9 @@ auto_filenames = {
"lib/common/reset-search-paths.ts", "lib/common/reset-search-paths.ts",
"lib/renderer/api/crash-reporter.js", "lib/renderer/api/crash-reporter.js",
"lib/renderer/api/desktop-capturer.ts", "lib/renderer/api/desktop-capturer.ts",
"lib/renderer/api/exports/electron.js", "lib/renderer/api/exports/electron.ts",
"lib/renderer/api/ipc-renderer.ts", "lib/renderer/api/ipc-renderer.ts",
"lib/renderer/api/module-list.js", "lib/renderer/api/module-list.ts",
"lib/renderer/api/remote.js", "lib/renderer/api/remote.js",
"lib/renderer/api/web-frame.ts", "lib/renderer/api/web-frame.ts",
"lib/renderer/callbacks-registry.ts", "lib/renderer/callbacks-registry.ts",

View file

@ -1,15 +0,0 @@
'use strict'
const common = require('@electron/internal/common/api/exports/electron')
// since browser module list is also used in renderer, keep it separate.
const moduleList = require('@electron/internal/browser/api/module-list')
// Import common modules.
common.defineProperties(exports)
for (const module of moduleList) {
Object.defineProperty(exports, module.name, {
enumerable: !module.private,
get: common.handleESModule(module.loader)
})
}

View file

@ -0,0 +1,6 @@
import { defineProperties } from '@electron/internal/common/define-properties'
import { commonModuleList } from '@electron/internal/common/api/module-list'
import { browserModuleList } from '@electron/internal/browser/api/module-list'
defineProperties(exports, commonModuleList)
defineProperties(exports, browserModuleList)

View file

@ -1,11 +1,9 @@
'use strict'
// TODO: Updating this file also required updating the module-keys file // TODO: Updating this file also required updating the module-keys file
const features = process.electronBinding('features') const features = process.electronBinding('features')
// Browser side modules, please sort alphabetically. // Browser side modules, please sort alphabetically.
module.exports = [ export const browserModuleList: ElectronInternal.ModuleEntry[] = [
{ name: 'app', loader: () => require('./app') }, { name: 'app', loader: () => require('./app') },
{ name: 'autoUpdater', loader: () => require('./auto-updater') }, { name: 'autoUpdater', loader: () => require('./auto-updater') },
{ name: 'BrowserView', loader: () => require('./browser-view') }, { name: 'BrowserView', loader: () => require('./browser-view') },
@ -36,7 +34,7 @@ module.exports = [
] ]
if (features.isViewApiEnabled()) { if (features.isViewApiEnabled()) {
module.exports.push( browserModuleList.push(
{ name: 'BoxLayout', loader: () => require('./views/box-layout') }, { name: 'BoxLayout', loader: () => require('./views/box-layout') },
{ name: 'Button', loader: () => require('./views/button') }, { name: 'Button', loader: () => require('./views/button') },
{ name: 'LabelButton', loader: () => require('./views/label-button') }, { name: 'LabelButton', loader: () => require('./views/label-button') },

View file

@ -1,37 +0,0 @@
'use strict'
const moduleList = require('@electron/internal/common/api/module-list')
exports.handleESModule = (loader) => () => {
const value = loader()
if (value.__esModule && value.default) return value.default
return value
}
exports.memoizedGetter = (getter) => {
/*
* It's ok to leak this value as it would be leaked by the global
* node module cache anyway at `Module._cache`. This memoization
* is dramatically faster than relying on nodes module cache however
*/
let memoizedValue = null
return () => {
if (memoizedValue === null) {
memoizedValue = getter()
}
return memoizedValue
}
}
// Attaches properties to |targetExports|.
exports.defineProperties = function (targetExports) {
const descriptors = {}
for (const module of moduleList) {
descriptors[module.name] = {
enumerable: !module.private,
get: exports.handleESModule(module.loader)
}
}
return Object.defineProperties(targetExports, descriptors)
}

View file

@ -1,7 +1,5 @@
'use strict'
// Common modules, please sort alphabetically // Common modules, please sort alphabetically
module.exports = [ export const commonModuleList: ElectronInternal.ModuleEntry[] = [
{ name: 'clipboard', loader: () => require('./clipboard') }, { name: 'clipboard', loader: () => require('./clipboard') },
{ name: 'nativeImage', loader: () => require('./native-image') }, { name: 'nativeImage', loader: () => require('./native-image') },
{ name: 'nativeTheme', loader: () => require('./native-theme') }, { name: 'nativeTheme', loader: () => require('./native-theme') },

View file

@ -0,0 +1,17 @@
const handleESModule = (loader: ElectronInternal.ModuleLoader) => () => {
const value = loader()
if (value.__esModule && value.default) return value.default
return value
}
// Attaches properties to |targetExports|.
export function defineProperties (targetExports: Object, moduleList: ElectronInternal.ModuleEntry[]) {
const descriptors: PropertyDescriptorMap = {}
for (const module of moduleList) {
descriptors[module.name] = {
enumerable: !module.private,
get: handleESModule(module.loader)
}
}
return Object.defineProperties(targetExports, descriptors)
}

View file

@ -1,14 +0,0 @@
'use strict'
const common = require('@electron/internal/common/api/exports/electron')
const moduleList = require('@electron/internal/renderer/api/module-list')
// Import common modules.
common.defineProperties(exports)
for (const module of moduleList) {
Object.defineProperty(exports, module.name, {
enumerable: !module.private,
get: common.handleESModule(module.loader)
})
}

View file

@ -0,0 +1,6 @@
import { defineProperties } from '@electron/internal/common/define-properties'
import { commonModuleList } from '@electron/internal/common/api/module-list'
import { rendererModuleList } from '@electron/internal/renderer/api/module-list'
defineProperties(exports, commonModuleList)
defineProperties(exports, rendererModuleList)

View file

@ -1,22 +1,19 @@
'use strict'
const features = process.electronBinding('features') const features = process.electronBinding('features')
const v8Util = process.electronBinding('v8_util') const v8Util = process.electronBinding('v8_util')
const enableRemoteModule = v8Util.getHiddenValue(global, 'enableRemoteModule') const enableRemoteModule = v8Util.getHiddenValue<boolean>(global, 'enableRemoteModule')
// Renderer side modules, please sort alphabetically. // Renderer side modules, please sort alphabetically.
// A module is `enabled` if there is no explicit condition defined. export const rendererModuleList: ElectronInternal.ModuleEntry[] = [
module.exports = [
{ name: 'crashReporter', loader: () => require('./crash-reporter') }, { name: 'crashReporter', loader: () => require('./crash-reporter') },
{ name: 'ipcRenderer', loader: () => require('./ipc-renderer') }, { name: 'ipcRenderer', loader: () => require('./ipc-renderer') },
{ name: 'webFrame', loader: () => require('./web-frame') } { name: 'webFrame', loader: () => require('./web-frame') }
] ]
if (features.isDesktopCapturerEnabled()) { if (features.isDesktopCapturerEnabled()) {
module.exports.push({ name: 'desktopCapturer', loader: () => require('./desktop-capturer') }) rendererModuleList.push({ name: 'desktopCapturer', loader: () => require('./desktop-capturer') })
} }
if (enableRemoteModule) { if (enableRemoteModule) {
module.exports.push({ name: 'remote', loader: () => require('./remote') }) rendererModuleList.push({ name: 'remote', loader: () => require('./remote') })
} }

View file

@ -349,9 +349,8 @@ const addBuiltinProperty = (name) => {
}) })
} }
const browserModules = const { commonModuleList } = require('@electron/internal/common/api/module-list')
require('@electron/internal/common/api/module-list').concat( const browserModules = commonModuleList.concat(require('@electron/internal/browser/api/module-keys'))
require('@electron/internal/browser/api/module-keys'))
// And add a helper receiver for each one. // And add a helper receiver for each one.
browserModules browserModules

View file

@ -1,25 +0,0 @@
'use strict'
const moduleList = require('@electron/internal/sandboxed_renderer/api/module-list')
const handleESModule = (m) => {
// Handle Typescript modules with an "export default X" statement
if (m.__esModule && m.default) return m.default
return m
}
for (const {
name,
load,
enabled = true,
private: isPrivate = false
} of moduleList) {
if (!enabled) {
continue
}
Object.defineProperty(exports, name, {
enumerable: !isPrivate,
get: () => handleESModule(load())
})
}

View file

@ -0,0 +1,4 @@
import { defineProperties } from '@electron/internal/common/define-properties'
import { moduleList } from '@electron/internal/sandboxed_renderer/api/module-list'
defineProperties(exports, moduleList)

View file

@ -1,38 +0,0 @@
'use strict'
const features = process.electronBinding('features')
module.exports = [
{
name: 'crashReporter',
load: () => require('@electron/internal/renderer/api/crash-reporter')
},
{
name: 'desktopCapturer',
load: () => require('@electron/internal/renderer/api/desktop-capturer'),
enabled: features.isDesktopCapturerEnabled()
},
{
name: 'ipcRenderer',
load: () => require('@electron/internal/renderer/api/ipc-renderer')
},
{
name: 'nativeImage',
load: () => require('@electron/internal/common/api/native-image')
},
{
name: 'remote',
load: () => require('@electron/internal/renderer/api/remote'),
enabled: process.isRemoteModuleEnabled
},
{
name: 'webFrame',
load: () => require('@electron/internal/renderer/api/web-frame')
},
// The internal modules, invisible unless you know their names.
{
name: 'deprecate',
load: () => require('@electron/internal/common/api/deprecate'),
private: true
}
]

View file

@ -0,0 +1,40 @@
const features = process.electronBinding('features')
export const moduleList: ElectronInternal.ModuleEntry[] = [
{
name: 'crashReporter',
loader: () => require('@electron/internal/renderer/api/crash-reporter')
},
{
name: 'ipcRenderer',
loader: () => require('@electron/internal/renderer/api/ipc-renderer')
},
{
name: 'nativeImage',
loader: () => require('@electron/internal/common/api/native-image')
},
{
name: 'webFrame',
loader: () => require('@electron/internal/renderer/api/web-frame')
},
// The internal modules, invisible unless you know their names.
{
name: 'deprecate',
loader: () => require('@electron/internal/common/api/deprecate'),
private: true
}
]
if (features.isDesktopCapturerEnabled()) {
moduleList.push({
name: 'desktopCapturer',
loader: () => require('@electron/internal/renderer/api/desktop-capturer')
})
}
if (process.isRemoteModuleEnabled) {
moduleList.push({
name: 'remote',
loader: () => require('@electron/internal/renderer/api/remote')
})
}

View file

@ -53,6 +53,7 @@ declare namespace NodeJS {
_firstFileName?: string; _firstFileName?: string;
helperExecPath: string; helperExecPath: string;
isRemoteModuleEnabled: boolean;
} }
} }

View file

@ -130,6 +130,14 @@ declare namespace ElectronInternal {
once(channel: string, listener: (event: IpcMainInternalEvent, ...args: any[]) => void): this; once(channel: string, listener: (event: IpcMainInternalEvent, ...args: any[]) => void): this;
} }
type ModuleLoader = () => any;
interface ModuleEntry {
name: string;
private?: boolean;
loader: ModuleLoader;
}
interface WebFrameInternal extends Electron.WebFrame { interface WebFrameInternal extends Electron.WebFrame {
getWebFrameId(window: Window): number; getWebFrameId(window: Window): number;
allowGuestViewElementDefinition(window: Window, context: any): void; allowGuestViewElementDefinition(window: Window, context: any): void;