diff --git a/.gitignore b/.gitignore index 4380cce54..1b6b1acfc 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ scripts/themes/tokens .env # content trace files for electron electron-app/traces +# The IDE2 preload file is generated on the fly +electron-app/resources/preload.html diff --git a/.vscode/launch.json b/.vscode/launch.json index 802b130d6..820ba07b8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -20,7 +20,6 @@ "--no-app-auto-install", "--plugins=local-dir:../plugins", "--hosted-plugin-inspect=9339", - "--nosplash", "--content-trace", "--open-devtools" ], diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts index 9328572b1..52a5eb272 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-module.ts @@ -6,10 +6,6 @@ import { ElectronMainWindowServiceExt, electronMainWindowServiceExtPath, } from '../../../electron-common/electron-main-window-service-ext'; -import { - SplashService, - splashServicePath, -} from '../../../electron-common/splash-service'; import { ElectronWindowService } from './electron-window-service'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -24,9 +20,4 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ) ) .inSingletonScope(); - bind(SplashService) - .toDynamicValue(({ container }) => - ElectronIpcConnectionProvider.createProxy(container, splashServicePath) - ) - .inSingletonScope(); }); diff --git a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts index 2f571b419..d0d0a1ef2 100644 --- a/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts +++ b/arduino-ide-extension/src/electron-browser/theia/core/electron-window-service.ts @@ -1,17 +1,15 @@ -import { - inject, - injectable, - postConstruct, -} from '@theia/core/shared/inversify'; import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { ConnectionStatus, ConnectionStatusService, } from '@theia/core/lib/browser/connection-status-service'; -import { ElectronWindowService as TheiaElectronWindowService } from '@theia/core/lib/electron-browser/window/electron-window-service'; -import { SplashService } from '../../../electron-common/splash-service'; import { nls } from '@theia/core/lib/common'; +import { ElectronWindowService as TheiaElectronWindowService } from '@theia/core/lib/electron-browser/window/electron-window-service'; +import { + inject, + injectable, + postConstruct, +} from '@theia/core/shared/inversify'; import { WindowServiceExt } from '../../../browser/theia/core/window-service-ext'; import { ElectronMainWindowServiceExt } from '../../../electron-common/electron-main-window-service-ext'; @@ -23,20 +21,14 @@ export class ElectronWindowService @inject(ConnectionStatusService) private readonly connectionStatusService: ConnectionStatusService; - @inject(SplashService) - private readonly splashService: SplashService; - - @inject(FrontendApplicationStateService) - private readonly appStateService: FrontendApplicationStateService; - @inject(ElectronMainWindowServiceExt) private readonly mainWindowServiceExt: ElectronMainWindowServiceExt; @postConstruct() protected override init(): void { - this.appStateService - .reachedAnyState('initialized_layout') - .then(() => this.splashService.requestClose()); + // NOOP + // Does not listen on Theia's `window.zoomLevel` changes. + // TODO: IDE2 must switch to the Theia preferences and drop the custom one. } protected shouldUnload(): boolean { diff --git a/arduino-ide-extension/src/electron-common/splash-service.ts b/arduino-ide-extension/src/electron-common/splash-service.ts deleted file mode 100644 index d7d4ba6b2..000000000 --- a/arduino-ide-extension/src/electron-common/splash-service.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const splashServicePath = '/services/splash-service'; -export const SplashService = Symbol('SplashService'); -export interface SplashService { - requestClose(): Promise; -} diff --git a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts index 0146fd02a..ea25a4e09 100644 --- a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts +++ b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts @@ -16,13 +16,8 @@ import { ElectronMainWindowServiceExt, electronMainWindowServiceExtPath, } from '../electron-common/electron-main-window-service-ext'; -import { - SplashService, - splashServicePath, -} from '../electron-common/splash-service'; import { ElectronMainWindowServiceExtImpl } from './electron-main-window-service-ext-impl'; import { IDEUpdaterImpl } from './ide-updater/ide-updater-impl'; -import { SplashServiceImpl } from './splash/splash-service-impl'; import { ElectronMainApplication } from './theia/electron-main-application'; import { ElectronMainWindowServiceImpl } from './theia/electron-main-window-service'; import { TheiaElectronWindow } from './theia/theia-electron-window'; @@ -34,17 +29,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronMainWindowServiceImpl).toSelf().inSingletonScope(); rebind(ElectronMainWindowService).toService(ElectronMainWindowServiceImpl); - bind(SplashServiceImpl).toSelf().inSingletonScope(); - bind(SplashService).toService(SplashServiceImpl); - bind(ElectronConnectionHandler) - .toDynamicValue( - (context) => - new JsonRpcConnectionHandler(splashServicePath, () => - context.container.get(SplashService) - ) - ) - .inSingletonScope(); - // IDE updater bindings bind(IDEUpdaterImpl).toSelf().inSingletonScope(); bind(IDEUpdater).toService(IDEUpdaterImpl); diff --git a/arduino-ide-extension/src/electron-main/splash/splash-screen.ts b/arduino-ide-extension/src/electron-main/splash/splash-screen.ts deleted file mode 100644 index 2120f5968..000000000 --- a/arduino-ide-extension/src/electron-main/splash/splash-screen.ts +++ /dev/null @@ -1,158 +0,0 @@ -/* -MIT License - -Copyright (c) 2017 Troy McKinnon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ -// Copied from https://raw.githubusercontent.com/trodi/electron-splashscreen/2f5052a133be021cbf9a438d0ef4719cd1796b75/index.ts - -/** - * Module handles configurable splashscreen to show while app is loading. - */ - -import { Event } from '@theia/core/lib/common/event'; -import { BrowserWindow } from 'electron'; - -/** - * When splashscreen was shown. - * @ignore - */ -let splashScreenTimestamp = 0; -/** - * Splashscreen is loaded and ready to show. - * @ignore - */ -let splashScreenReady = false; -/** - * Main window has been loading for a min amount of time. - * @ignore - */ -let slowStartup = false; -/** - * True when expected work is complete and we've closed splashscreen, else user prematurely closed splashscreen. - * @ignore - */ -let done = false; -/** - * Show splashscreen if criteria are met. - * @ignore - */ -const showSplash = () => { - if (splashScreen && splashScreenReady && slowStartup) { - splashScreen.show(); - splashScreenTimestamp = Date.now(); - } -}; -/** - * Close splashscreen / show main screen. Ensure screen is visible for a min amount of time. - * @ignore - */ -const closeSplashScreen = (main: Electron.BrowserWindow, min: number): void => { - if (splashScreen) { - const timeout = min - (Date.now() - splashScreenTimestamp); - setTimeout(() => { - done = true; - if (splashScreen) { - splashScreen.isDestroyed() || splashScreen.close(); // Avoid `Error: Object has been destroyed` (#19) - splashScreen = null; - } - if (!main.isDestroyed()) { - main.show(); - } - }, timeout); - } -}; -/** `electron-splashscreen` config object. */ -export interface Config { - /** Options for the window that is loading and having a splashscreen tied to. */ - windowOpts: Electron.BrowserWindowConstructorOptions; - /** - * URL to the splashscreen template. This is the path to an `HTML` or `SVG` file. - * If you want to simply show a `PNG`, wrap it in an `HTML` file. - */ - templateUrl: string; - - /** - * Full set of browser window options for the splashscreen. We override key attributes to - * make it look & feel like a splashscreen; the rest is up to you! - */ - splashScreenOpts: Electron.BrowserWindowConstructorOptions; - /** Number of ms the window will load before splashscreen appears (default: 500ms). */ - delay?: number; - /** Minimum ms the splashscreen will be visible (default: 500ms). */ - minVisible?: number; - /** Close window that is loading if splashscreen is closed by user (default: true). */ - closeWindow?: boolean; -} -/** - * The actual splashscreen browser window. - * @ignore - */ -let splashScreen: Electron.BrowserWindow | null; -/** - * Initializes a splashscreen that will show/hide smartly (and handle show/hiding of main window). - * @param config - Configures splashscreen - * @returns {BrowserWindow} the main browser window ready for loading - */ -export const initSplashScreen = async ( - config: Config, - windowFactory: ( - options: Electron.BrowserViewConstructorOptions - ) => Promise, - onCloseRequested?: Event -): Promise => { - const xConfig: Required = { - windowOpts: config.windowOpts, - templateUrl: config.templateUrl, - splashScreenOpts: config.splashScreenOpts, - delay: config.delay ?? 500, - minVisible: config.minVisible ?? 500, - closeWindow: config.closeWindow ?? true, - }; - xConfig.splashScreenOpts.center = true; - xConfig.splashScreenOpts.frame = false; - xConfig.windowOpts.show = false; - const window = await windowFactory(xConfig.windowOpts); - splashScreen = new BrowserWindow(xConfig.splashScreenOpts); - splashScreen.loadURL(`file://${xConfig.templateUrl}`); - xConfig.closeWindow && - splashScreen.on('close', () => { - done || window.close(); - }); - // Splashscreen is fully loaded and ready to view. - splashScreen.webContents.on('did-finish-load', () => { - splashScreenReady = true; - showSplash(); - }); - // Startup is taking enough time to show a splashscreen. - setTimeout(() => { - slowStartup = true; - showSplash(); - }, xConfig.delay); - if (onCloseRequested) { - onCloseRequested(() => closeSplashScreen(window, xConfig.minVisible)); - } else { - window.webContents.on('did-finish-load', () => { - closeSplashScreen(window, xConfig.minVisible); - }); - } - window.on('closed', () => closeSplashScreen(window, 0)); // XXX: close splash when main window is closed - return window; -}; diff --git a/arduino-ide-extension/src/electron-main/splash/splash-service-impl.ts b/arduino-ide-extension/src/electron-main/splash/splash-service-impl.ts deleted file mode 100644 index 64168c01b..000000000 --- a/arduino-ide-extension/src/electron-main/splash/splash-service-impl.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { Event, Emitter } from '@theia/core/lib/common/event'; -import { SplashService } from '../../electron-common/splash-service'; - -@injectable() -export class SplashServiceImpl implements SplashService { - protected requested = false; - protected readonly onCloseRequestedEmitter = new Emitter(); - - get onCloseRequested(): Event { - return this.onCloseRequestedEmitter.event; - } - - async requestClose(): Promise { - if (!this.requested) { - this.requested = true; - this.onCloseRequestedEmitter.fire(); - } - } -} diff --git a/arduino-ide-extension/src/electron-main/splash/static/splash.html b/arduino-ide-extension/src/electron-main/splash/static/splash.html deleted file mode 100644 index e372bae3a..000000000 --- a/arduino-ide-extension/src/electron-main/splash/static/splash.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - -
-

-
- - - diff --git a/arduino-ide-extension/src/electron-main/splash/static/splash.png b/arduino-ide-extension/src/electron-main/splash/static/splash.png deleted file mode 100644 index 51f0cca4a..000000000 Binary files a/arduino-ide-extension/src/electron-main/splash/static/splash.png and /dev/null differ diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index e5159a149..9c990f0a3 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts @@ -1,18 +1,15 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; +import { injectable } from '@theia/core/shared/inversify'; import { app, BrowserWindow, - BrowserWindowConstructorOptions, contentTracing, ipcMain, - screen, Event as ElectronEvent, } from '@theia/core/electron-shared/electron'; import { fork } from 'child_process'; import { AddressInfo } from 'net'; import { join, dirname } from 'path'; import * as fs from 'fs-extra'; -import { initSplashScreen } from '../splash/splash-screen'; import { MaybePromise } from '@theia/core/lib/common/types'; import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token'; import { FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; @@ -20,7 +17,6 @@ import { ElectronMainApplication as TheiaElectronMainApplication, ElectronMainExecutionParams, } from '@theia/core/lib/electron-main/electron-main-application'; -import { SplashServiceImpl } from '../splash/splash-service-impl'; import { URI } from '@theia/core/shared/vscode-uri'; import { Deferred } from '@theia/core/lib/common/promise-util'; import * as os from '@theia/core/lib/common/os'; @@ -42,14 +38,6 @@ interface WorkspaceOptions { const WORKSPACES = 'workspaces'; -/** - * Purely a dev thing. If you start the app with the `--nosplash` argument, - * then you won't have the splash screen (which is always on top :confused:) and can debug the app at startup. - * Note: if you start the app from VS Code with the `App (Electron)` config, the splash screen will be disabled. - */ -const APP_STARTED_WITH_NOSPLASH = - typeof process !== 'undefined' && process.argv.indexOf('--nosplash') !== -1; - /** * If the app is started with `--open-devtools` argument, the `Dev Tools` will be opened. */ @@ -70,9 +58,6 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { private _firstWindowId: number | undefined; private openFilePromise = new Deferred(); - @inject(SplashServiceImpl) - private readonly splashService: SplashServiceImpl; - override async start(config: FrontendApplicationConfig): Promise { // Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit") // See: https://github.com/electron-userland/electron-builder/issues/2468 @@ -289,69 +274,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { super.onSecondInstance(event, argv, cwd); } - /** - * Use this rather than creating `BrowserWindow` instances from scratch, since some security parameters need to be set, this method will do it. - * - * @param options - */ override async createWindow( asyncOptions: MaybePromise = this.getDefaultTheiaWindowOptions() ): Promise { - let options = await asyncOptions; - options = this.avoidOverlap(options); - let electronWindow: BrowserWindow | undefined; - if (this.windows.size || APP_STARTED_WITH_NOSPLASH) { - electronWindow = await this.doCreateWindow(options); - } else { - const { bounds } = screen.getDisplayNearestPoint( - screen.getCursorScreenPoint() - ); - const splashHeight = 450; - const splashWidth = 600; - const splashY = Math.floor(bounds.y + (bounds.height - splashHeight) / 2); - const splashX = Math.floor(bounds.x + (bounds.width - splashWidth) / 2); - const splashScreenOpts: BrowserWindowConstructorOptions = { - height: splashHeight, - width: splashWidth, - x: splashX, - y: splashY, - transparent: true, - alwaysOnTop: true, - focusable: false, - minimizable: false, - maximizable: false, - hasShadow: false, - resizable: false, - }; - electronWindow = await initSplashScreen( - { - windowOpts: options, - templateUrl: join( - __dirname, - '..', - '..', - '..', - 'src', - 'electron-main', - 'splash', - 'static', - 'splash.html' - ), - delay: 0, - minVisible: 2000, - splashScreenOpts, - }, - (windowOptions) => this.doCreateWindow(windowOptions), - this.splashService.onCloseRequested - ); - } - return electronWindow; - } - - private async doCreateWindow( - options: TheiaBrowserWindowOptions - ): Promise { - const electronWindow = await super.createWindow(options); + const electronWindow = await super.createWindow(asyncOptions); if (APP_STARTED_WITH_DEV_TOOLS) { electronWindow.webContents.openDevTools(); } diff --git a/electron-app/package.json b/electron-app/package.json index 26ff29316..b73757d3f 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -25,12 +25,16 @@ }, "devDependencies": { "@theia/cli": "1.25.0", - "electron": "^15.3.5" + "electron": "^15.3.5", + "html-webpack-plugin": "^5.5.0", + "lottie-web": "^5.9.6", + "remove-files-webpack-plugin": "^1.5.0" }, "scripts": { - "prepare": "theia build --mode development", + "prepare": "yarn preload:generate && theia build --mode development", "start": "theia start --plugins=local-dir:../plugins", - "watch": "theia build --watch --mode development" + "watch": "theia build --watch --mode development", + "preload:generate": "webpack --config ./preload/webpack.config.js" }, "theia": { "target": "electron", @@ -61,7 +65,7 @@ }, "generator": { "config": { - "preloadTemplate": "
" + "preloadTemplate": "./resources/preload.html" } } } diff --git a/electron-app/preload/assets/preload.json b/electron-app/preload/assets/preload.json new file mode 100644 index 000000000..0ab7e95ad --- /dev/null +++ b/electron-app/preload/assets/preload.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 2.0.4","a":"","k":"","d":"","tc":""},"fr":25,"ip":0,"op":81,"w":1920,"h":1080,"nm":"Loop Animation - final","ddd":0,"assets":[{"id":"image_0","w":123,"h":123,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHsAAAB7CAYAAABUx/9/AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAABnUlEQVR4nO3cwU3DUBRFQRu5kHQCpaQQUAiIPlJKCotiFrBFyYof68xUcPWP7OWbpy34+NpP63U/esafDm8voyfcYxk94C7rdTdN8/PoGVv3NHoA/0fsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFDxA4RO0TsELFD5t+DcrvRQ254eew7aOtx9IKb1uW0/FwOfOSH3IL5MHrBbZez33iI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CFih4gdInaI2CHz6AF3OX6+P/T5qcPrJt7Rlx0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHiB0idojYIWKHLKMH3GVdTtN0OY+esXXfRdAatjR1KdMAAAAASUVORK5CYII=","e":1},{"id":"image_1","w":123,"h":40,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHsAAAAoCAYAAADe3YUmAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAAn0lEQVR4nO3RQQ3CQAAAweulApCCAyxhgQd/pCEFBYUHGkoTdkbBJruM2/0xxnYe/Lf3vK7f0cvl6Bb2tp3m0Qn8jtkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2iNkhZoeYHWJ2yDrGfI6xHd3B7ubrA1DkCccjZ/S5AAAAAElFTkSuQmCC","e":1}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"loop/loop_logo Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[960,452,0],"ix":2},"a":{"a":0,"k":[554,340,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[73.006,-10.478],[8.951,0],[0,88.059],[-92.012,0],[-8.358,-1.212],[-30.248,-39.959],[-4.927,-8.906],[0,0],[-3.717,-5.144],[-68.277,-9.799],[-8.93,0],[0,88.059],[92.009,0],[8.471,-1.227],[29.287,-43.105]],"o":[[0,0],[-29.346,43.147],[-8.363,1.179],[-91.965,0],[0,-88.062],[8.887,0],[65.213,9.302],[6.144,8.115],[0,0],[3.072,5.554],[29.911,41.401],[8.49,1.193],[91.96,0],[0,-88.062],[-8.87,0],[-73.023,10.415],[0,0]],"v":[[-0.039,-0.002],[-28.014,50.664],[-180.673,157.917],[-206.808,159.7],[-373.593,-0.002],[-206.721,-159.703],[-180.731,-157.875],[-38.166,-64.896],[-21.649,-39.252],[23.875,43.065],[34.014,59.146],[180.562,157.905],[206.815,159.703],[373.592,0.002],[206.729,-159.701],[180.632,-157.857],[28.087,-50.766]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.505882382393,0.517647087574,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":72.106,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[553.857,339.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":65,"s":[100]},{"t":82.0000651041667,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":50.0083333333333,"op":87,"st":51.0166666666667,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"+ 2","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.812]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"t":69.9995442708333,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1.167]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[0]},{"t":77.9995442708333,"s":[-45]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[1161.248,450.162,0],"to":[0,27.59,0],"ti":[0,-27.59,0]},{"t":77.9907552083333,"s":[1161.248,615.7,0]}],"ix":2},"a":{"a":0,"k":[61.179,61.228,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":51.0083333333333,"op":88,"st":58.0083333333333,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"- 2","refId":"image_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.722]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"t":63.9995442708333,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[0]},{"t":70.1684895833333,"s":[-45]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54,"s":[754.437,450.163,0],"to":[0,-30,0],"ti":[0,30.667,0]},{"t":69.9995442708333,"s":[754.437,266.162,0]}],"ix":2},"a":{"a":0,"k":[61.189,19.892,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":51.0083333333333,"op":88,"st":65.0083333333333,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"loop/loop_logo Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,452,0],"ix":2},"a":{"a":0,"k":[554,340,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[73.006,-10.478],[8.951,0],[0,88.059],[-92.012,0],[-8.358,-1.212],[-30.248,-39.959],[-4.927,-8.906],[0,0],[-3.717,-5.144],[-68.277,-9.799],[-8.93,0],[0,88.059],[92.009,0],[8.471,-1.227],[29.287,-43.105]],"o":[[0,0],[-29.346,43.147],[-8.363,1.179],[-91.965,0],[0,-88.062],[8.887,0],[65.213,9.302],[6.144,8.115],[0,0],[3.072,5.554],[29.911,41.401],[8.49,1.193],[91.96,0],[0,-88.062],[-8.87,0],[-73.023,10.415],[0,0]],"v":[[-0.039,-0.002],[-28.014,50.664],[-180.673,157.917],[-206.808,159.7],[-373.593,-0.002],[-206.721,-159.703],[-180.731,-157.875],[-38.166,-64.896],[-21.649,-39.252],[23.875,43.065],[34.014,59.146],[180.562,157.905],[206.815,159.703],[373.592,0.002],[206.729,-159.701],[180.632,-157.857],[28.087,-50.766]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.505882382393,0.517647087574,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":72.106,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[553.857,339.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":17,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":53,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"+","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"t":26,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.106],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[45]},{"t":33,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.106,"y":1},"o":{"x":0.167,"y":0.167},"t":16,"s":[1161.248,266.162,0],"to":[0,30.667,0],"ti":[0,-30.667,0]},{"t":33,"s":[1161.248,450.162,0]}],"ix":2},"a":{"a":0,"k":[61.179,61.228,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":16,"op":53,"st":23,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"-","refId":"image_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":22,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.106],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":12.16,"s":[-45]},{"t":28.8798828125,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.106,"y":1},"o":{"x":0.167,"y":0.167},"t":12.16,"s":[754.437,630.163,0],"to":[0,-30,0],"ti":[0,30,0]},{"t":28.8798828125,"s":[754.437,450.163,0]}],"ix":2},"a":{"a":0,"k":[61.189,19.892,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":2,"op":53,"st":16,"bm":0}],"markers":[]} diff --git a/electron-app/preload/index.js b/electron-app/preload/index.js new file mode 100644 index 000000000..a65b76220 --- /dev/null +++ b/electron-app/preload/index.js @@ -0,0 +1,7 @@ +require('lottie-web').loadAnimation({ + container: document.getElementById('custom-spinner'), + renderer: 'svg', + loop: true, + autoplay: true, + animationData: require('./assets/preload.json') +}); diff --git a/electron-app/preload/webpack.config.js b/electron-app/preload/webpack.config.js new file mode 100644 index 000000000..213757c5f --- /dev/null +++ b/electron-app/preload/webpack.config.js @@ -0,0 +1,112 @@ +const path = require('path'); +const RemoveWebpackPlugin = require('remove-files-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +module.exports = { + mode: 'production', + target: 'electron-renderer', + devtool: 'inline-source-map', + entry: path.join(__dirname, 'index.js'), + output: { + filename: 'bundle.js', + path: path.join(__dirname, 'dist'), + }, + resolve: { + extensions: ['.js'], + }, + plugins: [ + new HtmlWebpackPlugin({ + inject: false, + templateContent: ({ htmlWebpackPlugin, compilation }) => ` + + + + + + + +
+
+
+ ${htmlWebpackPlugin.files.js.map( + (jsFile) => `` + )} + + + +`, + filename: path.join(__dirname, '../resources/preload.html'), + }), + new RemoveWebpackPlugin({ + after: { + include: [path.join(__dirname, './dist')], + }, + }), + ], +}; diff --git a/electron/.gitignore b/electron/.gitignore index 9f6844f02..c18304ae5 100644 --- a/electron/.gitignore +++ b/electron/.gitignore @@ -15,4 +15,8 @@ dist/ electron-builder.env # The generated `package.json` under the `build` folder. -build/package.json \ No newline at end of file +build/package.json + +# Resources the packager copies from dev to prod +build/resources/preload.html +build/patch/frontend/index.js diff --git a/electron/build/patch/frontend/index.js b/electron/build/patch/frontend/index.js deleted file mode 100644 index 26afbfedd..000000000 --- a/electron/build/patch/frontend/index.js +++ /dev/null @@ -1,100 +0,0 @@ -// Patch for the startup theme. Customizes the `ThemeService.get().defaultTheme();` to dispatch the default IDE2 theme based on the OS' theme. -// For all subsequent starts of the IDE the theme applied will be the last one set by the user. - -// With the current version of Theia adopted (1.25) it is not possible to extend the `ThemeService`, it will be possible starting from Theia 1.27. -// Once the version of Theia is updated, this patch will be removed and this functionality will be implemented via dependency injection. -// Ideally, we should open a PR in Theia and add support for `light` and `dark` default themes in the app config. - -const { - ThemeService, - ThemeServiceSymbol, - BuiltinThemeProvider, -} = require('@theia/core/lib/browser/theming'); -const { - ApplicationProps, -} = require('@theia/application-package/lib/application-props'); -const { - FrontendApplicationConfigProvider, -} = require('@theia/core/lib/browser/frontend-application-config-provider'); - -// It is a mighty hack to support theme updates in the bundled IDE2. -// If the custom theme registration happens before the restoration of the existing monaco themes, then any custom theme changes will be ignored. -// This patch introduces a static deferred promise in the monaco-theming service that will be resolved when the restoration is ready. -// IDE2 cannot require the monaco theme service on the outer module level, as it requires the application config provider to be initialized, -// but the initialization happens only in the generated `index.js`. -// This patch customizes the monaco theme service behavior before loading the DI containers via the preload. -// The preload is called only once before the app loads. The Theia extensions are not loaded at that point, but the app config provider is ready. -const preloader = require('@theia/core/lib/browser/preloader'); -const originalPreload = preloader.preload; -preloader.preload = async function () { - const { MonacoThemingService } = require('@theia/monaco/lib/browser/monaco-theming-service'); - const { MonacoThemeServiceIsReady } = require('arduino-ide-extension/lib/browser/utils/window'); - const { Deferred } = require('@theia/core/lib/common/promise-util'); - const ready = new Deferred(); - if (!window[MonacoThemeServiceIsReady]) { - window[MonacoThemeServiceIsReady] = ready; - console.log('Registered a custom monaco-theme service initialization signal on the window object.'); - } - // Here, it is safe to patch the theme service, app config provider is ready. - MonacoThemingService.init = async function () { - this.updateBodyUiTheme(); - ThemeService.get().onDidColorThemeChange(() => this.updateBodyUiTheme()); - await this.restore(); - ready.resolve(); - }.bind(MonacoThemingService); - return originalPreload(); -}.bind(preloader); - -const lightTheme = 'arduino-theme'; -const darkTheme = 'arduino-theme-dark'; -const defaultTheme = - window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches - ? darkTheme - : lightTheme; - -const originalGet = FrontendApplicationConfigProvider.get; -FrontendApplicationConfigProvider.get = function () { - const originalProps = originalGet.bind(FrontendApplicationConfigProvider)(); - return { ...originalProps, defaultTheme }; -}.bind(FrontendApplicationConfigProvider); - -const arduinoDarkTheme = { - id: 'arduino-theme-dark', - type: 'dark', - label: 'Dark (Arduino)', - editorTheme: 'arduino-theme-dark', - activate() {}, - deactivate() {}, -}; - -const arduinoLightTheme = { - id: 'arduino-theme', - type: 'light', - label: 'Light (Arduino)', - editorTheme: 'arduino-theme', - activate() {}, - deactivate() {}, -}; - -if (!window[ThemeServiceSymbol]) { - const themeService = new ThemeService(); - Object.defineProperty(themeService, 'defaultTheme', { - get: function () { - return ( - this.themes[defaultTheme] || - this.themes[ApplicationProps.DEFAULT.frontend.config.defaultTheme] - ); - }, - }); - themeService.register( - ...BuiltinThemeProvider.themes, - arduinoDarkTheme, - arduinoLightTheme - ); - themeService.startupTheme(); - themeService.setCurrentTheme(defaultTheme); - window[ThemeServiceSymbol] = themeService; -} - -// Require the original, generated `index.js` for `webpack` as the next entry for the `bundle.js`. -require('../../src-gen/frontend/index'); diff --git a/electron/packager/index.js b/electron/packager/index.js index a5e785706..de47629a0 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -7,6 +7,8 @@ const glob = require('glob'); const isCI = require('is-ci'); shell.env.THEIA_ELECTRON_SKIP_REPLACE_FFMPEG = '1'; // Do not run the ffmpeg validation for the packager. + // Note, this will crash on PI if the available memory is less than desired heap size. + // https://github.com/shelljs/shelljs/issues/1024#issuecomment-1001552543 shell.env.NODE_OPTIONS = '--max_old_space_size=4096'; // Increase heap size for the CI shell.env.PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = 'true'; // Skip download and avoid `ERROR: Failed to download Chromium`. const template = require('./config').generateTemplate( @@ -14,7 +16,7 @@ ); const utils = require('./utils'); const merge = require('deepmerge'); - const { isRelease, isElectronPublish, getChannelFile } = utils; + const { isRelease, getChannelFile } = utils; const { version } = template; const { productName } = template.build; @@ -58,6 +60,11 @@ .filter((filename) => resourcesToKeep.indexOf(filename) === -1) .forEach((filename) => rm('-rf', path('..', 'build', filename))); + // Clean up the `./electron/build/patch` and `./electron/build/resources` folder with Git. + // To avoid file duplication between bundled app and dev mode, some files are copied from `./electron-app` to `./electron/build` folder. + const foldersToSyncFromDev = ['patch', 'resources']; + foldersToSyncFromDev.forEach(filename => shell.exec(`git -C ${path('..', 'build', filename)} clean -ffxdq`, { async: false })); + const extensions = require('./extensions.json'); echo( `Building the application with the following extensions:\n${extensions @@ -70,14 +77,14 @@ // Copy the following items into the `working-copy` folder. Make sure to reuse the `yarn.lock`. | //----------------------------------------------------------------------------------------------+ mkdir('-p', path('..', workingCopy)); - for (const name of [ + for (const filename of [ ...allDependencies, 'yarn.lock', 'package.json', 'lerna.json', 'i18n' ]) { - cp('-rf', path(rootPath, name), path('..', workingCopy)); + cp('-rf', path(rootPath, filename), path('..', workingCopy)); } //----------------------------------------------+ @@ -132,6 +139,12 @@ `Building the ${productName} application` ); + //---------------------------------------------------------------------------------------------+ + // Copy the patched `index.js` for the frontend, the Theia preload, etc. from `./electron-app` | + //---------------------------------------------------------------------------------------------+ + for (const filename of foldersToSyncFromDev) { + cp('-rf', path('..', workingCopy, 'electron-app', filename), path('..', 'build')); + } //-------------------------------------------------------------------------------------------------------------------------+ // Test the application. With this approach, we cannot publish test results to GH Actions but save 6-10 minutes per builds | //-------------------------------------------------------------------------------------------------------------------------+ diff --git a/yarn.lock b/yarn.lock index 84393eeff..29b6073bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1165,6 +1165,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.13" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" @@ -2286,6 +2294,13 @@ dependencies: execa "^0.2.2" +"@sindresorhus/df@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-3.1.1.tgz#94200f9277e4a7fdd35ce8ab8b6bc5b52b164d31" + integrity sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ== + dependencies: + execa "^2.0.1" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -2341,7 +2356,7 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz#8863915676f837d9dad7b76f50cb500c1e9422e9" integrity sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q== -"@stroncium/procfs@^1.0.0": +"@stroncium/procfs@^1.0.0", "@stroncium/procfs@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@stroncium/procfs/-/procfs-1.2.1.tgz#6b9be6fd20fb0a4c20e99a8695e083c699bb2b45" integrity sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA== @@ -3134,6 +3149,11 @@ dependencies: "@types/unist" "*" +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" @@ -3531,6 +3551,15 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.5.tgz#b1d2f772142a301538fae9bdf9cf15b9f2573a29" integrity sha512-hKB88y3YHL8oPOs/CNlaXtjWn93+Bs48sDQR37ZUqG2tLeCS7EA1cmnkKsuQsub9OKEB/y/Rw9zqJqqNSbqVlQ== +"@types/webpack@5.28.0": + version "5.28.0" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03" + integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + "@types/which@^1.3.1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" @@ -3862,6 +3891,11 @@ acorn@^8.4.1, acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.7.1: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + agent-base@4, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -4739,6 +4773,11 @@ body-parser@1.20.0, body-parser@^1.17.2, body-parser@^1.18.3: type-is "~1.6.18" unpipe "1.0.0" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + boolean@^3.0.1: version "3.2.0" resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" @@ -5302,6 +5341,13 @@ classnames@^2.3.1: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== +clean-css@^5.2.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" + integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== + dependencies: + source-map "~0.6.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -5892,7 +5938,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -5920,6 +5966,22 @@ css-loader@^6.2.0: postcss-value-parser "^4.2.0" semver "^7.3.5" +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -6366,6 +6428,13 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + dom-helpers@^5.0.1, dom-helpers@^5.1.3: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -6374,6 +6443,20 @@ dom-helpers@^5.0.1, dom-helpers@^5.1.3: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -6381,11 +6464,27 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + dompurify@^2.2.9: version "2.3.8" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f" integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw== +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -6609,6 +6708,14 @@ engine.io@~6.1.0: engine.io-parser "~5.0.3" ws "~8.2.3" +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enhanced-resolve@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" @@ -6629,6 +6736,11 @@ ent@^2.2.0: resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + entities@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" @@ -7026,6 +7138,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" + integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^3.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -7798,7 +7925,7 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" -get-stream@^5.1.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -8323,7 +8450,7 @@ hast-util-whitespace@^2.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg== -he@1.2.0: +he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -8388,6 +8515,19 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + html-tag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/html-tag/-/html-tag-2.0.0.tgz#36c3bc8d816fd30b570d5764a497a641640c2fed" @@ -8396,6 +8536,27 @@ html-tag@^2.0.0: is-self-closing "^1.0.1" kind-of "^6.0.0" +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + http-cache-semantics@3.8.1, http-cache-semantics@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" @@ -9865,7 +10026,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.1: +lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9936,6 +10097,11 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lottie-web@^5.9.6: + version "5.9.6" + resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.9.6.tgz#62ae68563355d3e04aa75d53dec3dd4bea0e57c9" + integrity sha512-JFs7KsHwflugH5qIXBpB4905yC1Sub2MZWtl/elvO/QC6qj1ApqbUZJyjzJseJUtVpgiDaXQLjBlIJGS7UUUXA== + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -10836,6 +11002,13 @@ move-file@^1.1.0: make-dir "^3.0.0" path-exists "^3.0.0" +move-file@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.1.0.tgz#3bec9d34fbe4832df6865f112cda4492b56e8507" + integrity sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA== + dependencies: + path-exists "^4.0.0" + mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -11284,6 +11457,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -11328,6 +11508,13 @@ nsfw@^2.1.2: dependencies: node-addon-api "*" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -11620,6 +11807,11 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-finally@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + p-is-promise@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" @@ -12199,6 +12391,14 @@ prettier@^2.3.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -12919,6 +13119,11 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + relative@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/relative/-/relative-3.0.2.tgz#0dcd8ec54a5d35a3c15e104503d65375b5a5367f" @@ -12953,11 +13158,30 @@ remarkable@^1.6.2, remarkable@^1.7.1: argparse "^1.0.10" autolinker "~0.28.0" +remove-files-webpack-plugin@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/remove-files-webpack-plugin/-/remove-files-webpack-plugin-1.5.0.tgz#bb43b9cbcb5e9bb6a1a4c4c55dfd8d14279b6fa7" + integrity sha512-PWxldMWpXKmqAv0Lc6Gy1+9QnMLJad94xKSrD3mJLHuZbifVcbTaJn5iZY1YUqPv56GnvMdJZfU8807NxKhtvg== + dependencies: + "@types/webpack" "5.28.0" + trash "7.2.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -14278,7 +14502,7 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -14393,6 +14617,16 @@ terser-webpack-plugin@^5.1.3: source-map "^0.6.1" terser "^5.7.2" +terser@^5.10.0: + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + terser@^5.7.2: version "5.13.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" @@ -14570,6 +14804,20 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +trash@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/trash/-/trash-7.2.0.tgz#c5ad0c9b13d7e7cad0b4187b3cfe38cd8b39abe2" + integrity sha512-3bR8Z5aWO8b9qybS6skBoaavH/hX9Onb1RrdIIhJxv9VpH3aBtpbKuAX4rIh/0xpDZ7K4ga36wONk/okbhjTlA== + dependencies: + "@stroncium/procfs" "^1.2.1" + globby "^7.1.1" + is-path-inside "^3.0.2" + make-dir "^3.1.0" + move-file "^2.0.0" + p-map "^4.0.0" + uuid "^8.3.2" + xdg-trashdir "^3.1.0" + trash@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/trash/-/trash-6.1.1.tgz#8fb863421b31f32571f2650b53534934d5e63025" @@ -15085,6 +15333,11 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -15271,6 +15524,14 @@ watchpack@^2.3.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -15320,6 +15581,36 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== +webpack@^5: + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + webpack@^5.48.0: version "5.72.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13" @@ -15606,6 +15897,11 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xdg-trashdir@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-2.1.1.tgz#59a60aaf8e6f9240c1daed9a0944b2f514c27d8e" @@ -15617,6 +15913,16 @@ xdg-trashdir@^2.1.1: user-home "^2.0.0" xdg-basedir "^2.0.0" +xdg-trashdir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz#7294262d5793eb5488c2f529fba883ec32a24ea0" + integrity sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ== + dependencies: + "@sindresorhus/df" "^3.1.1" + mount-point "^3.0.0" + user-home "^2.0.0" + xdg-basedir "^4.0.0" + xhr2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93"