From 11b763e48faf7c5a700cc1605472836f9f0f2c6f Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Mon, 9 Jan 2023 16:42:04 +0200 Subject: [PATCH] move app build to a separate package Signed-off-by: Jari Kolehmainen --- package.json | 9 +- .eslintrc.js => packages/core/.eslintrc.js | 4 +- .swcrc => packages/core/.swcrc | 0 packages/core/.yarnrc | 3 + packages/core/__mocks__/assetMock.ts | 6 + packages/core/package.json | 129 +-------- .../vars/application-information-token.ts | 2 +- packages/open-lens/.gitignore | 2 + packages/open-lens/package.json | 233 ++++++++++++++++ .../application-information.injectable.ts | 17 ++ packages/open-lens/src/main/index.ts | 38 +++ packages/open-lens/src/renderer/index.ts | 43 +++ packages/open-lens/tsconfig.json | 31 +++ packages/open-lens/webpack/dev-server.ts | 45 +++ packages/open-lens/webpack/main.ts | 59 ++++ packages/open-lens/webpack/renderer.ts | 185 +++++++++++++ packages/open-lens/webpack/vars.ts | 19 ++ packages/open-lens/webpack/webpack.ts | 4 + yarn.lock | 259 ++++++++++++++++-- 19 files changed, 934 insertions(+), 154 deletions(-) rename .eslintrc.js => packages/core/.eslintrc.js (98%) rename .swcrc => packages/core/.swcrc (100%) create mode 100644 packages/core/.yarnrc create mode 100644 packages/core/__mocks__/assetMock.ts create mode 100644 packages/open-lens/.gitignore create mode 100644 packages/open-lens/package.json create mode 100644 packages/open-lens/src/common/application-information.injectable.ts create mode 100644 packages/open-lens/src/main/index.ts create mode 100644 packages/open-lens/src/renderer/index.ts create mode 100644 packages/open-lens/tsconfig.json create mode 100644 packages/open-lens/webpack/dev-server.ts create mode 100644 packages/open-lens/webpack/main.ts create mode 100644 packages/open-lens/webpack/renderer.ts create mode 100644 packages/open-lens/webpack/vars.ts create mode 100644 packages/open-lens/webpack/webpack.ts diff --git a/package.json b/package.json index bc626d749a..144dce8aea 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "packages/*" ], "nohoist": [ - "**" + "**/core", + "**/core/**" ] }, "scripts": { @@ -14,7 +15,11 @@ "adr:change-status": "echo \"Decision number?:\"; read decision; adr status $decision", "adr:update-readme": "adr update", "adr:list": "adr list", - "mkdocs-serve-local": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -it -p 8000:8000 -v ${PWD}:/docs mkdocs-serve-local:latest" + "build": "lerna run build", + "clean:node_modules": "lerna clean -y && rm -rf node_modules", + "mkdocs:serve-local": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -it -p 8000:8000 -v ${PWD}:/docs mkdocs-serve-local:latest", + "mkdocs:verify": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -v ${PWD}:/docs mkdocs-serve-local:latest build --strict", + "test": "lerna run test:unit" }, "devDependencies": { "adr": "^1.4.3", diff --git a/.eslintrc.js b/packages/core/.eslintrc.js similarity index 98% rename from .eslintrc.js rename to packages/core/.eslintrc.js index 09a06987c4..64deadefd9 100644 --- a/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -50,7 +50,7 @@ module.exports = { ], rules: { "no-constant-condition": ["error", { "checkLoops": false }], - "header/header": [2, "./license-header"], + "header/header": [2, "../../license-header"], "comma-dangle": ["error", "always-multiline"], "comma-spacing": "error", "indent": ["error", 2, { @@ -123,7 +123,7 @@ module.exports = { "no-constant-condition": ["error", { "checkLoops": false, }], - "header/header": [2, "./license-header"], + "header/header": [2, "../../license-header"], "react/prop-types": "off", "no-invalid-this": "off", "@typescript-eslint/no-invalid-this": ["error"], diff --git a/.swcrc b/packages/core/.swcrc similarity index 100% rename from .swcrc rename to packages/core/.swcrc diff --git a/packages/core/.yarnrc b/packages/core/.yarnrc new file mode 100644 index 0000000000..811b4fd7c3 --- /dev/null +++ b/packages/core/.yarnrc @@ -0,0 +1,3 @@ +disturl "https://electronjs.org/headers" +target "19.0.4" +runtime "electron" diff --git a/packages/core/__mocks__/assetMock.ts b/packages/core/__mocks__/assetMock.ts new file mode 100644 index 0000000000..5412bc08dc --- /dev/null +++ b/packages/core/__mocks__/assetMock.ts @@ -0,0 +1,6 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +export default ""; // mostly path to bundled file or data-url (webpack) diff --git a/packages/core/package.json b/packages/core/package.json index 93229bc5df..0df376124b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,6 @@ { "name": "@k8slens/open-lens", - "productName": "OpenLens", - "description": "OpenLens - Open Source IDE for Kubernetes", + "description": "Lens Desktop Core", "homepage": "https://github.com/lensapp/lens", "version": "6.4.0-alpha.0", "repository": { @@ -37,7 +36,6 @@ "build/*.plist", "build/installer.nsh", "build/notarize.js", - "src/**/*", "static/build/library/**/*", "templates/**/*", "types/*", @@ -47,37 +45,19 @@ "license": "MIT", "author": "OpenLens Authors ", "scripts": { - "build": "yarn run compile-library", - "dev": "concurrently -i -k \"yarn run dev-run -C\" yarn:dev:*", - "dev-build": "concurrently yarn:compile:*", - "debug-build": "concurrently yarn:compile:main yarn:compile:extension-types", - "dev-run": "nodemon --watch ./static/build/main.js --exec \"electron --remote-debugging-port=9223 --inspect .\"", - "dev:main": "yarn run compile:main --watch --progress", - "dev:renderer": "yarn run ts-node webpack/dev-server.ts", + "build": "yarn run compile:library", "clean": "rm -rf dist/ static/build binaries/", - "compile-library": "env NODE_ENV=production yarn run webpack --config webpack/library-bundle.ts", - "compile": "env NODE_ENV=production concurrently yarn:compile:*", - "compile:main": "yarn run webpack --config webpack/main.ts", - "compile:renderer": "yarn run webpack --config webpack/renderer.ts", - "compile:extension-types": "yarn run webpack --config webpack/extensions.ts", + "compile:library": "env NODE_ENV=production yarn run webpack --config webpack/library-bundle.ts", "compile:node-fetch": "yarn run webpack --config ./webpack/node-fetch.ts", "prepare": "yarn run compile:node-fetch", - "npm:fix-extensions-package-version": "yarn run ts-node build/set_extensions_npm_version.ts", - "build:linux": "yarn run compile && electron-builder --linux --dir", - "build:mac": "yarn run compile && electron-builder --mac --dir", - "build:win": "yarn run compile && electron-builder --win --dir", "integration": "jest --runInBand --detectOpenHandles --forceExit integration", "test:unit": "func() { jest ${1} --watch --testPathIgnorePatterns integration; }; func", "test:integration": "func() { jest ${1:-xyz} --watch --runInBand --detectOpenHandles --forceExit --modulePaths=[\"/integration/\"]; }; func", - "dist": "yarn run compile && electron-builder --publish onTag", - "dist:dir": "yarn run dist --dir -c.compression=store -c.mac.identity=null", "download:binaries": "yarn run ts-node build/download_binaries.ts", "build:tray-icons": "yarn run ts-node build/generate-tray-icons.ts", "build:theme-vars": "yarn run ts-node build/build_theme_vars.ts", "lint": "PROD=true yarn run eslint --ext js,ts,tsx --max-warnings=0 .", "lint:fix": "yarn run lint --fix", - "mkdocs-serve-local": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -it -p 8000:8000 -v ${PWD}:/docs mkdocs-serve-local:latest", - "verify-docs": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -v ${PWD}:/docs mkdocs-serve-local:latest build --strict", "version-checkout": "cat package.json | jq '.version' -r | xargs printf \"release/v%s\" | xargs git checkout -b", "version-commit": "cat package.json | jq '.version' -r | xargs printf \"release v%s\" | git commit --no-edit -s -F -", "version": "yarn run version-checkout && git add package.json && yarn run version-commit", @@ -124,105 +104,7 @@ ], "runtime": "@side/jest-runtime" }, - "build": { - "generateUpdatesFilesForAllChannels": true, - "files": [ - "static/**/*" - ], - "afterSign": "build/notarize.js", - "extraResources": [ - { - "from": "templates/", - "to": "./templates/", - "filter": "**/*.yaml" - }, - "LICENSE" - ], - "linux": { - "executableName": "open-lens", - "category": "Network", - "artifactName": "${productName}-${version}.${arch}.${ext}", - "target": [ - "deb", - "rpm", - "AppImage" - ], - "extraResources": [ - { - "from": "binaries/client/linux/${arch}/kubectl", - "to": "./${arch}/kubectl" - }, - { - "from": "binaries/client/linux/${arch}/lens-k8s-proxy", - "to": "./${arch}/lens-k8s-proxy" - }, - { - "from": "binaries/client/linux/${arch}/helm", - "to": "./${arch}/helm" - } - ] - }, - "rpm": { - "fpm": [ - "--rpm-rpmbuild-define=%define _build_id_links none" - ] - }, - "mac": { - "executableName": "OpenLens", - "hardenedRuntime": true, - "gatekeeperAssess": false, - "entitlements": "build/entitlements.mac.plist", - "entitlementsInherit": "build/entitlements.mac.plist", - "extraResources": [ - { - "from": "binaries/client/darwin/${arch}/kubectl", - "to": "./${arch}/kubectl" - }, - { - "from": "binaries/client/darwin/${arch}/lens-k8s-proxy", - "to": "./${arch}/lens-k8s-proxy" - }, - { - "from": "binaries/client/darwin/${arch}/helm", - "to": "./${arch}/helm" - } - ] - }, - "win": { - "executableName": "OpenLens.exe", - "target": [ - "nsis" - ], - "extraResources": [ - { - "from": "binaries/client/windows/${arch}/kubectl.exe", - "to": "./${arch}/kubectl.exe" - }, - { - "from": "binaries/client/windows/${arch}/lens-k8s-proxy.exe", - "to": "./${arch}/lens-k8s-proxy.exe" - }, - { - "from": "binaries/client/windows/${arch}/helm.exe", - "to": "./${arch}/helm.exe" - } - ] - }, - "nsis": { - "include": "build/installer.nsh", - "oneClick": false, - "allowElevation": true, - "createStartMenuShortcut": true, - "allowToChangeInstallationDirectory": true - }, - "protocols": { - "name": "Lens Protocol Handler", - "schemes": [ - "lens" - ], - "role": "Viewer" - } - }, + "build": {}, "resolutions": { "@astronautlabs/jsonpath/underscore": "^1.12.1" }, @@ -326,6 +208,7 @@ "@types/dompurify": "^2.4.0", "@types/electron-devtools-installer": "^2.2.1", "@types/fs-extra": "^9.0.13", + "@types/glob": "^8.0.0", "@types/glob-to-regexp": "^0.4.1", "@types/gunzip-maybe": "^1.4.0", "@types/hapi__call": "^9.0.0", @@ -382,8 +265,6 @@ "deepdash": "^5.3.9", "dompurify": "^2.4.1", "electron": "^19.1.9", - "electron-builder": "^23.6.0", - "electron-notarize": "^0.3.0", "esbuild": "^0.16.13", "esbuild-loader": "^2.20.0", "eslint": "^8.30.0", diff --git a/packages/core/src/common/vars/application-information-token.ts b/packages/core/src/common/vars/application-information-token.ts index dcd56a3146..7f8046533b 100644 --- a/packages/core/src/common/vars/application-information-token.ts +++ b/packages/core/src/common/vars/application-information-token.ts @@ -7,7 +7,7 @@ import { getInjectionToken } from "@ogre-tools/injectable"; import type packageJson from "../../../package.json"; export type ApplicationInformation = Pick & { - build: Partial & { publish?: unknown[] }; + build: { [key:string]: any } & { publish?: unknown[] }; }; const applicationInformationToken = getInjectionToken({ diff --git a/packages/open-lens/.gitignore b/packages/open-lens/.gitignore new file mode 100644 index 0000000000..dbc0d40908 --- /dev/null +++ b/packages/open-lens/.gitignore @@ -0,0 +1,2 @@ +static/build +binaries/ \ No newline at end of file diff --git a/packages/open-lens/package.json b/packages/open-lens/package.json new file mode 100644 index 0000000000..7a6d2f47dc --- /dev/null +++ b/packages/open-lens/package.json @@ -0,0 +1,233 @@ +{ + "name": "open-lens", + "private": true, + "productName": "OpenLens", + "description": "OpenLens - Open Source IDE for Kubernetes", + "homepage": "https://github.com/lensapp/lens", + "version": "6.4.0-alpha.0", + "repository": { + "type": "git", + "url": "git+https://github.com/lensapp/lens.git" + }, + "keywords": [], + "bugs": { + "url": "https://github.com/lensapp/lens/issues" + }, + "main": "static/build/main.js", + "copyright": "© 2023 OpenLens Authors", + "license": "MIT", + "author": "OpenLens Authors ", + "scripts": { + "build": "npm run compile && electron-builder", + "build:mac": "npm run compile && electron-builder --mac --dir", + "compile": "env NODE_ENV=production webpack --config webpack/webpack.ts --progress", + "postcompile": "npm run build:tray-icons && npm run download:binaries", + "predev": "rm -rf static/build/ && npm run build:tray-icons && npm run download:binaries", + "dev": "concurrently -i -k \"yarn run dev-run -C\" yarn:dev:*", + "dev-run": "nodemon --watch ./static/build/main.js --exec \"electron --remote-debugging-port=9223 --inspect .\"", + "dev:main": "env NODE_ENV=development webpack --config webpack/main.ts --progress --watch", + "dev:renderer": "env NODE_ENV=development ts-node ./webpack/dev-server.ts", + "build:tray-icons": "ts-node ../core/build/generate-tray-icons.ts", + "download:binaries": "ts-node ../core/build/download_binaries.ts" + }, + "config": { + "k8sProxyVersion": "0.3.0", + "bundledKubectlVersion": "1.23.3", + "bundledHelmVersion": "3.7.2", + "sentryDsn": "", + "contentSecurityPolicy": "script-src 'unsafe-eval' 'self'; frame-src https://*.lens.app:*/; img-src * data:", + "welcomeRoute": "/welcome" + }, + "engines": { + "node": ">=16 <17" + }, + "jest": { + "collectCoverage": false, + "verbose": true, + "transform": { + "^.+\\.(t|j)sx?$": [ + "@swc/jest" + ] + }, + "testEnvironment": "jsdom", + "resolver": "/src/jest-28-resolver.js", + "moduleNameMapper": { + "\\.(css|scss)$": "identity-obj-proxy", + "\\.(svg|png|jpg|eot|woff2?|ttf)$": "/__mocks__/assetMock.ts" + }, + "modulePathIgnorePatterns": [ + "/dist", + "/packages" + ], + "setupFiles": [ + "/src/jest.setup.ts", + "jest-canvas-mock" + ], + "globalSetup": "/src/jest.timezone.ts", + "setupFilesAfterEnv": [ + "/src/jest-after-env.setup.ts" + ], + "runtime": "@side/jest-runtime" + }, + "build": { + "generateUpdatesFilesForAllChannels": true, + "files": [ + "static/**/*" + ], + "afterSign": "../core/build/notarize.js", + "extraResources": [ + { + "from": "templates/", + "to": "./templates/", + "filter": "**/*.yaml" + }, + "LICENSE" + ], + "linux": { + "category": "Network", + "artifactName": "${productName}-${version}.${arch}.${ext}", + "target": [ + "deb", + "rpm", + "AppImage" + ], + "extraResources": [ + { + "from": "binaries/client/linux/${arch}/kubectl", + "to": "./${arch}/kubectl" + }, + { + "from": "binaries/client/linux/${arch}/lens-k8s-proxy", + "to": "./${arch}/lens-k8s-proxy" + }, + { + "from": "binaries/client/linux/${arch}/helm", + "to": "./${arch}/helm" + } + ] + }, + "rpm": { + "fpm": [ + "--rpm-rpmbuild-define=%define _build_id_links none" + ] + }, + "mac": { + "hardenedRuntime": true, + "gatekeeperAssess": false, + "entitlements": "../core/build/entitlements.mac.plist", + "entitlementsInherit": "../core/build/entitlements.mac.plist", + "extraResources": [ + { + "from": "binaries/client/darwin/${arch}/kubectl", + "to": "./${arch}/kubectl" + }, + { + "from": "binaries/client/darwin/${arch}/lens-k8s-proxy", + "to": "./${arch}/lens-k8s-proxy" + }, + { + "from": "binaries/client/darwin/${arch}/helm", + "to": "./${arch}/helm" + } + ] + }, + "win": { + "target": [ + "nsis" + ], + "extraResources": [ + { + "from": "binaries/client/windows/${arch}/kubectl.exe", + "to": "./${arch}/kubectl.exe" + }, + { + "from": "binaries/client/windows/${arch}/lens-k8s-proxy.exe", + "to": "./${arch}/lens-k8s-proxy.exe" + }, + { + "from": "binaries/client/windows/${arch}/helm.exe", + "to": "./${arch}/helm.exe" + } + ] + }, + "nsis": { + "include": "../core/build/installer.nsh", + "oneClick": false, + "allowElevation": true, + "createStartMenuShortcut": true, + "allowToChangeInstallationDirectory": true + }, + "protocols": { + "name": "Lens Protocol Handler", + "schemes": [ + "lens" + ], + "role": "Viewer" + } + }, + "dependencies": { + "@k8slens/open-lens": "^6.4.0-alpha.0", + "@ogre-tools/fp": "^12.0.1", + "@ogre-tools/injectable": "^12.0.1", + "@ogre-tools/injectable-extension-for-auto-registration": "^12.0.1", + "@ogre-tools/injectable-extension-for-mobx": "^12.0.1", + "@ogre-tools/injectable-react": "^12.0.1" + }, + "devDependencies": { + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", + "@types/node": "^16.18.6", + "@types/webpack": "^5.28.0", + "@types/webpack-dev-server": "^4.7.2", + "@types/webpack-env": "^1.18.0", + "@types/webpack-node-externals": "2.5.3", + "autoprefixer": "^10.4.13", + "circular-dependency-plugin": "^5.2.2", + "cli-progress": "^3.11.2", + "concurrently": "^7.6.0", + "css-loader": "^6.7.2", + "electron": "^19.1.9", + "electron-builder": "^23.6.0", + "electron-notarize": "^0.3.0", + "esbuild-loader": "^2.20.0", + "fork-ts-checker-webpack-plugin": "^7.2.14", + "gunzip-maybe": "^1.4.2", + "html-webpack-plugin": "^5.5.0", + "jsdom": "^20.0.3", + "jsonfile": "^6.1.0", + "mini-css-extract-plugin": "^2.7.1", + "monaco-editor-webpack-plugin": "^5.0.0", + "node-loader": "^2.0.0", + "nodemon": "^2.0.20", + "sharp": "^0.31.2", + "style-loader": "^3.3.1", + "tailwindcss": "^3.2.4", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", + "type-fest": "^2.14.0", + "typescript": "^4.9.4", + "typescript-plugin-css-modules": "^4.1.1", + "webpack": "^5.75.0", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.11.1", + "webpack-node-externals": "^3.0.0", + "@types/byline": "^4.2.33", + "@types/chart.js": "^2.9.36", + "@types/color": "^3.0.3", + "@types/crypto-js": "^3.1.47", + "@types/lodash": "^4.14.191", + "@types/proper-lockfile": "^4.1.2", + "@types/react-dom": "^17.0.16", + "@types/react-router-dom": "^5.3.3", + "@types/react-virtualized-auto-sizer": "^1.0.1", + "@types/react-window": "^1.8.5", + "@types/request-promise-native": "^1.0.18", + "@types/tar": "^6.1.3", + "@types/tcp-port-used": "^1.0.1", + "@types/url-parse": "^1.4.8", + "@types/uuid": "^8.3.4", + "monaco-editor": "^0.29.1", + "react-select": "^5.7.0", + "typed-emitter": "^1.4.0", + "xterm-addon-fit": "^0.5.0" + } +} diff --git a/packages/open-lens/src/common/application-information.injectable.ts b/packages/open-lens/src/common/application-information.injectable.ts new file mode 100644 index 0000000000..16f2321d47 --- /dev/null +++ b/packages/open-lens/src/common/application-information.injectable.ts @@ -0,0 +1,17 @@ + +import { getInjectable } from "@ogre-tools/injectable"; +import { applicationInformationToken, ApplicationInformation } from "@k8slens/open-lens/common"; +import packageJson from "../../package.json"; + +const applicationInformationInjectable = getInjectable({ + id: "application-information", + injectionToken: applicationInformationToken, + instantiate: () => { + const { version, config, productName, build, copyright, description, name } = packageJson; + + return { version, config, productName, build, copyright, description, name } as ApplicationInformation; + }, + causesSideEffects: true, +}); + +export default applicationInformationInjectable; diff --git a/packages/open-lens/src/main/index.ts b/packages/open-lens/src/main/index.ts new file mode 100644 index 0000000000..45e8d121ad --- /dev/null +++ b/packages/open-lens/src/main/index.ts @@ -0,0 +1,38 @@ +import { createContainer } from "@ogre-tools/injectable"; +import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; +import { runInAction } from "mobx"; +import { createApp, extensionApi } from "@k8slens/open-lens/main"; + +const di = createContainer("main"); +const app = createApp({ + di, + mode: process.env.NODE_ENV || "development" +}); + +runInAction(() => { + try { + autoRegister({ + di, + requireContexts: [ + require.context("./", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + require.context("../common", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + ], + }); + } catch (err) { + console.error(err); + process.exit(1); + } +}); + +app.start().catch((error) => { + console.error(error); + process.exit(1); +}) + +const { Mobx, LensExtensions, Pty } = extensionApi; + +export { + Mobx, + LensExtensions, + Pty +}; diff --git a/packages/open-lens/src/renderer/index.ts b/packages/open-lens/src/renderer/index.ts new file mode 100644 index 0000000000..a87fdbe897 --- /dev/null +++ b/packages/open-lens/src/renderer/index.ts @@ -0,0 +1,43 @@ +import "@k8slens/open-lens/styles"; +import { createContainer } from "@ogre-tools/injectable"; +import { runInAction } from "mobx"; +import { createApp, extensionApi } from "@k8slens/open-lens/renderer"; +import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; + +const di = createContainer("renderer"); +const app = createApp({ + di, + mode: process.env.NODE_ENV || "development" +}); + +runInAction(() => { + autoRegister({ + di, + requireContexts: [ + require.context("./", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + require.context("../common", true, CONTEXT_MATCHER_FOR_NON_FEATURES), + ], + }); +}); + +app.start(); + +const { + React, + ReactDOM, + ReactRouter, + ReactRouterDom, + Mobx, + MobxReact, + LensExtensions +} = extensionApi; + +export { + React, + ReactDOM, + ReactRouter, + ReactRouterDom, + Mobx, + MobxReact, + LensExtensions +}; diff --git a/packages/open-lens/tsconfig.json b/packages/open-lens/tsconfig.json new file mode 100644 index 0000000000..39baea1638 --- /dev/null +++ b/packages/open-lens/tsconfig.json @@ -0,0 +1,31 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "paths": { + "*": [ + "node_modules/*", + ] + }, + "plugins": [ + { + "name": "typescript-plugin-css-modules" + } + ] + }, + "include": [ + "src/**/*", + "../core/types/*.d.ts" + ], + "exclude": [ + "out", + "dist", + "coverage", + "binaries", + "static" + ], + "references": [ + { + "path": "../core" + } + ] +} diff --git a/packages/open-lens/webpack/dev-server.ts b/packages/open-lens/webpack/dev-server.ts new file mode 100644 index 0000000000..21f9af5ecd --- /dev/null +++ b/packages/open-lens/webpack/dev-server.ts @@ -0,0 +1,45 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import Webpack from "webpack"; +import WebpackDevServer from "webpack-dev-server"; +import renderer from "./renderer"; +import { buildDir, webpackDevServerPort } from "./vars"; + +/** + * API docs: + * @url https://webpack.js.org/configuration/dev-server/ + * @url https://github.com/chimurai/http-proxy-middleware + */ +const compiler = Webpack(renderer); + +const server = new WebpackDevServer({ + setupExitSignals: true, + headers: { + "Access-Control-Allow-Origin": "*", + }, + allowedHosts: "127.0.0.1", + host: "localhost", + port: webpackDevServerPort, + static: buildDir, // aka `devServer.contentBase` in webpack@4 + hot: "only", // use HMR only without errors + liveReload: false, + devMiddleware: { + writeToDisk: true, + index: "index.html", + publicPath: "/build", + }, + proxy: { + "^/$": "/build/", + }, + client: { + overlay: false, // don't show warnings and errors on top of rendered app view + logging: "error", + }, +}, compiler); + +console.info(`[WEBPACK-DEV-SERVER]: created with options`, server.options); + +server.start(); diff --git a/packages/open-lens/webpack/main.ts b/packages/open-lens/webpack/main.ts new file mode 100644 index 0000000000..a521fafccd --- /dev/null +++ b/packages/open-lens/webpack/main.ts @@ -0,0 +1,59 @@ +import path from "path"; +import type webpack from "webpack"; +import { DefinePlugin } from "webpack"; +import nodeExternals from "webpack-node-externals"; +import { iconsAndImagesWebpackRules } from "./renderer"; +import { buildDir, isDevelopment, mainDir } from "./vars"; +import { platform } from "process"; + +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, + }, + optimization: { + minimize: false, + }, + resolve: { + extensions: [".json", ".js", ".ts"], + }, + externals: [ + nodeExternals(), + ], + module: { + parser: { + javascript: { + commonjsMagicComments: true, + }, + }, + rules: [ + { + test: /\.node$/, + use: "node-loader", + }, + { + test: /\.ts$/, + loader: "ts-loader", + options: {}, + }, + ...iconsAndImagesWebpackRules(), + ], + }, + plugins: [ + new DefinePlugin({ + CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable(\\.${platform})?\\.tsx?$/`, + CONTEXT_MATCHER_FOR_FEATURES: `/\\/(renderer|common)\\/.+\\.injectable(\\.${platform})?\\.tsx?$/`, + }), + ], +}); + +export default main; diff --git a/packages/open-lens/webpack/renderer.ts b/packages/open-lens/webpack/renderer.ts new file mode 100644 index 0000000000..c51457902a --- /dev/null +++ b/packages/open-lens/webpack/renderer.ts @@ -0,0 +1,185 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + + import path from "path"; + import type webpack from "webpack"; + import HtmlWebpackPlugin from "html-webpack-plugin"; + import MiniCssExtractPlugin from "mini-css-extract-plugin"; + import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin"; + import MonacoWebpackPlugin from "monaco-editor-webpack-plugin"; + import CircularDependencyPlugin from "circular-dependency-plugin"; + import ReactRefreshWebpackPlugin from "@pmmmwh/react-refresh-webpack-plugin"; + import type { WebpackPluginInstance } from "webpack"; + import { DefinePlugin } from "webpack"; + import { assetsFolderName, isDevelopment, rendererDir, buildDir, htmlTemplate, publicPath, sassCommonVars } from "./vars"; + import { platform } from "process"; + + const renderer: webpack.Configuration = { + target: "electron-renderer", + name: "lens-app-renderer", + mode: isDevelopment ? "development" : "production", + // https://webpack.js.org/configuration/devtool/ (see description of each option) + devtool: isDevelopment ? "cheap-module-source-map" : "source-map", + cache: isDevelopment ? { type: "filesystem" } : false, + entry: { + lens: path.resolve(rendererDir, "index.ts"), + }, + output: { + libraryTarget: "global", + globalObject: "this", + publicPath, + path: buildDir, + filename: "[name].js", + chunkFilename: "chunks/[name].js", + assetModuleFilename: `${assetsFolderName}/[name][ext][query]`, + }, + watchOptions: { + ignored: /node_modules/, // https://webpack.js.org/configuration/watch/ + }, + ignoreWarnings: [ + /Critical dependency: the request of a dependency is an expression/, + /require.extensions is not supported by webpack./, // handlebars + /\[ReactRefreshPlugin] .*?HMR.*? is not enabled/, // enabled in webpack.dev-server + ], + resolve: { + extensions: [ + ".js", ".jsx", ".json", + ".ts", ".tsx", + ], + }, + externals: { + "node-fetch": "commonjs node-fetch", + "npm": "commonjs npm", + }, + optimization: { + minimize: false, + }, + module: { + parser: { + javascript: { + commonjsMagicComments: true, + }, + }, + rules: [ + { + test: /\.node$/, + use: "node-loader", + }, + { + test: /\.tsx?$/, + loader: "ts-loader", + options: {}, + }, + cssModulesWebpackRule(), + ...iconsAndImagesWebpackRules(), + ...fontsLoaderWebpackRules(), + ], + }, + + plugins: [ + new DefinePlugin({ + CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable(\\.${platform})?\\.tsx?$/`, + CONTEXT_MATCHER_FOR_FEATURES: `/\\/(renderer|common)\\/.+\\.injectable(\\.${platform})?\\.tsx?$/`, + }), + new ForkTsCheckerPlugin(), + + // 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: "index.html", + template: htmlTemplate, + inject: true, + hash: true, + templateParameters: { + assetPath: `${publicPath}${assetsFolderName}`, + }, + }), + + new CircularDependencyPlugin({ + cwd: __dirname, + exclude: /node_modules/, + failOnError: true, + }) as unknown as WebpackPluginInstance, + + new MiniCssExtractPlugin({ + filename: "[name].css", + }), + + ...( + isDevelopment + ? [new ReactRefreshWebpackPlugin()] + : [] + ), + ], +}; + + /** + * Import icons and image files. + * Read more about asset types: https://webpack.js.org/guides/asset-modules/ + */ + export function iconsAndImagesWebpackRules(): webpack.RuleSetRule[] { + return [ + { + test: /\.svg$/, + type: "asset/source", // exports the source code of the asset, so we get XML + }, + { + test: /\.(jpg|png|ico)$/, + type: "asset/resource", // path to file, e.g. "/static/build/assets/*" + }, + ]; + } + + /** + * Import custom fonts as URL. + */ + export function fontsLoaderWebpackRules(): webpack.RuleSetRule[] { + return [ + { + test: /\.(ttf|eot|woff2?)$/, + type: "asset/resource", + }, + ]; + } + + export interface CssModulesWebpackRuleOptions { + styleLoader?: string; + } + + /** + * Import CSS or SASS styles with modules support (*.module.scss) + */ + export function cssModulesWebpackRule({ styleLoader }: CssModulesWebpackRuleOptions = {}): webpack.RuleSetRule { + styleLoader ??= isDevelopment + ? "style-loader" + : MiniCssExtractPlugin.loader; + + return { + test: /\.s?css$/, + use: [ + styleLoader, + { + loader: "css-loader", + options: { + sourceMap: isDevelopment, + modules: { + auto: /\.module\./i, // https://github.com/webpack-contrib/css-loader#auto + mode: "local", // :local(.selector) by default + localIdentName: "[name]__[local]--[hash:base64:5]", + }, + }, + }, + ], + }; + } + + export default renderer; + \ No newline at end of file diff --git a/packages/open-lens/webpack/vars.ts b/packages/open-lens/webpack/vars.ts new file mode 100644 index 0000000000..08824009eb --- /dev/null +++ b/packages/open-lens/webpack/vars.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import assert from "assert"; +import path from "path"; + +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 assetsFolderName = "assets"; +export const rendererDir = path.join(process.cwd(), "src", "renderer"); +export const htmlTemplate = path.resolve(__dirname, "..", "node_modules", "@k8slens", "open-lens", "src/renderer", "template.html"); +export const publicPath = "/build/"; +export const sassCommonVars = path.resolve(__dirname, "..", "node_modules", "@k8slens", "open-lens", "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"); diff --git a/packages/open-lens/webpack/webpack.ts b/packages/open-lens/webpack/webpack.ts new file mode 100644 index 0000000000..fcc6e20eae --- /dev/null +++ b/packages/open-lens/webpack/webpack.ts @@ -0,0 +1,4 @@ +import main from "./main"; +import renderer from "./renderer"; + +export default [main, renderer]; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 21947171a2..b2c3ae7796 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,7 +36,7 @@ resolved "https://registry.npmjs.org/@async-fn/jest/-/jest-1.6.4.tgz" integrity sha512-m3T/m6a39f5dbqFj79BGCqudkm42McgMXD7M0ZorKeqqdAbNazay7t+VDOz5qqFHO12frFbbhAB5GnFPoGADPA== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": version "7.18.6" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -2935,6 +2935,14 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/glob@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.0.tgz#321607e9cbaec54f687a0792b2d1d370739455d2" + integrity sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" @@ -3137,7 +3145,7 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@^16.11.26", "@types/node@^16.18.11": +"@types/node@*", "@types/node@^16.11.26", "@types/node@^16.18.11", "@types/node@^16.18.6": version "16.18.11" resolved "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz" integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== @@ -3473,7 +3481,7 @@ resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz" integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== -"@types/webpack-node-externals@^2.5.3": +"@types/webpack-node-externals@2.5.3", "@types/webpack-node-externals@^2.5.3": version "2.5.3" resolved "https://registry.npmjs.org/@types/webpack-node-externals/-/webpack-node-externals-2.5.3.tgz" integrity sha512-A9JxaR8QXoYT95egET4AmCFuChyTlP8d18ZAnmSHuIMsFdS7QlCQQ8pmN/+FHgLIkm+ViE/VngltT5avLACY9A== @@ -3755,16 +3763,33 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + "@webpack-cli/configtest@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz" integrity sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A== +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + "@webpack-cli/info@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz" integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + "@webpack-cli/serve@^2.0.1": version "2.0.1" resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz" @@ -3841,6 +3866,14 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" @@ -3865,7 +3898,7 @@ acorn-walk@^7.0.0, acorn-walk@^7.1.1: resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.1.1: +acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -3875,7 +3908,7 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: version "8.8.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== @@ -4332,6 +4365,18 @@ autolinker@~0.28.0: dependencies: gulp-header "^1.7.1" +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -4622,7 +4667,7 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" -browserslist@^4.14.5, browserslist@^4.21.3: +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4: version "4.21.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -4888,7 +4933,7 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: version "1.0.30001442" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz" integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow== @@ -5306,7 +5351,7 @@ commander@^5.0.0, commander@^5.1.0: resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.1.0: +commander@^7.0.0, commander@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -5587,7 +5632,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^7.0.0: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== @@ -5656,7 +5701,7 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-loader@^6.7.3: +css-loader@^6.7.2, css-loader@^6.7.3: version "6.7.3" resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== @@ -5792,7 +5837,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -data-urls@^3.0.1: +data-urls@^3.0.1, data-urls@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== @@ -5871,7 +5916,7 @@ decamelize@^1.1.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1, decimal.js@^10.3.1: +decimal.js@^10.2.1, decimal.js@^10.3.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== @@ -6327,6 +6372,11 @@ dotenv@^10.0.0, dotenv@~10.0.0: resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + dotenv@^9.0.2: version "9.0.2" resolved "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz" @@ -6420,7 +6470,7 @@ electron-devtools-installer@^3.2.0: electron-notarize@^0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-0.3.0.tgz#b93c606306eac558b250c78ff95273ddb9fedf0a" integrity sha512-tuDw8H0gcDOalNLv6RM2CwGvUXU60MPGZRDEmd0ppX+yP5XqL8Ec2DuXyz9J7WQSA3aRCfzIgH8C5CAivDYWMw== dependencies: debug "^4.1.1" @@ -6561,6 +6611,11 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" @@ -7658,6 +7713,24 @@ fork-ts-checker-webpack-plugin@^6.5.2: semver "^7.3.2" tapable "^1.0.0" +fork-ts-checker-webpack-plugin@^7.2.14: + version "7.2.14" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.14.tgz#746eb15b4d643aafccd3c729995f9c9281eabd22" + integrity sha512-Tg2feh/n8k486KX0EbXVUfJj3j0xnnbKYTJw0fnIb2QdV0+lblOYZSal5ed9hARoWVwKeOC7sYE2EakSRLo5ZA== + dependencies: + "@babel/code-frame" "^7.16.7" + chalk "^4.1.2" + chokidar "^3.5.3" + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + fs-extra "^10.0.0" + memfs "^3.4.1" + minimatch "^3.0.4" + node-abort-controller "^3.0.1" + schema-utils "^3.1.1" + semver "^7.3.5" + tapable "^2.2.1" + form-data@^2.5.0: version "2.5.1" resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" @@ -7706,6 +7779,11 @@ forwarded@0.2.0: resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + fresh@0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" @@ -8535,7 +8613,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -8784,6 +8862,11 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + interpret@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" @@ -9832,6 +9915,38 @@ jsdom@^19.0.0: ws "^8.2.3" xml-name-validator "^4.0.0" +jsdom@^20.0.3: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -9921,7 +10036,7 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^6.0.1: +jsonfile@^6.0.1, jsonfile@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== @@ -10137,7 +10252,7 @@ lerna@^6.3.0: nx ">=14.8.6 < 16" typescript "^3 || ^4" -less@^4.1.1: +less@^4.1.1, less@^4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== @@ -10713,6 +10828,13 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.3" +memfs@^3.4.1: + version "3.4.13" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + "memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: version "5.2.1" resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" @@ -10825,7 +10947,7 @@ min-indent@^1.0.0: resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@*, mini-css-extract-plugin@^2.7.2: +mini-css-extract-plugin@*, mini-css-extract-plugin@^2.7.1, mini-css-extract-plugin@^2.7.2: version "2.7.2" resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz" integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== @@ -11175,6 +11297,11 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" +node-abort-controller@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e" + integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw== + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz" @@ -11356,6 +11483,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + normalize-url@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz" @@ -11596,7 +11728,7 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.0: +nwsapi@^2.2.0, nwsapi@^2.2.2: version "2.2.2" resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz" integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== @@ -12116,6 +12248,13 @@ parse5@6.0.1: resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" @@ -13048,6 +13187,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + rechoir@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" @@ -13230,7 +13376,7 @@ resolve.exports@^1.1.0: resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.9.0: version "1.22.1" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -13389,7 +13535,7 @@ sass-loader@^12.6.0: klona "^2.0.4" neo-async "^2.6.2" -sass@^1.32.13, sass@^1.57.1: +sass@^1.32.13, sass@^1.56.1, sass@^1.57.1: version "1.57.1" resolved "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz" integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== @@ -13410,6 +13556,13 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" @@ -13615,7 +13768,7 @@ sharp@^0.30.4: tar-fs "^2.1.1" tunnel-agent "^0.6.0" -sharp@^0.31.3: +sharp@^0.31.2, sharp@^0.31.3: version "0.31.3" resolved "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz" integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg== @@ -14234,6 +14387,17 @@ stylus@^0.54.8: semver "^6.3.0" source-map "^0.7.3" +stylus@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.59.0.tgz#a344d5932787142a141946536d6e24e6a6be7aa6" + integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg== + dependencies: + "@adobe/css-tools" "^4.0.1" + debug "^4.3.2" + glob "^7.1.6" + sax "~1.2.4" + source-map "^0.7.3" + sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz" @@ -14337,7 +14501,7 @@ tapable@^1.0.0: resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -14611,7 +14775,7 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^4.0.0: +tough-cookie@^4.0.0, tough-cookie@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz" integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== @@ -14723,7 +14887,7 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.2: +tsconfig-paths@^4.1.1, tsconfig-paths@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz" integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== @@ -14905,6 +15069,26 @@ typescript-plugin-css-modules@^3.4.0: stylus "^0.54.8" tsconfig-paths "^3.9.0" +typescript-plugin-css-modules@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/typescript-plugin-css-modules/-/typescript-plugin-css-modules-4.1.1.tgz#fc9c13f20f80c13a233beffd27697af353d96316" + integrity sha512-kpVxGkY/go9eV5TP1YUDJ6SqwBx2OIuVStMCxKyg9PhJVFXjLYR7AuItVLwoz0NCdiemH91WhtgAjb96jI34DA== + dependencies: + dotenv "^16.0.3" + icss-utils "^5.1.0" + less "^4.1.3" + lodash.camelcase "^4.3.0" + postcss "^8.4.19" + postcss-filter-plugins "^3.0.1" + postcss-icss-keyframes "^0.2.1" + postcss-icss-selectors "^2.0.3" + postcss-load-config "^3.1.4" + reserved-words "^0.1.2" + sass "^1.56.1" + source-map-js "^1.0.2" + stylus "^0.59.0" + tsconfig-paths "^4.1.1" + "typescript@^3 || ^4", typescript@^4.9.4: version "4.9.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" @@ -14950,7 +15134,7 @@ underscore@1.7.0: underscore@^1.13.6: version "1.13.6" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== unique-filename@^1.1.1: @@ -15214,6 +15398,13 @@ w3c-xmlserializer@^3.0.0: dependencies: xml-name-validator "^4.0.0" +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + walk-sync@^2.1.0: version "2.2.0" resolved "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz" @@ -15290,6 +15481,24 @@ webidl-conversions@^7.0.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +webpack-cli@^4.9.2: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + webpack-cli@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz"