| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  | const fs = require('fs'); | 
					
						
							|  |  |  | const path = require('path'); | 
					
						
							|  |  |  | const webpack = require('webpack'); | 
					
						
							| 
									
										
										
										
											2020-06-23 14:57:08 -07:00
										 |  |  | const TerserPlugin = require('terser-webpack-plugin'); | 
					
						
							| 
									
										
										
										
											2020-10-20 21:10:15 +02:00
										 |  |  | const WrapperPlugin = require('wrapper-webpack-plugin'); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  | const electronRoot = path.resolve(__dirname, '../..'); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class AccessDependenciesPlugin { | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  |   apply (compiler) { | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  |     compiler.hooks.compilation.tap('AccessDependenciesPlugin', compilation => { | 
					
						
							|  |  |  |       compilation.hooks.finishModules.tap('AccessDependenciesPlugin', modules => { | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  |         const filePaths = modules.map(m => m.resource).filter(p => p).map(p => path.relative(electronRoot, p)); | 
					
						
							|  |  |  |         console.info(JSON.stringify(filePaths)); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ({ | 
					
						
							|  |  |  |   alwaysHasNode, | 
					
						
							|  |  |  |   loadElectronFromAlternateTarget, | 
					
						
							|  |  |  |   targetDeletesNodeGlobals, | 
					
						
							| 
									
										
										
										
											2020-06-01 16:08:34 -07:00
										 |  |  |   target, | 
					
						
							| 
									
										
										
										
											2020-09-04 14:53:49 -07:00
										 |  |  |   wrapInitWithProfilingTimeout, | 
					
						
							|  |  |  |   wrapInitWithTryCatch | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  | }) => { | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  |   let entry = path.resolve(electronRoot, 'lib', target, 'init.ts'); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  |   if (!fs.existsSync(entry)) { | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  |     entry = path.resolve(electronRoot, 'lib', target, 'init.js'); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-13 09:58:49 -07:00
										 |  |  |   const electronAPIFile = path.resolve(electronRoot, 'lib', loadElectronFromAlternateTarget || target, 'api', 'exports', 'electron.ts'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 21:10:15 +02:00
										 |  |  |   return (env = {}, argv = {}) => { | 
					
						
							|  |  |  |     const onlyPrintingGraph = !!env.PRINT_WEBPACK_GRAPH; | 
					
						
							|  |  |  |     const outputFilename = argv['output-filename'] || `${target}.bundle.js`; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const defines = { | 
					
						
							|  |  |  |       BUILDFLAG: onlyPrintingGraph ? '(a => a)' : '' | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (env.buildflags) { | 
					
						
							|  |  |  |       const flagFile = fs.readFileSync(env.buildflags, 'utf8'); | 
					
						
							|  |  |  |       for (const line of flagFile.split(/(\r\n|\r|\n)/g)) { | 
					
						
							|  |  |  |         const flagMatch = line.match(/#define BUILDFLAG_INTERNAL_(.+?)\(\) \(([01])\)/); | 
					
						
							|  |  |  |         if (flagMatch) { | 
					
						
							|  |  |  |           const [, flagName, flagValue] = flagMatch; | 
					
						
							|  |  |  |           defines[flagName] = JSON.stringify(Boolean(parseInt(flagValue, 10))); | 
					
						
							| 
									
										
										
										
											2019-06-02 13:03:03 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-20 21:10:15 +02:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ignoredModules = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (defines.ENABLE_DESKTOP_CAPTURER === 'false') { | 
					
						
							|  |  |  |       ignoredModules.push( | 
					
						
							|  |  |  |         '@electron/internal/browser/desktop-capturer', | 
					
						
							|  |  |  |         '@electron/internal/browser/api/desktop-capturer', | 
					
						
							|  |  |  |         '@electron/internal/renderer/api/desktop-capturer' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (defines.ENABLE_VIEWS_API === 'false') { | 
					
						
							|  |  |  |       ignoredModules.push( | 
					
						
							|  |  |  |         '@electron/internal/browser/api/views/image-view.js' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const plugins = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (onlyPrintingGraph) { | 
					
						
							|  |  |  |       plugins.push(new AccessDependenciesPlugin()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (targetDeletesNodeGlobals) { | 
					
						
							|  |  |  |       plugins.push(new webpack.ProvidePlugin({ | 
					
						
							|  |  |  |         process: ['@electron/internal/common/webpack-provider', 'process'], | 
					
						
							|  |  |  |         global: ['@electron/internal/common/webpack-provider', '_global'], | 
					
						
							|  |  |  |         Buffer: ['@electron/internal/common/webpack-provider', 'Buffer'] | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     plugins.push(new webpack.ProvidePlugin({ | 
					
						
							|  |  |  |       Promise: ['@electron/internal/common/webpack-globals-provider', 'Promise'] | 
					
						
							|  |  |  |     })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     plugins.push(new webpack.DefinePlugin(defines)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (wrapInitWithProfilingTimeout) { | 
					
						
							|  |  |  |       plugins.push(new WrapperPlugin({ | 
					
						
							|  |  |  |         header: 'function ___electron_webpack_init__() {', | 
					
						
							|  |  |  |         footer: `
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | if ((globalThis.process || binding.process).argv.includes("--profile-electron-init")) { | 
					
						
							|  |  |  |   setTimeout(___electron_webpack_init__, 0); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  |   ___electron_webpack_init__(); | 
					
						
							|  |  |  | }`
 | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (wrapInitWithTryCatch) { | 
					
						
							|  |  |  |       plugins.push(new WrapperPlugin({ | 
					
						
							|  |  |  |         header: 'try {', | 
					
						
							|  |  |  |         footer: `
 | 
					
						
							|  |  |  | } catch (err) { | 
					
						
							|  |  |  |   console.error('Electron ${outputFilename} script failed to run'); | 
					
						
							|  |  |  |   console.error(err); | 
					
						
							|  |  |  | }`
 | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       mode: 'development', | 
					
						
							|  |  |  |       devtool: false, | 
					
						
							|  |  |  |       entry, | 
					
						
							|  |  |  |       target: alwaysHasNode ? 'node' : 'web', | 
					
						
							|  |  |  |       output: { | 
					
						
							|  |  |  |         filename: outputFilename | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       resolve: { | 
					
						
							|  |  |  |         alias: { | 
					
						
							|  |  |  |           '@electron/internal': path.resolve(electronRoot, 'lib'), | 
					
						
							|  |  |  |           electron$: electronAPIFile, | 
					
						
							|  |  |  |           'electron/main$': electronAPIFile, | 
					
						
							|  |  |  |           'electron/renderer$': electronAPIFile, | 
					
						
							|  |  |  |           'electron/common$': electronAPIFile, | 
					
						
							|  |  |  |           // Force timers to resolve to our dependency that doesn't use window.postMessage
 | 
					
						
							|  |  |  |           timers: path.resolve(electronRoot, 'node_modules', 'timers-browserify', 'main.js') | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         extensions: ['.ts', '.js'] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       module: { | 
					
						
							|  |  |  |         rules: [{ | 
					
						
							|  |  |  |           test: (moduleName) => !onlyPrintingGraph && ignoredModules.includes(moduleName), | 
					
						
							|  |  |  |           loader: 'null-loader' | 
					
						
							|  |  |  |         }, { | 
					
						
							|  |  |  |           test: /\.ts$/, | 
					
						
							|  |  |  |           loader: 'ts-loader', | 
					
						
							|  |  |  |           options: { | 
					
						
							|  |  |  |             configFile: path.resolve(electronRoot, 'tsconfig.electron.json'), | 
					
						
							|  |  |  |             transpileOnly: onlyPrintingGraph, | 
					
						
							|  |  |  |             ignoreDiagnostics: [ | 
					
						
							|  |  |  |               // File '{0}' is not under 'rootDir' '{1}'.
 | 
					
						
							|  |  |  |               6059 | 
					
						
							|  |  |  |             ] | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2020-10-20 21:10:15 +02:00
										 |  |  |         }] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       node: { | 
					
						
							|  |  |  |         __dirname: false, | 
					
						
							|  |  |  |         __filename: false, | 
					
						
							|  |  |  |         // We provide our own "timers" import above, any usage of setImmediate inside
 | 
					
						
							|  |  |  |         // one of our renderer bundles should import it from the 'timers' package
 | 
					
						
							|  |  |  |         setImmediate: false | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       optimization: { | 
					
						
							| 
									
										
										
										
											2021-04-08 15:56:59 -07:00
										 |  |  |         minimize: env.mode === 'production', | 
					
						
							| 
									
										
										
										
											2020-10-20 21:10:15 +02:00
										 |  |  |         minimizer: [ | 
					
						
							|  |  |  |           new TerserPlugin({ | 
					
						
							|  |  |  |             terserOptions: { | 
					
						
							|  |  |  |               keep_classnames: true, | 
					
						
							|  |  |  |               keep_fnames: true | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       plugins | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-07-10 14:48:50 -07:00
										 |  |  | }; |