From 9c75cded6973cf93797f66137715010452e93654 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Mon, 12 Dec 2022 16:02:46 +0200 Subject: [PATCH] allow to customize both main & renderer Signed-off-by: Jari Kolehmainen --- build/generate-tray-icons.ts | 6 +- package.json | 21 +++- src/library.ts | 8 +- src/main/extension-api.ts | 26 ++++ src/main/index.ts | 19 +-- src/renderer/bootstrap.tsx | 42 +------ src/renderer/extension-api.ts | 33 ++++++ src/renderer/getDi.tsx | 23 +--- src/renderer/index.ts | 28 +++++ src/renderer/library.ts | 15 +++ src/renderer/register-injectables.ts | 30 +++++ webpack/library-bundle.ts | 64 ++++++++++ webpack/library.ts | 171 ++++++++++++--------------- webpack/renderer.ts | 5 +- webpack/vars.ts | 8 +- 15 files changed, 307 insertions(+), 192 deletions(-) create mode 100644 src/main/extension-api.ts create mode 100644 src/renderer/extension-api.ts create mode 100644 src/renderer/index.ts create mode 100644 src/renderer/library.ts create mode 100644 src/renderer/register-injectables.ts create mode 100644 webpack/library-bundle.ts diff --git a/build/generate-tray-icons.ts b/build/generate-tray-icons.ts index e0471a3153..3e363ad13d 100644 --- a/build/generate-tray-icons.ts +++ b/build/generate-tray-icons.ts @@ -10,9 +10,9 @@ import sharp from "sharp"; const size = Number(process.env.OUTPUT_SIZE || "16"); const outputFolder = process.env.OUTPUT_DIR || "./static/build/tray"; -const inputFile = process.env.INPUT_SVG_PATH || "./src/renderer/components/icon/logo-lens.svg"; -const noticeFile = process.env.NOTICE_SVG_PATH || "./src/renderer/components/icon/notice.svg"; -const spinnerFile = process.env.SPINNER_SVG_PATH || "./src/renderer/components/icon/arrow-spinner.svg"; +const inputFile = process.env.INPUT_SVG_PATH || path.resolve(__dirname, "../src/renderer/components/icon/logo-lens.svg"); +const noticeFile = process.env.NOTICE_SVG_PATH || path.resolve(__dirname, "../src/renderer/components/icon/notice.svg"); +const spinnerFile = process.env.SPINNER_SVG_PATH || path.resolve(__dirname, "../src/renderer/components/icon/arrow-spinner.svg"); async function ensureOutputFoler() { await ensureDir(outputFolder); diff --git a/package.json b/package.json index 205650a37b..4e6f5955f2 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,26 @@ "version": "6.3.0-alpha.0", "main": "static/build/main.js", "exports": { - ".": "./static/build/library/library.js" + "./main": "./static/build/library/main.js", + "./renderer": "./static/build/library/renderer.js", + "./styles": "./static/build/library/renderer.css" + }, + "typesVersions": { + "*": { + "main": [ + "./src/library.ts" + ], + "renderer": [ + "./src/renderer/library.ts" + ] + } }, "files": [ - "static/**/*", - "!static/build/main.*", "build/**/*", - "templates/**/*" + "static/build/library/**/*", + "src/**/*", + "webpack/*", + "types/*" ], "copyright": "© 2022 OpenLens Authors", "license": "MIT", diff --git a/src/library.ts b/src/library.ts index dbc9398cee..78c6137dc9 100644 --- a/src/library.ts +++ b/src/library.ts @@ -4,23 +4,20 @@ */ import type { DiContainer } from "@ogre-tools/injectable"; -import staticFilesDirectoryInjectable from "./common/vars/static-files-directory.injectable"; import { registerInjectables } from "./main/register-injectables"; import { afterApplicationIsLoadedInjectionToken } from "./main/start-main-application/runnable-tokens/after-application-is-loaded-injection-token"; import { beforeApplicationIsLoadingInjectionToken } from "./main/start-main-application/runnable-tokens/before-application-is-loading-injection-token"; import { beforeElectronIsReadyInjectionToken } from "./main/start-main-application/runnable-tokens/before-electron-is-ready-injection-token"; import { onLoadOfApplicationInjectionToken } from "./main/start-main-application/runnable-tokens/on-load-of-application-injection-token"; import startMainApplicationInjectable from "./main/start-main-application/start-main-application.injectable"; +import * as extensionApi from "./main/extension-api"; interface AppConfig { di: DiContainer; - staticPath: string; } function startApp(conf: AppConfig) { - const { di, staticPath } = conf; - - di.override(staticFilesDirectoryInjectable, () => staticPath); + const { di } = conf; return di.inject(startMainApplicationInjectable); } @@ -28,6 +25,7 @@ function startApp(conf: AppConfig) { export { registerInjectables, startApp, + extensionApi, afterApplicationIsLoadedInjectionToken, beforeApplicationIsLoadingInjectionToken, beforeElectronIsReadyInjectionToken, diff --git a/src/main/extension-api.ts b/src/main/extension-api.ts new file mode 100644 index 0000000000..2fd6bfb5f1 --- /dev/null +++ b/src/main/extension-api.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import * as Mobx from "mobx"; +import { spawn } from "node-pty"; +import * as LensExtensionsCommonApi from "../extensions/common-api"; +import * as LensExtensionsMainApi from "../extensions/main-api"; + + +/** + * Exports for virtual package "@k8slens/extensions" for main-process. + * All exporting names available in global runtime scope: + * e.g. global.Mobx, global.LensExtensions + */ +const LensExtensions = { + Common: LensExtensionsCommonApi, + Main: LensExtensionsMainApi, +}; + +const Pty = { + spawn, +}; + +export { Mobx, LensExtensions, Pty }; diff --git a/src/main/index.ts b/src/main/index.ts index b44341324f..e4f96684fc 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -5,29 +5,12 @@ // Main process -import * as Mobx from "mobx"; -import { spawn } from "node-pty"; -import * as LensExtensionsCommonApi from "../extensions/common-api"; -import * as LensExtensionsMainApi from "../extensions/main-api"; import { getDi } from "./getDi"; import startMainApplicationInjectable from "./start-main-application/start-main-application.injectable"; +import { Mobx, LensExtensions, Pty } from "./extension-api"; const di = getDi(); void di.inject(startMainApplicationInjectable); -/** - * Exports for virtual package "@k8slens/extensions" for main-process. - * All exporting names available in global runtime scope: - * e.g. global.Mobx, global.LensExtensions - */ -const LensExtensions = { - Common: LensExtensionsCommonApi, - Main: LensExtensionsMainApi, -}; - -const Pty = { - spawn, -}; - export { Mobx, LensExtensions, Pty }; diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index ea3899b566..0e3f9b3607 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -3,16 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import "./components/app.scss"; - import React from "react"; -import ReactDOM, { render, unmountComponentAtNode } from "react-dom"; -import * as Mobx from "mobx"; -import * as MobxReact from "mobx-react"; -import * as ReactRouter from "react-router"; -import * as ReactRouterDom from "react-router-dom"; -import * as LensExtensionsCommonApi from "../extensions/common-api"; -import * as LensExtensionsRendererApi from "../extensions/renderer-api"; +import { render, unmountComponentAtNode } from "react-dom"; import { delay } from "../common/utils"; import { isMac, isDevelopment } from "../common/vars"; import { DefaultProps } from "./mui-base-theme"; @@ -21,7 +13,6 @@ import * as initializers from "./initializers"; import logger from "../common/logger"; import { WeblinkStore } from "../common/weblink-store"; import { registerCustomThemes } from "./components/monaco-editor"; -import { getDi } from "./getDi"; import { DiContextProvider } from "@ogre-tools/injectable-react"; import type { DiContainer } from "@ogre-tools/injectable"; import extensionLoaderInjectable from "../extensions/extension-loader/extension-loader.injectable"; @@ -46,9 +37,6 @@ import assert from "assert"; import startFrameInjectable from "./start-frame/start-frame.injectable"; import initializeSentryReportingWithInjectable from "../common/error-reporting/initialize-sentry-reporting.injectable"; -configurePackages(); // global packages -registerCustomThemes(); // monaco editor themes - /** * If this is a development build, wait a second to attach * Chrome Debugger to renderer process @@ -61,6 +49,9 @@ async function attachChromeDebugger() { } export async function bootstrap(di: DiContainer) { + configurePackages(); // global packages + registerCustomThemes(); // monaco editor themes + const initializeSentryReportingWith = di.inject(initializeSentryReportingWithInjectable); if (process.isMainFrame) { @@ -171,28 +162,3 @@ export async function bootstrap(di: DiContainer) { rootElem, ); } - -const di = getDi(); - -// run -bootstrap(di); - -/** - * Exports for virtual package "@k8slens/extensions" for renderer-process. - * All exporting names available in global runtime scope: - * e.g. Devtools -> Console -> window.LensExtensions (renderer) - */ -const LensExtensions = { - Common: LensExtensionsCommonApi, - Renderer: LensExtensionsRendererApi, -}; - -export { - React, - ReactDOM, - ReactRouter, - ReactRouterDom, - Mobx, - MobxReact, - LensExtensions, -}; diff --git a/src/renderer/extension-api.ts b/src/renderer/extension-api.ts new file mode 100644 index 0000000000..12cdcef5f9 --- /dev/null +++ b/src/renderer/extension-api.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import React from "react"; +import ReactDOM from "react-dom"; +import * as Mobx from "mobx"; +import * as MobxReact from "mobx-react"; +import * as ReactRouter from "react-router"; +import * as ReactRouterDom from "react-router-dom"; +import * as LensExtensionsCommonApi from "../extensions/common-api"; +import * as LensExtensionsRendererApi from "../extensions/renderer-api"; + +/** + * Exports for virtual package "@k8slens/extensions" for renderer-process. + * All exporting names available in global runtime scope: + * e.g. Devtools -> Console -> window.LensExtensions (renderer) + */ +const LensExtensions = { + Common: LensExtensionsCommonApi, + Renderer: LensExtensionsRendererApi, +}; + +export { + React, + ReactDOM, + ReactRouter, + ReactRouterDom, + Mobx, + MobxReact, + LensExtensions, +}; diff --git a/src/renderer/getDi.tsx b/src/renderer/getDi.tsx index 28e111bc97..aafa33bbe0 100644 --- a/src/renderer/getDi.tsx +++ b/src/renderer/getDi.tsx @@ -4,29 +4,10 @@ */ import { createContainer } from "@ogre-tools/injectable"; -import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; -import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; -import { runInAction } from "mobx"; -import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; +import { registerInjectables } from "./register-injectables"; export const getDi = () => { const di = createContainer("renderer"); - setLegacyGlobalDiForExtensionApi(di, Environments.renderer); - - runInAction(() => { - registerMobX(di); - - autoRegister({ - di, - requireContexts: [ - require.context("./", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - require.context("../common", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - require.context("../extensions", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - require.context("../features", true, CONTEXT_MATCHER_FOR_FEATURES), - ], - }); - }); - - return di; + return registerInjectables(di); }; diff --git a/src/renderer/index.ts b/src/renderer/index.ts new file mode 100644 index 0000000000..8f91e6fc3d --- /dev/null +++ b/src/renderer/index.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import "./components/app.scss"; + +import { getDi } from "./getDi"; +import { bootstrap } from "./bootstrap"; +import { + React, ReactDOM, ReactRouter, + ReactRouterDom, Mobx, MobxReact, LensExtensions, +} from "./extension-api"; + +const di = getDi(); + +// run +bootstrap(di); + +export { + React, + ReactDOM, + ReactRouter, + ReactRouterDom, + Mobx, + MobxReact, + LensExtensions, +}; diff --git a/src/renderer/library.ts b/src/renderer/library.ts new file mode 100644 index 0000000000..c461054912 --- /dev/null +++ b/src/renderer/library.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import "./components/app.scss"; + +import { bootstrap } from "./bootstrap"; +import * as extensionApi from "./extension-api"; +import { registerInjectables } from "./register-injectables"; + +export { + bootstrap, + extensionApi, + registerInjectables, +}; diff --git a/src/renderer/register-injectables.ts b/src/renderer/register-injectables.ts new file mode 100644 index 0000000000..d801e04625 --- /dev/null +++ b/src/renderer/register-injectables.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { DiContainer } from "@ogre-tools/injectable"; +import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; +import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; +import { runInAction } from "mobx"; +import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; + +export function registerInjectables(di: DiContainer) { + setLegacyGlobalDiForExtensionApi(di, Environments.renderer); + + runInAction(() => { + registerMobX(di); + + autoRegister({ + di, + requireContexts: [ + require.context("./", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + require.context("../common", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + require.context("../extensions", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + require.context("../features", true, CONTEXT_MATCHER_FOR_FEATURES), + ], + }); + }); + + return di; +} diff --git a/webpack/library-bundle.ts b/webpack/library-bundle.ts new file mode 100644 index 0000000000..e4a55da115 --- /dev/null +++ b/webpack/library-bundle.ts @@ -0,0 +1,64 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import MiniCssExtractPlugin from "mini-css-extract-plugin"; +import nodeExternals from "webpack-node-externals"; +import { platform } from "os"; +import path from "path"; +import { DefinePlugin, optimize } from "webpack"; +import { main, renderer } from "./library"; +import { buildDir } from "./vars"; + +const config = [ + { + ...main, + entry: { + main: path.resolve(__dirname, "..", "src", "library.ts"), + }, + output: { + libraryTarget: "commonjs", + path: path.resolve(buildDir, "library"), + }, + optimization: { + minimize: false, + }, + plugins: [ + new DefinePlugin({ + CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable(\\.${platform})?\\.tsx?$/`, + CONTEXT_MATCHER_FOR_FEATURES: `/\\/(main|common)\\/.+\\.injectable(\\.${platform})?\\.tsx?$/`, + }), + ], + }, + { + ...renderer, + entry: { + renderer: path.resolve(__dirname, "..", "src", "renderer", "library.ts"), + }, + output: { + libraryTarget: "commonjs", + path: path.resolve(buildDir, "library"), + }, + optimization: { + minimize: false, + }, + externals: [ + nodeExternals(), + ], + plugins: [ + new DefinePlugin({ + CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable(\\.${platform})?\\.tsx?$/`, + CONTEXT_MATCHER_FOR_FEATURES: `/\\/(renderer|common)\\/.+\\.injectable(\\.${platform})?\\.tsx?$/`, + }), + new MiniCssExtractPlugin({ + filename: "[name].css", + runtime: false, + }), + new optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + ], + }, +]; + +export default config; diff --git a/webpack/library.ts b/webpack/library.ts index 4d53020826..b55d5d0922 100644 --- a/webpack/library.ts +++ b/webpack/library.ts @@ -5,112 +5,89 @@ import path from "path"; import type webpack from "webpack"; +import type { WebpackPluginInstance } from "webpack"; import { DefinePlugin } from "webpack"; import nodeExternals from "webpack-node-externals"; +import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin"; +import CircularDependencyPlugin from "circular-dependency-plugin"; +import MonacoWebpackPlugin from "monaco-editor-webpack-plugin"; import getTypeScriptLoader from "./get-typescript-loader"; import rendererConfig, { iconsAndImagesWebpackRules } from "./renderer"; -import { buildDir, isDevelopment, mainDir } from "./vars"; +import { appName, assetsFolderName, buildDir, htmlTemplate, isDevelopment, mainDir, publicPath } from "./vars"; import { platform } from "process"; +import HtmlWebpackPlugin from "html-webpack-plugin"; +import MiniCssExtractPlugin from "mini-css-extract-plugin"; -const configs: { (): webpack.Configuration }[] = [ - rendererConfig, -]; - -configs.push((): webpack.Configuration => { - console.info("WEBPACK:library", { - isDevelopment, - buildDir, - }); - - return { - name: "lens-app-library", - context: __dirname, - target: "electron-main", - mode: isDevelopment ? "development" : "production", - devtool: isDevelopment ? "cheap-module-source-map" : "source-map", - cache: isDevelopment ? { type: "filesystem" } : false, - entry: { - library: path.resolve(mainDir, "..", "library.ts"), - }, - output: { - path: path.join(buildDir, "library"), - library: { - type: "commonjs", +const renderer: webpack.Configuration = ({ + ...rendererConfig({ showVars: false }), + plugins: [ + // see also: https://github.com/Microsoft/monaco-editor-webpack-plugin#options + new MonacoWebpackPlugin({ + // publicPath: "/", + // filename: "[name].worker.js", + languages: ["json", "yaml"], + globalAPI: isDevelopment, + }), + new HtmlWebpackPlugin({ + filename: `${appName}.html`, + template: htmlTemplate, + inject: true, + hash: true, + templateParameters: { + assetPath: `${publicPath}${assetsFolderName}`, }, - }, - resolve: { - extensions: [".json", ".js", ".ts"], - }, - externals: [ - nodeExternals(), - ], - module: { - rules: [ - { - test: /\.node$/, - use: "node-loader", - }, - { - test: /\.tsx?$/, - loader: "ts-loader", - options: { - compilerOptions: { - declaration: true, // output .d.ts - sourceMap: false, // to override sourceMap: true in tsconfig.json - outDir: path.join(buildDir, "library"), - }, - }, - }, - ...iconsAndImagesWebpackRules(), - ], - }, - plugins: [ - new DefinePlugin({ - CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable(\\.${platform})?\\.tsx?$/`, - CONTEXT_MATCHER_FOR_FEATURES: `/\\/(main|common)\\/.+\\.injectable(\\.${platform})?\\.tsx?$/`, - }), - ], - }; + }), + new MiniCssExtractPlugin({ + filename: "[name].css", + }), + ], }); -configs.push((): webpack.Configuration => { - console.info("WEBPACK:library:download-binaries", { - isDevelopment, - buildDir, - }); - - return { - name: "lens-app-library-download-binaries", - context: __dirname, - target: "electron-main", - mode: isDevelopment ? "development" : "production", - devtool: false, - cache: isDevelopment ? { type: "filesystem" } : false, - entry: { - download_binaries: path.resolve(process.cwd(), "build", "download_binaries.ts"), - }, - output: { - path: path.join(buildDir, "library"), - }, - resolve: { - extensions: [".json", ".js", ".ts"], - }, - externals: [ - nodeExternals(), +const main: webpack.Configuration = ({ + name: "lens-app-main", + context: __dirname, + target: "electron-main", + mode: isDevelopment ? "development" : "production", + devtool: isDevelopment ? "cheap-module-source-map" : "source-map", + cache: isDevelopment ? { type: "filesystem" } : false, + entry: { + main: path.resolve(mainDir, "index.ts"), + }, + output: { + libraryTarget: "global", + path: buildDir, + }, + resolve: { + extensions: [".json", ".js", ".ts"], + }, + externals: [ + nodeExternals(), + ], + module: { + rules: [ + { + test: /\.node$/, + use: "node-loader", + }, + getTypeScriptLoader({}, /\.ts$/), + ...iconsAndImagesWebpackRules(), ], - module: { - rules: [ - { - test: /\.node$/, - use: "node-loader", - }, - getTypeScriptLoader({}, /\.ts$/), - ...iconsAndImagesWebpackRules(), - ], - }, - plugins: [ - ], - }; + }, + plugins: [ + new DefinePlugin({ + CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable(\\.${platform})?\\.tsx?$/`, + CONTEXT_MATCHER_FOR_FEATURES: `/\\/(main|common)\\/.+\\.injectable(\\.${platform})?\\.tsx?$/`, + }), + new ForkTsCheckerPlugin(), + new CircularDependencyPlugin({ + cwd: __dirname, + exclude: /node_modules/, + failOnError: true, + }) as unknown as WebpackPluginInstance, + ], }); -export default configs; +export { + main, + renderer, +}; diff --git a/webpack/renderer.ts b/webpack/renderer.ts index 6bad203ca7..bf721893ae 100755 --- a/webpack/renderer.ts +++ b/webpack/renderer.ts @@ -38,7 +38,7 @@ export function webpackLensRenderer({ showVars = true } = {}): webpack.Configura devtool: isDevelopment ? "cheap-module-source-map" : "source-map", cache: isDevelopment ? { type: "filesystem" } : false, entry: { - [appName]: path.resolve(rendererDir, "bootstrap.tsx"), + [appName]: path.resolve(rendererDir, "index.ts"), }, output: { libraryTarget: "global", @@ -65,6 +65,7 @@ export function webpackLensRenderer({ showVars = true } = {}): webpack.Configura }, externals: { "node-fetch": "commonjs node-fetch", + "npm": "commonjs npm", }, optimization: { minimize: false, @@ -192,7 +193,7 @@ export function cssModulesWebpackRule({ styleLoader }: CssModulesWebpackRuleOpti sourceMap: isDevelopment, postcssOptions: { plugins: [ - "tailwindcss", + ["tailwindcss", { config: path.resolve(__dirname, "..", "tailwind.config.js") }], ], }, }, diff --git a/webpack/vars.ts b/webpack/vars.ts index fd0b4bcee9..ae67302d2b 100644 --- a/webpack/vars.ts +++ b/webpack/vars.ts @@ -10,16 +10,16 @@ import packageInfo from "../package.json"; export const isDevelopment = process.env.NODE_ENV !== "production"; export const mainDir = path.join(process.cwd(), "src", "main"); export const buildDir = path.join(process.cwd(), "static", "build"); -export const extensionEntry = path.join(process.cwd(), "src", "extensions", "extension-api.ts"); -export const extensionOutDir = path.join(process.cwd(), "src", "extensions", "npm", "extensions", "dist"); +export const extensionEntry = path.join(__dirname, "..", "src", "extensions", "extension-api.ts"); +export const extensionOutDir = path.join(__dirname, "..", "src", "extensions", "npm", "extensions", "dist"); export const assetsFolderName = "assets"; export const rendererDir = path.join(process.cwd(), "src", "renderer"); export const appName = isDevelopment ? `${packageInfo.productName}Dev` : packageInfo.productName; -export const htmlTemplate = path.resolve(rendererDir, "template.html"); +export const htmlTemplate = path.resolve(__dirname, "..", "src/renderer", "template.html"); export const publicPath = "/build/"; -export const sassCommonVars = path.resolve(rendererDir, "components/vars.scss"); +export const sassCommonVars = path.resolve(__dirname, "..", "src", "renderer", "components/vars.scss"); export const webpackDevServerPort = Number(process.env.WEBPACK_DEV_SERVER_PORT) || 9191; assert(Number.isInteger(webpackDevServerPort), "WEBPACK_DEV_SERVER_PORT environment variable must only be an integer");