From 2816946c94d1ecb7b1a485c4799b4ec988b68d15 Mon Sep 17 00:00:00 2001 From: Lurkars Date: Wed, 16 Feb 2022 09:11:08 +0100 Subject: [PATCH 001/116] add OIDC username + locale --- docker-compose.single-domain.yaml | 3 ++ docker-compose.yaml | 3 ++ front/src/Connexion/ConnectionManager.ts | 34 +++++++++++++++++-- .../src/Controller/AuthenticateController.ts | 21 ++++++++++-- pusher/src/Enum/EnvironmentVariable.ts | 3 ++ pusher/src/Services/JWTTokenManager.ts | 6 ++-- pusher/src/Services/OpenIDClient.ts | 12 +++++-- 7 files changed, 72 insertions(+), 10 deletions(-) diff --git a/docker-compose.single-domain.yaml b/docker-compose.single-domain.yaml index 1612e396..5972df58 100644 --- a/docker-compose.single-domain.yaml +++ b/docker-compose.single-domain.yaml @@ -76,6 +76,9 @@ services: OPID_CLIENT_ISSUER: $OPID_CLIENT_ISSUER OPID_CLIENT_REDIRECT_URL: $OPID_CLIENT_REDIRECT_URL OPID_PROFILE_SCREEN_PROVIDER: $OPID_PROFILE_SCREEN_PROVIDER + OPID_ADDITIONAL_SCOPES: $OPID_ADDITIONAL_SCOPES + OPID_USERNAME_CLAIM: $OPID_USERNAME_CLAIM + OPID_LOCALE_CLAIM: $OPID_LOCALE_CLAIM DISABLE_ANONYMOUS: $DISABLE_ANONYMOUS volumes: - ./pusher:/usr/src/app diff --git a/docker-compose.yaml b/docker-compose.yaml index 8489b336..eb610122 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -86,6 +86,9 @@ services: OPID_CLIENT_ISSUER: $OPID_CLIENT_ISSUER OPID_CLIENT_REDIRECT_URL: $OPID_CLIENT_REDIRECT_URL OPID_PROFILE_SCREEN_PROVIDER: $OPID_PROFILE_SCREEN_PROVIDER + OPID_ADDITIONAL_SCOPES: $OPID_ADDITIONAL_SCOPES + OPID_USERNAME_CLAIM: $OPID_USERNAME_CLAIM + OPID_LOCALE_CLAIM: $OPID_LOCALE_CLAIM DISABLE_ANONYMOUS: $DISABLE_ANONYMOUS volumes: - ./pusher:/usr/src/app diff --git a/front/src/Connexion/ConnectionManager.ts b/front/src/Connexion/ConnectionManager.ts index 05d0255d..62daa58d 100644 --- a/front/src/Connexion/ConnectionManager.ts +++ b/front/src/Connexion/ConnectionManager.ts @@ -16,6 +16,10 @@ import { isRegisterData } from "../Messages/JsonMessages/RegisterData"; import { isAdminApiData } from "../Messages/JsonMessages/AdminApiData"; import { limitMapStore } from "../Stores/GameStore"; import { showLimitRoomModalStore } from "../Stores/ModalStore"; +import { gameManager } from "../Phaser/Game/GameManager"; +import { locales } from "../i18n/i18n-util"; +import type { Locales } from "../i18n/i18n-types"; +import { setCurrentLocale } from "../i18n/locales"; class ConnectionManager { private localUser!: LocalUser; @@ -342,9 +346,12 @@ class ConnectionManager { throw new Error("No Auth code provided"); } } - const { authToken, userUuid, textures, email } = await Axios.get(`${PUSHER_URL}/login-callback`, { - params: { code, nonce, token, playUri: this.currentRoom?.key }, - }).then((res) => { + const { authToken, userUuid, textures, email, username, locale } = await Axios.get( + `${PUSHER_URL}/login-callback`, + { + params: { code, nonce, token, playUri: this.currentRoom?.key }, + } + ).then((res) => { return res.data; }); localUserStore.setAuthToken(authToken); @@ -352,6 +359,27 @@ class ConnectionManager { localUserStore.saveUser(this.localUser); this.authToken = authToken; + if (username) { + gameManager.setPlayerName(username); + } + + if (locale) { + try { + if (locales.indexOf(locale) == -1) { + locales.forEach((l) => { + if (l.startsWith(locale.split("-")[0])) { + setCurrentLocale(l); + return; + } + }); + } else { + setCurrentLocale(locale as Locales); + } + } catch (err) { + console.warn("Could not set locale", err); + } + } + //user connected, set connected store for menu at true userIsConnected.set(true); } diff --git a/pusher/src/Controller/AuthenticateController.ts b/pusher/src/Controller/AuthenticateController.ts index 89d3adf3..6abb94f8 100644 --- a/pusher/src/Controller/AuthenticateController.ts +++ b/pusher/src/Controller/AuthenticateController.ts @@ -93,7 +93,15 @@ export class AuthenticateController extends BaseController { res.writeStatus("200"); this.addCorsHeaders(res); res.writeHeader("Content-Type", "application/json"); - return res.end(JSON.stringify({ ...resCheckTokenAuth, ...resUserData, authToken: token })); + return res.end( + JSON.stringify({ + ...resCheckTokenAuth, + ...resUserData, + authToken: token, + username: authTokenData?.username, + locale: authTokenData?.locale, + }) + ); } catch (err) { console.info("User was not connected", err); } @@ -115,7 +123,12 @@ export class AuthenticateController extends BaseController { if (!email) { throw new Error("No email in the response"); } - const authToken = jwtTokenManager.createAuthToken(email, userInfo?.access_token); + const authToken = jwtTokenManager.createAuthToken( + email, + userInfo?.access_token, + userInfo?.username, + userInfo?.locale + ); //Get user data from Admin Back Office //This is very important to create User Local in LocalStorage in WorkAdventure @@ -124,7 +137,9 @@ export class AuthenticateController extends BaseController { res.writeStatus("200"); this.addCorsHeaders(res); res.writeHeader("Content-Type", "application/json"); - return res.end(JSON.stringify({ ...data, authToken })); + return res.end( + JSON.stringify({ ...data, authToken, username: userInfo?.username, locale: userInfo?.locale }) + ); } catch (e) { console.error("openIDCallback => ERROR", e); return this.errorToResponse(e, res); diff --git a/pusher/src/Enum/EnvironmentVariable.ts b/pusher/src/Enum/EnvironmentVariable.ts index b3415a82..347049b2 100644 --- a/pusher/src/Enum/EnvironmentVariable.ts +++ b/pusher/src/Enum/EnvironmentVariable.ts @@ -18,6 +18,9 @@ export const OPID_CLIENT_SECRET = process.env.OPID_CLIENT_SECRET || ""; export const OPID_CLIENT_ISSUER = process.env.OPID_CLIENT_ISSUER || ""; export const OPID_CLIENT_REDIRECT_URL = process.env.OPID_CLIENT_REDIRECT_URL || FRONT_URL + "/jwt"; export const OPID_PROFILE_SCREEN_PROVIDER = process.env.OPID_PROFILE_SCREEN_PROVIDER || ADMIN_URL + "/profile"; +export const OPID_ADDITIONAL_SCOPES = process.env.OPID_ADDITIONAL_SCOPES || ""; +export const OPID_USERNAME_CLAIM = process.env.OPID_USERNAME_CLAIM || "username"; +export const OPID_LOCALE_CLAIM = process.env.OPID_LOCALE_CLAIM || "locale"; export const DISABLE_ANONYMOUS: boolean = process.env.DISABLE_ANONYMOUS === "true"; export { diff --git a/pusher/src/Services/JWTTokenManager.ts b/pusher/src/Services/JWTTokenManager.ts index 4c094072..325df2d8 100644 --- a/pusher/src/Services/JWTTokenManager.ts +++ b/pusher/src/Services/JWTTokenManager.ts @@ -5,6 +5,8 @@ import { InvalidTokenError } from "../Controller/InvalidTokenError"; export interface AuthTokenData { identifier: string; //will be a email if logged in or an uuid if anonymous accessToken?: string; + username?: string; + locale?: string; } export interface AdminSocketTokenData { authorizedRoomIds: string[]; //the list of rooms the client is authorized to read from. @@ -16,8 +18,8 @@ class JWTTokenManager { return Jwt.verify(token, ADMIN_SOCKETS_TOKEN) as AdminSocketTokenData; } - public createAuthToken(identifier: string, accessToken?: string) { - return Jwt.sign({ identifier, accessToken }, SECRET_KEY, { expiresIn: "30d" }); + public createAuthToken(identifier: string, accessToken?: string, username?: string, locale?: string) { + return Jwt.sign({ identifier, accessToken, username, locale }, SECRET_KEY, { expiresIn: "30d" }); } public verifyJWTToken(token: string, ignoreExpiration: boolean = false): AuthTokenData { diff --git a/pusher/src/Services/OpenIDClient.ts b/pusher/src/Services/OpenIDClient.ts index 13bf6f76..4f600fc5 100644 --- a/pusher/src/Services/OpenIDClient.ts +++ b/pusher/src/Services/OpenIDClient.ts @@ -4,6 +4,9 @@ import { OPID_CLIENT_SECRET, OPID_CLIENT_ISSUER, OPID_CLIENT_REDIRECT_URL, + OPID_USERNAME_CLAIM, + OPID_LOCALE_CLAIM, + OPID_ADDITIONAL_SCOPES, } from "../Enum/EnvironmentVariable"; class OpenIDClient { @@ -26,7 +29,7 @@ class OpenIDClient { public authorizationUrl(state: string, nonce: string, playUri?: string, redirect?: string) { return this.initClient().then((client) => { return client.authorizationUrl({ - scope: "openid email", + scope: "openid email " + OPID_ADDITIONAL_SCOPES, prompt: "login", state: state, nonce: nonce, @@ -36,7 +39,10 @@ class OpenIDClient { }); } - public getUserInfo(code: string, nonce: string): Promise<{ email: string; sub: string; access_token: string }> { + public getUserInfo( + code: string, + nonce: string + ): Promise<{ email: string; sub: string; access_token: string; username: string; locale: string }> { return this.initClient().then((client) => { return client.callback(OPID_CLIENT_REDIRECT_URL, { code }, { nonce }).then((tokenSet) => { return client.userinfo(tokenSet).then((res) => { @@ -45,6 +51,8 @@ class OpenIDClient { email: res.email as string, sub: res.sub, access_token: tokenSet.access_token as string, + username: res[OPID_USERNAME_CLAIM] as string, + locale: res[OPID_LOCALE_CLAIM] as string, }; }); }); From 31a0d7d45230cb4958e9568818415e4a7a615ff3 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Thu, 17 Feb 2022 18:09:57 +0100 Subject: [PATCH 002/116] add desktop app --- desktop/.eslintrc.json | 30 + desktop/.gitignore | 4 + desktop/LICENSE.txt | 691 ++++++ desktop/README.md | 3 + desktop/assets/icons/1024x1024.png | Bin 0 -> 9132 bytes desktop/assets/icons/logo.png | Bin 0 -> 5126 bytes desktop/assets/icons/logo.svg | 1 + desktop/jasmine.json | 5 + desktop/package.json | 69 + desktop/src/app.ts | 75 + desktop/src/auto-updater.ts | 94 + desktop/src/log.ts | 66 + desktop/src/main.ts | 11 + desktop/src/notification.ts | 24 + desktop/src/settings.ts | 42 + desktop/src/tray.ts | 80 + desktop/src/update-auto-launch.ts | 41 + desktop/src/window.ts | 81 + desktop/tsconfig.json | 72 + desktop/yarn.lock | 3212 ++++++++++++++++++++++++++++ 20 files changed, 4601 insertions(+) create mode 100644 desktop/.eslintrc.json create mode 100644 desktop/.gitignore create mode 100644 desktop/LICENSE.txt create mode 100644 desktop/README.md create mode 100644 desktop/assets/icons/1024x1024.png create mode 100644 desktop/assets/icons/logo.png create mode 100644 desktop/assets/icons/logo.svg create mode 100644 desktop/jasmine.json create mode 100644 desktop/package.json create mode 100644 desktop/src/app.ts create mode 100644 desktop/src/auto-updater.ts create mode 100644 desktop/src/log.ts create mode 100644 desktop/src/main.ts create mode 100644 desktop/src/notification.ts create mode 100644 desktop/src/settings.ts create mode 100644 desktop/src/tray.ts create mode 100644 desktop/src/update-auto-launch.ts create mode 100644 desktop/src/window.ts create mode 100644 desktop/tsconfig.json create mode 100644 desktop/yarn.lock diff --git a/desktop/.eslintrc.json b/desktop/.eslintrc.json new file mode 100644 index 00000000..3aab37d9 --- /dev/null +++ b/desktop/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "root": true, + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "project": "./tsconfig.json" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-explicit-any": "error" + } +} diff --git a/desktop/.gitignore b/desktop/.gitignore new file mode 100644 index 00000000..ca0a17d7 --- /dev/null +++ b/desktop/.gitignore @@ -0,0 +1,4 @@ +/dist/ +/node_modules/ +/dist/bundle.js +/yarn-error.log diff --git a/desktop/LICENSE.txt b/desktop/LICENSE.txt new file mode 100644 index 00000000..614e6268 --- /dev/null +++ b/desktop/LICENSE.txt @@ -0,0 +1,691 @@ +NOTICE +This package contains software licensed under different +licenses, please refer to the NOTICE.txt file for further +information and LICENSES.txt for full license texts. + +WorkAdventure Enterprise edition can be licensed independently from +the source under separate commercial terms. + +The software ("Software") is developed and owned by TheCodingMachine +and is subject to the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, with the Commons Clause as follows: + + + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license +for software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are +designed to take away your freedom to share and change the works. By +contrast, our General Public Licenses are intended to guarantee your +freedom to share and change all versions of a program--to make sure it +remains free software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public +License. + + "Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further restriction, +you may remove that term. If a license document contains a further +restriction but permits relicensing or conveying under this License, you +may add to a covered work material governed by the terms of that license +document, provided that the further restriction does not survive such +relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have permission +to link or combine any covered work with a work licensed under version 3 +of the GNU General Public License into a single combined work, and to +convey the resulting work. The terms of this License will continue to +apply to the part which is the covered work, but the work with which it is +combined will remain governed by version 3 of the GNU General Public +License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may differ +in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero +General Public License "or any later version" applies to it, you have +the option of following the terms and conditions either of that +numbered version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number +of the GNU Affero General Public License, you may choose any version +ever published by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that +proxy's public statement of acceptance of a version permanently +authorizes you to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + + +"Commons Clause" License Condition + +The Software is provided to you by the Licensor under the License, as +defined below, subject to the following condition. Without limiting +other conditions in the License, the grant of rights under the License +will not include, and the License does not grant to you, the right to +Sell the Software. For purposes of the foregoing, "Sell" means +practicing any or all of the rights granted to you under the License +to provide to third parties, for a fee or other consideration, +a product or service that consists, entirely or substantially, +of the Software or the functionality of the Software. Any license +notice or attribution required by the License must also include +this Commons Cause License Condition notice. diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 00000000..f8788332 --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,3 @@ +# Desktop + +The desktop component is an electron app. \ No newline at end of file diff --git a/desktop/assets/icons/1024x1024.png b/desktop/assets/icons/1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdd695cf34c4a9c9aa77315528322f5e4bad5eb GIT binary patch literal 9132 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 literal 0 HcmV?d00001 diff --git a/desktop/assets/icons/logo.png b/desktop/assets/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a23b924fa68839dcea1383623f30a9139075ad4f GIT binary patch literal 5126 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 literal 0 HcmV?d00001 diff --git a/desktop/assets/icons/logo.svg b/desktop/assets/icons/logo.svg new file mode 100644 index 00000000..f66f0603 --- /dev/null +++ b/desktop/assets/icons/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/desktop/jasmine.json b/desktop/jasmine.json new file mode 100644 index 00000000..b51ed79d --- /dev/null +++ b/desktop/jasmine.json @@ -0,0 +1,5 @@ +{ + "spec_dir": "tests", + "spec_files": ["**/*[tT]est.ts"], + "stopSpecOnExpectationFailure": false +} \ No newline at end of file diff --git a/desktop/package.json b/desktop/package.json new file mode 100644 index 00000000..95e3e8b9 --- /dev/null +++ b/desktop/package.json @@ -0,0 +1,69 @@ +{ + "name": "@workadventure/desktop", + "version": "1.0.0", + "description": "", + "main": "index.js", + "license": "SEE LICENSE IN LICENSE.txt", + "scripts": { + "tsc": "tsup-node ./src/main.ts", + "dev": "tsup-node ./src/main.ts --watch --onSuccess 'yarn electron dist/main.js'", + "prod": "tsc && node --max-old-space-size=4096 ./dist/server.js", + "runprod": "node --max-old-space-size=4096 ./dist/server.js", + "profile": "tsc && node --prof ./dist/server.js", + "test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json", + "lint": "node_modules/.bin/eslint src/ . --ext .ts", + "fix": "node_modules/.bin/eslint --fix src/ . --ext .ts" + }, + "dependencies": { + "auto-launch": "^5.0.5", + "electron-is-dev": "^2.0.0", + "electron-log": "^4.4.6", + "electron-settings": "^4.0.2", + "electron-updater": "^4.6.5", + "electron-util": "^0.17.2", + "electron-window-state": "^5.0.3" + }, + "devDependencies": { + "@types/auto-launch": "^5.0.2", + "@types/jasmine": "^3.5.10", + "@typescript-eslint/eslint-plugin": "^2.26.0", + "@typescript-eslint/parser": "^2.26.0", + "electron": "^17.0.1", + "electron-builder": "^22.14.13", + "eslint": "^6.8.0", + "jasmine": "^3.5.0", + "tsup": "^5.11.13", + "typescript": "^3.8.3" + }, + "build": { + "appId": "re.workadventu.desktop", + "files": [ + "src/**/*", + "assets/**/*" + ], + "dmg": { + "icon": false + }, + "linux": { + "category": "TODO;TODO", + "packageCategory": "TODO;TODO", + "maintainer": "TODO", + "icon": "assets/icons/TODO.icns", + "description": "TODO", + "target": [ + "deb", + "zip", + "AppImage" + ], + "artifactName": "${productName}-${version}-${arch}.${ext}" + }, + "win": { + "icon": "assets/icons/TODO.ico", + "artifactName": "${productName}-${version}-setup.${ext}" + }, + "publish": { + "provider": "generic", + "url": "TODO" + } + } +} diff --git a/desktop/src/app.ts b/desktop/src/app.ts new file mode 100644 index 00000000..3c962aba --- /dev/null +++ b/desktop/src/app.ts @@ -0,0 +1,75 @@ +import { app, BrowserWindow } from "electron"; + +import { createWindow, getWindow } from "./window"; +import { createTray } from "./tray"; +// import * as autoUpdater from "./auto-updater"; +import updateAutoLaunch from "./update-auto-launch"; + +function init() { + const appLock = app.requestSingleInstanceLock(); + + if (!appLock) { + console.log("Application already running"); + app.quit(); + return; + } + + app.on("second-instance", () => { + // re-create window if closed + createWindow(); + + const mainWindow = getWindow(); + + // Someone tried to run a second instance, we should focus our window. + if (mainWindow) { + if (mainWindow.isMinimized()) { + mainWindow.restore(); + } + + mainWindow.focus(); + } + }); + + // This method will be called when Electron has finished loading + app.on("ready", () => { + // autoUpdater.init(); + + // enable auto launch + updateAutoLaunch(); + + // load ipc handler + // ipc(); + + // Don't show the app in the doc + // if (app.dock) { + // app.dock.hide(); + // } + + createWindow(); + createTray(); + }); + + // Quit when all windows are closed. + app.on("window-all-closed", () => { + // macOs users have to press Cmd + Q to stop the app + if (process.platform !== "darwin") { + app.quit(); + } + }); + + app.on("activate", () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } + }); + + app.on("quit", () => { + // TODO + }); +} + +export default { + init, +}; diff --git a/desktop/src/auto-updater.ts b/desktop/src/auto-updater.ts new file mode 100644 index 00000000..7a48a334 --- /dev/null +++ b/desktop/src/auto-updater.ts @@ -0,0 +1,94 @@ +import { app, dialog } from "electron"; +import { autoUpdater } from "electron-updater"; +import log from "electron-log"; +import * as isDev from "electron-is-dev"; +import * as util from "util"; + +import { createAndShowNotification } from "./notification"; + +const sleep = util.promisify(setTimeout); + +let isCheckPending = false; +let isManualRequestedUpdate = false; + +export async function checkForUpdates() { + if (isCheckPending) { + return; + } + + // Don't do auto-updates in development + if (isDev) { + return; + } + + // check for updates right away + await autoUpdater.checkForUpdates(); + + isCheckPending = false; +} + +export async function manualRequestUpdateCheck() { + isManualRequestedUpdate = true; + + createAndShowNotification({ + body: "Checking for updates ...", + }); + + await checkForUpdates(); + isManualRequestedUpdate = false; +} + +export function init() { + autoUpdater.logger = log; + + autoUpdater.on("update-downloaded", ({ releaseNotes, releaseName }) => { + (async () => { + const dialogOpts = { + type: "question", + buttons: ["Install and Restart", "Install Later"], + defaultId: 0, + title: "WorkAdventure - Update", + message: process.platform === "win32" ? releaseNotes : releaseName, + detail: + "A new version has been downloaded. Restart the application to apply the updates.", + }; + + const { response } = await dialog.showMessageBox(dialogOpts); + if (response === 0) { + await sleep(1000); + + autoUpdater.quitAndInstall(); + + // Force app to quit. This is just a workaround, ideally autoUpdater.quitAndInstall() should relaunch the app. + app.isQuiting = true; + app.confirmedExitPrompt = true; + app.quit(); + } + })(); + }); + + if (process.platform === "linux" && !process.env.APPIMAGE) { + autoUpdater.autoDownload = false; + autoUpdater.autoInstallOnAppQuit = false; + + autoUpdater.on("update-available", () => { + createAndShowNotification({ + title: "WorkAdventure - Update available", + body: "Please go to our website and install the newest version", + }); + }); + } + + autoUpdater.on("update-not-available", () => { + if (isManualRequestedUpdate) { + createAndShowNotification({ + body: "No update available.", + }); + } + }); + + checkForUpdates(); + + // run update check every hour again + setInterval(() => checkForUpdates, 1000 * 60 * 1); +} diff --git a/desktop/src/log.ts b/desktop/src/log.ts new file mode 100644 index 00000000..5378115d --- /dev/null +++ b/desktop/src/log.ts @@ -0,0 +1,66 @@ +import { dialog, shell } from "electron"; +import electronIsDev from "electron-is-dev"; +import log from "electron-log"; + +import settings from "./settings"; + +function onError(e: Error) { + try { + log.error(e); + + dialog.showErrorBox( + "WorkAdventure - A JavaScript error occurred", + e.stack || "" + ); + } catch (logError) { + // eslint-disable-next-line no-console + console.error(e); + } +} + +function onRejection(reason: Error) { + if (reason instanceof Error) { + let _reason = reason; + const errPrototype = Object.getPrototypeOf(reason); + const nameProperty = Object.getOwnPropertyDescriptor(errPrototype, "name"); + + if (!nameProperty || !nameProperty.writable) { + _reason = new Error(reason.message); + } + + _reason.name = `UnhandledRejection ${_reason.name}`; + onError(_reason); + return; + } + + const error = new Error(JSON.stringify(reason)); + error.name = "UnhandledRejection"; + onError(error); +} + +function init() { + const logLevel = settings.get("log_level", "info"); + log.transports.file.level = logLevel; + log.transports.console.level = logLevel; + + // eslint-disable-next-line no-console + console.log = log.log.bind(log); + + if (!electronIsDev) { + log.transports.file.fileName = "work-adventure.log"; + } else { + console.log("Log file is disabled in dev. Using console output instead."); + } + + process.on("uncaughtException", onError); + process.on("unhandledRejection", onRejection); +} + +export async function openLog() { + const logFilePath = log.transports.file.getFile().path; + await shell.openPath(logFilePath); +} + +export default { + init, +}; diff --git a/desktop/src/main.ts b/desktop/src/main.ts new file mode 100644 index 00000000..6817ebff --- /dev/null +++ b/desktop/src/main.ts @@ -0,0 +1,11 @@ +import app from "./app"; +import log from "./log"; +import settings from "./settings"; + +async function start() { + await settings.init(); + log.init(); +} + +start(); +app.init(); diff --git a/desktop/src/notification.ts b/desktop/src/notification.ts new file mode 100644 index 00000000..49a92f20 --- /dev/null +++ b/desktop/src/notification.ts @@ -0,0 +1,24 @@ +import path from "path"; +import { Notification, NotificationConstructorOptions } from "electron"; + +export function createNotification( + options: Partial +) { + const notification = new Notification({ + title: "WorkAdventure", + icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), + ...(options || {}), + }); + + return notification; +} + +export function createAndShowNotification( + options: Partial +) { + const notification = createNotification(options); + + notification.show(); + + return notification; +} diff --git a/desktop/src/settings.ts b/desktop/src/settings.ts new file mode 100644 index 00000000..c19a9979 --- /dev/null +++ b/desktop/src/settings.ts @@ -0,0 +1,42 @@ +import ElectronLog from "electron-log"; +import Settings from "electron-settings"; + +type SettingsData = { + log_level: ElectronLog.LogLevel; + auto_launch_enabled: boolean; +}; + +let settings: SettingsData; + +async function init() { + settings = (await Settings.get()) as SettingsData; +} + +function get( + key: T, + fallback?: SettingsData[T] +): SettingsData[T] { + if (settings === null) { + throw new Error("Settings not initialized"); + } + + return settings[key]; +} + +export function set( + key: T, + value: SettingsData[T] +) { + if (settings === null) { + throw new Error("Settings not initialized"); + } + + settings[key] = value; + void Settings.set(settings); +} + +export default { + init, + get, + set, +}; diff --git a/desktop/src/tray.ts b/desktop/src/tray.ts new file mode 100644 index 00000000..9396e438 --- /dev/null +++ b/desktop/src/tray.ts @@ -0,0 +1,80 @@ +import { app, Tray, Menu } from "electron"; +import * as path from "path"; +import { showAboutWindow } from "electron-util"; + +import * as autoUpdater from "./auto-updater"; +import * as log from "./log"; +import { getWindow } from "./window"; + +let tray: Tray | undefined; + +const assetsDirectory = path.join(__dirname, "..", "assets"); + +export function getTray() { + return tray; +} + +export function createTray() { + tray = new Tray(path.join(assetsDirectory, "icons", "logo.png")); + + const trayContextMenu = Menu.buildFromTemplate([ + { + id: "open", + label: "Open / Close", + click() { + const mainWindow = getWindow(); + if (!mainWindow) { + throw new Error("Main window not found"); + } + + if (mainWindow.isVisible()) { + mainWindow.hide(); + } else { + mainWindow.show(); + } + }, + }, + { + label: "Check for updates", + async click() { + await autoUpdater.manualRequestUpdateCheck(); + }, + }, + { + label: "Open Logs", + click() { + log.openLog(); + }, + }, + { + label: "About", + click() { + showAboutWindow({ + icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), + copyright: "Copyright © WorkAdventure", + }); + }, + }, + { + label: "Quit", + click() { + app.isQuiting = true; + app.confirmedExitPrompt = true; + app.quit(); + }, + }, + ]); + + tray.setContextMenu(trayContextMenu); + + tray.on("double-click", () => { + const mainWindow = getWindow(); + if (!mainWindow) { + throw new Error("Main window not found"); + } + + mainWindow.show(); + }); + + return tray; +} diff --git a/desktop/src/update-auto-launch.ts b/desktop/src/update-auto-launch.ts new file mode 100644 index 00000000..d25c29aa --- /dev/null +++ b/desktop/src/update-auto-launch.ts @@ -0,0 +1,41 @@ +import AutoLaunch from "auto-launch"; +import * as isDev from "electron-is-dev"; +import { app } from "electron"; + +import settings from "./settings"; + +export default async () => { + let isAutoLaunchEnabled = settings.get("auto_launch_enabled"); + + // set default to enabled + if (isAutoLaunchEnabled === null) { + settings.set("auto_launch_enabled", true); + isAutoLaunchEnabled = true; + } + + // Don't run this in development + if (isDev) { + return; + } + + // `setLoginItemSettings` doesn't support linux + if (process.platform === "linux") { + const autoLauncher = new AutoLaunch({ + name: "WorkAdventure", + isHidden: true, + }); + + if (isAutoLaunchEnabled) { + await autoLauncher.enable(); + } else { + await autoLauncher.disable(); + } + + return; + } + + app.setLoginItemSettings({ + openAtLogin: isAutoLaunchEnabled, + openAsHidden: true, + }); +}; diff --git a/desktop/src/window.ts b/desktop/src/window.ts new file mode 100644 index 00000000..1d365dd4 --- /dev/null +++ b/desktop/src/window.ts @@ -0,0 +1,81 @@ +import { BrowserWindow } from "electron"; +import windowStateKeeper from "electron-window-state"; +import { getTray } from "./tray"; + +let mainWindow: BrowserWindow | undefined; + +const url = process.env.PLAY_URL; // TODO + +export function getWindow() { + return mainWindow; +} + +export function createWindow() { + // do not re-create window if still existing + if (mainWindow) { + return; + } + + // Load the previous state with fallback to defaults + const windowState = windowStateKeeper({ + defaultWidth: 1000, + defaultHeight: 800, + maximize: true, + }); + + mainWindow = new BrowserWindow({ + x: windowState.x, + y: windowState.y, + width: windowState.width, + height: windowState.height, + autoHideMenuBar: true, + show: false, + title: "WorkAdventure", + webPreferences: { + // allowRunningInsecureContent: false, + // contextIsolation: true, // TODO: remove in electron 12 + // nodeIntegration: false, + // sandbox: true, + }, + }); + + // Let us register listeners on the window, so we can update the state + // automatically (the listeners will be removed when the window is closed) + // and restore the maximized or full screen state + windowState.manage(mainWindow); + + mainWindow.on("show", () => { + // TODO + }); + + mainWindow.on("closed", () => { + mainWindow = undefined; + }); + + mainWindow.once("ready-to-show", () => { + mainWindow?.show(); + }); + + // mainWindow.on('close', async (event) => { + // if (!app.confirmedExitPrompt) { + // event.preventDefault(); // Prevents the window from closing + // const choice = await dialog.showMessageBox(getMainWindow(), { + // type: 'question', + // buttons: ['Yes', 'Abort'], + // title: 'Confirm', + // message: 'Are you sure you want to quit?', + // }); + // if (choice.response === 0) { + // app.confirmedExitPrompt = true; + // mainWindow.close(); + // } + // } else { + // app.confirmedExitPrompt = false; + // } + // }); + // and load the index.html of the app. + + if (url) { + mainWindow.loadURL(url); // TODO: load app on demand + } +} diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json new file mode 100644 index 00000000..6972715f --- /dev/null +++ b/desktop/tsconfig.json @@ -0,0 +1,72 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "downlevelIteration": true, + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + "noImplicitThis": false, /* Raise error on 'this' expressions with an implied 'any' type. */ // Disabled because of sifrr server that is monkey patching HttpResponse + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "baseUrl": ".", /* Base directory to resolve non-absolute module names. */ + "paths": { + "_Controller/*": ["src/Controller/*"], + "_Model/*": ["src/Model/*"], + "_Enum/*": ["src/Enum/*"] + }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/desktop/yarn.lock b/desktop/yarn.lock new file mode 100644 index 00000000..c7540652 --- /dev/null +++ b/desktop/yarn.lock @@ -0,0 +1,3212 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"@babel/code-frame@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@electron/get@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.1.tgz#42a0aa62fd1189638bd966e23effaebb16108368" + integrity sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + global-tunnel-ng "^2.7.1" + +"@electron/universal@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37" + integrity sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.0.3" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/auto-launch@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/auto-launch/-/auto-launch-5.0.2.tgz#4970f01e5dd27572489b7fe77590204a19f86bd0" + integrity sha512-b03X09+GCM9t6AUECpwA2gUPYs8s5tJHFJw92sK8EiJ7G4QNbsHmXV7nfCfP6G6ivtm230vi4oNfe8AzRgzxMQ== + +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/jasmine@^3.5.10": + version "3.10.3" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.10.3.tgz#a89798b3d5a8bd23ca56e855a9aee3e5a93bdaaa" + integrity sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g== + +"@types/json-schema@^7.0.3": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" + integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== + +"@types/node@^14.6.2": + version "14.18.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24" + integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A== + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/semver@^7.3.6": + version "7.3.9" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + +"@types/verror@^1.10.3": + version "1.10.5" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" + integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw== + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^17.0.1": + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.8.tgz#d23a3476fd3da8a0ea44b5494ca7fa677b9dad4c" + integrity sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^2.26.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^2.26.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +acorn-jsx@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e" + integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw== + +app-builder-lib@22.14.13: + version "22.14.13" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.14.13.tgz#c1f5b6afc86596357598bb90b69eef06c7c2eeb3" + integrity sha512-SufmrtxU+D0Tn948fjEwAOlCN9757UXLkzzTWXMwZKR/5hisvgqeeBepWfphMIE6OkDGz0fbzEhL1P2Pty4XMg== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.0.5" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "22.14.13" + builder-util-runtime "8.9.2" + chromium-pickle-js "^0.2.0" + debug "^4.3.2" + ejs "^3.1.6" + electron-osx-sign "^0.5.0" + electron-publish "22.14.13" + form-data "^4.0.0" + fs-extra "^10.0.0" + hosted-git-info "^4.0.2" + is-ci "^3.0.0" + isbinaryfile "^4.0.8" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.0.4" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.5" + temp-file "^3.4.0" + +applescript@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/applescript/-/applescript-1.0.0.tgz#bb87af568cad034a4e48c4bdaf6067a3a2701317" + integrity sha1-u4evVoytA0pOSMS9r2Bno6JwExc= + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asar@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +auto-launch@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/auto-launch/-/auto-launch-5.0.5.tgz#d14bd002b1ef642f85e991a6195ff5300c8ad3c0" + integrity sha512-ppdF4mihhYzMYLuCcx9H/c5TUOCev8uM7en53zWVQhyYAJrurd2bFZx3qQVeJKF2jrc7rsPRNN5cD+i23l6PdA== + dependencies: + applescript "^1.0.0" + mkdirp "^0.5.1" + path-is-absolute "^1.0.0" + untildify "^3.0.2" + winreg "1.2.4" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.1.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builder-util-runtime@8.9.2: + version "8.9.2" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28" + integrity sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + +builder-util@22.14.13: + version "22.14.13" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.14.13.tgz#41b5b7b4ee53aff4e09cc007fb144522598f3ce6" + integrity sha512-oePC/qrrUuerhmH5iaCJzPRAKlSBylrhzuAJmRQClTyWnZUv6jbaHh+VoHMbEiE661wrj2S2aV7/bQh12cj1OA== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "3.7.1" + bluebird-lst "^1.0.9" + builder-util-runtime "8.9.2" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.2" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +bundle-require@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-3.0.4.tgz#2b52ba77d99c0a586b5854cd21d36954e63cc110" + integrity sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A== + dependencies: + load-tsconfig "^0.2.0" + +cac@^6.7.12: + version "6.7.12" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.12.tgz#6fb5ea2ff50bd01490dbda497f4ae75a99415193" + integrity sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.1, 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== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dmg-builder@22.14.13: + version "22.14.13" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.14.13.tgz#cc613f3c18e889b8777d525991fd52f50a564f8c" + integrity sha512-xNOugB6AbIRETeU2uID15sUfjdZZcKdxK8xkFnwIggsM00PJ12JxpLNPTjcRoUnfwj3WrPjilrO64vRMwNItQg== + dependencies: + app-builder-lib "22.14.13" + builder-util "22.14.13" + builder-util-runtime "8.9.2" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.9" + +dmg-license@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.10.tgz#89f52afae25d827fce8d818c13aff30af1c16bcc" + integrity sha512-SVeeyiOeinV5JCPHXMdKOgK1YVbak/4+8WL2rBnfqRYpA5FaeFaQnQWb25x628am1w70CbipGDv9S51biph63A== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +electron-builder@^22.14.13: + version "22.14.13" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.14.13.tgz#fd40564685cf5422a8f8d667940af3d3776f4fb8" + integrity sha512-3fgLxqF2TXVKiUPeg74O4V3l0l3j7ERLazo8sUbRkApw0+4iVAf2BJkHsHMaXiigsgCoEzK/F4/rB5rne/VAnw== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "22.14.13" + builder-util "22.14.13" + builder-util-runtime "8.9.2" + chalk "^4.1.1" + dmg-builder "22.14.13" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + update-notifier "^5.1.0" + yargs "^17.0.1" + +electron-is-dev@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" + integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== + +electron-is-dev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-2.0.0.tgz#833487a069b8dad21425c67a19847d9064ab19bd" + integrity sha512-3X99K852Yoqu9AcW50qz3ibYBWY79/pBhlMCab8ToEWS48R0T9tyxRiQhwylE7zQdXrMnx2JKqUJyMPmt5FBqA== + +electron-log@^4.4.6: + version "4.4.6" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-4.4.6.tgz#e7824fc725370384f6edaaac0480c423e570dc69" + integrity sha512-nirYgRdY+F+vclr8ijdwy2vW03IzFpDHTaKNWu76dEN21Y76+smcES5knS7cgHUUB0qNLOi8vZO36taakjbSXA== + +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" + integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@22.14.13: + version "22.14.13" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.14.13.tgz#8b71e6975af8cc6ac5b21f293ade23f8704047c7" + integrity sha512-0oP3QiNj3e8ewOaEpEJV/o6Zrmy2VarVvZ/bH7kyO/S/aJf9x8vQsKVWpsdmSiZ5DJEHgarFIXrnO0ZQf0P9iQ== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "22.14.13" + builder-util-runtime "8.9.2" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron-settings@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/electron-settings/-/electron-settings-4.0.2.tgz#26ef242397393e0e69119f6fb879fc2287d0f508" + integrity sha512-WnUlrnBsO784oXcag0ym+A3ySoIwonz5GhYFsWroMHVzslzmsP+81f/Fof41T9UrRUxuPPKiZPZMwGO+yvWChg== + dependencies: + lodash.get "^4.4.2" + lodash.has "^4.5.2" + lodash.set "^4.3.2" + lodash.unset "^4.5.2" + mkdirp "^1.0.4" + write-file-atomic "^3.0.3" + +electron-updater@^4.6.5: + version "4.6.5" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.5.tgz#e9a75458bbfd6bb41a58a829839e150ad2eb2d3d" + integrity sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA== + dependencies: + "@types/semver" "^7.3.6" + builder-util-runtime "8.9.2" + fs-extra "^10.0.0" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + lodash.escaperegexp "^4.1.2" + lodash.isequal "^4.5.0" + semver "^7.3.5" + +electron-util@^0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/electron-util/-/electron-util-0.17.2.tgz#6b0fe798ae0154585e7e0e96a707bfeae592be05" + integrity sha512-4Kg/aZxJ2BZklgyfH86px/D2GyROPyIcnAZar+7KiNmKI2I5l09pwQTP7V95zM3FVhgDQwV9iuJta5dyEvuWAw== + dependencies: + electron-is-dev "^1.1.0" + new-github-issue-url "^0.2.1" + +electron-window-state@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-5.0.3.tgz#4f36d09e3f953d87aff103bf010f460056050aa8" + integrity sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg== + dependencies: + jsonfile "^4.0.0" + mkdirp "^0.5.1" + +electron@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-17.0.1.tgz#e6c7ad2be26e7be8a5a9bac16b21920ad2671224" + integrity sha512-CBReR/QEOpgwMdt59lWCtj9wC8oHB6aAjMF1lhXcGew132xtp+C5N6EaXb/fmDceVYLouziYjbNcpeXsWrqdpA== + dependencies: + "@electron/get" "^1.13.0" + "@types/node" "^14.6.2" + extract-zip "^1.0.3" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +esbuild-android-arm64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz#fb051169a63307d958aec85ad596cfc7d7770303" + integrity sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ== + +esbuild-darwin-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz#615ea0a9de67b57a293a7128d7ac83ee307a856d" + integrity sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw== + +esbuild-darwin-arm64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz#82054dcfcecb15ccfd237093b8008e7745a99ad9" + integrity sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw== + +esbuild-freebsd-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz#778a818c5b078d5cdd6bb6c0e0797217d196999b" + integrity sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A== + +esbuild-freebsd-arm64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz#18da93b9f3db2e036f72383bfe73b28b73bb332c" + integrity sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ== + +esbuild-linux-32@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz#d0d5d9f5bb3536e17ac097e9512019c65b7c0234" + integrity sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg== + +esbuild-linux-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz#2773d540971999ea7f38107ef92fca753f6a8c30" + integrity sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg== + +esbuild-linux-arm64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz#5d4480ce6d6bffab1dd76a23158f5a5ab33e7ba4" + integrity sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A== + +esbuild-linux-arm@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz#c6391b3f7c8fa6d3b99a7e893ce0f45f3a921eef" + integrity sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g== + +esbuild-linux-mips64le@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz#2c8dabac355c502e86c38f9f292b3517d8e181f3" + integrity sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ== + +esbuild-linux-ppc64le@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz#69d71b2820d5c94306072dac6094bae38e77d1c0" + integrity sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng== + +esbuild-linux-riscv64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz#c0ec0fc3a23624deebf657781550d2329cec4213" + integrity sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ== + +esbuild-linux-s390x@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz#ec2af4572d63336cfb27f5a5c851fb1b6617dd91" + integrity sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw== + +esbuild-netbsd-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz#0e283278e9fdbaa7f0930f93ee113d7759cd865e" + integrity sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA== + +esbuild-openbsd-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz#2a73bba04e16d8ef278fbe2be85248e12a2f2cc2" + integrity sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA== + +esbuild-sunos-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz#8fe03513b8b2e682a6d79d5e3ca5849651a3c1d8" + integrity sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g== + +esbuild-windows-32@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz#a75df61e3e49df292a1842be8e877a3153ee644f" + integrity sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg== + +esbuild-windows-64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz#d06cf8bbe4945b8bf95a730d871e54a22f635941" + integrity sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw== + +esbuild-windows-arm64@0.14.22: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz#f8b1b05c548073be8413a5ecb12d7c2f6e717227" + integrity sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg== + +esbuild@^0.14.2: + version "0.14.22" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.22.tgz#2b55fde89d7aa5aaaad791816d58ff9dfc5ed085" + integrity sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA== + optionalDependencies: + esbuild-android-arm64 "0.14.22" + esbuild-darwin-64 "0.14.22" + esbuild-darwin-arm64 "0.14.22" + esbuild-freebsd-64 "0.14.22" + esbuild-freebsd-arm64 "0.14.22" + esbuild-linux-32 "0.14.22" + esbuild-linux-64 "0.14.22" + esbuild-linux-arm "0.14.22" + esbuild-linux-arm64 "0.14.22" + esbuild-linux-mips64le "0.14.22" + esbuild-linux-ppc64le "0.14.22" + esbuild-linux-riscv64 "0.14.22" + esbuild-linux-s390x "0.14.22" + esbuild-netbsd-64 "0.14.22" + esbuild-openbsd-64 "0.14.22" + esbuild-sunos-64 "0.14.22" + esbuild-windows-32 "0.14.22" + esbuild-windows-64 "0.14.22" + esbuild-windows-arm64 "0.14.22" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@^1.0.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.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== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globalthis@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.3: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +hosted-git-info@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jasmine-core@~3.99.0: + version "3.99.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.99.0.tgz#99a3da0d38ba2de82614d9198b7b1bc1c32a5960" + integrity sha512-+ZDaJlEfRopINQqgE+hvzRyDIQDeKfqqTvF8RzXsvU1yE3pBDRud2+Qfh9WvGgRpuzqxyQJVI6Amy5XQ11r/3w== + +jasmine@^3.5.0: + version "3.99.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.99.0.tgz#7cc7aeda7ade2d57694fc818a374f778cbb4ea62" + integrity sha512-YIThBuHzaIIcjxeuLmPD40SjxkEcc8i//sGMDKCgkRMVgIwRJf5qyExtlJpQeh7pkeoBSOe6lQEdg+/9uKg9mw== + dependencies: + glob "^7.1.6" + jasmine-core "~3.99.0" + +joycon@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lilconfig@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-tsconfig@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.3.tgz#08af3e7744943caab0c75f8af7f1703639c3ef1f" + integrity sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ== + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + +lodash.unset@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.unset/-/lodash.unset-4.5.2.tgz#370d1d3e85b72a7e1b0cdf2d272121306f23e4ed" + integrity sha1-Nw0dPoW3Kn4bDN8tJyEhMG8j5O0= + +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1, mkdirp@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +new-github-issue-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz#e17be1f665a92de465926603e44b9f8685630c1d" + integrity sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^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" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pirates@^4.0.1: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +plist@^3.0.1, plist@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.4.tgz#a62df837e3aed2bb3b735899d510c4f186019cbe" + integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + +postcss-load-config@^3.0.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.3.tgz#21935b2c43b9a86e6581a576ca7ee1bde2bd1d23" + integrity sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw== + dependencies: + lilconfig "^2.0.4" + yaml "^1.10.2" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== + dependencies: + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +rollup@^2.60.0: + version "2.67.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.67.2.tgz#d95e15f60932ad21e05a870bd0aa0b235d056f04" + integrity sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw== + optionalDependencies: + fsevents "~2.3.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +source-map-support@^0.5.19: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +sucrase@^3.20.3: + version "3.20.3" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.20.3.tgz#424f1e75b77f955724b06060f1ae708f5f0935cf" + integrity sha512-azqwq0/Bs6RzLAdb4dXxsCgMtAaD2hzmUr4UhSfsxO46JFPAwMnnb441B/qsudZiS6Ylea3JXZe3Q497lsgXzQ== + dependencies: + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsup@^5.11.13: + version "5.11.13" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-5.11.13.tgz#dd9b375513a07c1c84620b22d4164e4293d6a2bb" + integrity sha512-NVMK01gVmojZn7+iZwxRK1CzW2BIabaVMyEjs7Nm9lm4DrSf7IAqs2F3fg0vT7rH72x1cIBsW9U/TlWrCvHVQQ== + dependencies: + bundle-require "^3.0.2" + cac "^6.7.12" + chokidar "^3.5.1" + debug "^4.3.1" + esbuild "^0.14.2" + execa "^5.0.0" + globby "^11.0.3" + joycon "^3.0.1" + postcss-load-config "^3.0.1" + resolve-from "^5.0.0" + rollup "^2.60.0" + source-map "^0.7.3" + sucrase "^3.20.3" + tree-kill "^1.2.2" + +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.8.3: + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +untildify@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +winreg@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" + integrity sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs= + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +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== + +xmlbuilder@>=11.0.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@^17.0.1: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" From a11d19a457ddf08b12474099101598bf2301c134 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Thu, 17 Feb 2022 19:48:08 +0100 Subject: [PATCH 003/116] add ipc and test app --- desktop/package.json | 2 +- desktop/src/app.ts | 17 +++++++++++------ desktop/src/auto-updater.ts | 6 +++++- desktop/src/ipc.ts | 18 ++++++++++++++++++ desktop/src/preload/index.ts | 8 ++++++++ desktop/src/window.ts | 14 ++++++++++---- desktop/test-app/index.html | 13 +++++++++++++ desktop/test-app/web.js | 25 +++++++++++++++++++++++++ 8 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 desktop/src/ipc.ts create mode 100644 desktop/src/preload/index.ts create mode 100644 desktop/test-app/index.html create mode 100644 desktop/test-app/web.js diff --git a/desktop/package.json b/desktop/package.json index 95e3e8b9..44783828 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -6,7 +6,7 @@ "license": "SEE LICENSE IN LICENSE.txt", "scripts": { "tsc": "tsup-node ./src/main.ts", - "dev": "tsup-node ./src/main.ts --watch --onSuccess 'yarn electron dist/main.js'", + "dev": "tsup-node ./src/main.ts ./src/preload/index.ts --watch --onSuccess 'yarn electron dist/main.js'", "prod": "tsc && node --max-old-space-size=4096 ./dist/server.js", "runprod": "node --max-old-space-size=4096 ./dist/server.js", "profile": "tsc && node --prof ./dist/server.js", diff --git a/desktop/src/app.ts b/desktop/src/app.ts index 3c962aba..0a278f52 100644 --- a/desktop/src/app.ts +++ b/desktop/src/app.ts @@ -1,9 +1,10 @@ -import { app, BrowserWindow } from "electron"; +import { app, BrowserWindow, globalShortcut } from "electron"; import { createWindow, getWindow } from "./window"; import { createTray } from "./tray"; -// import * as autoUpdater from "./auto-updater"; +import autoUpdater from "./auto-updater"; import updateAutoLaunch from "./update-auto-launch"; +import ipc, { emitMutedKeyPress } from "./ipc"; function init() { const appLock = app.requestSingleInstanceLock(); @@ -32,14 +33,11 @@ function init() { // This method will be called when Electron has finished loading app.on("ready", () => { - // autoUpdater.init(); + autoUpdater.init(); // enable auto launch updateAutoLaunch(); - // load ipc handler - // ipc(); - // Don't show the app in the doc // if (app.dock) { // app.dock.hide(); @@ -47,6 +45,13 @@ function init() { createWindow(); createTray(); + + // load ipc handler + ipc(); + + globalShortcut.register("Alt+CommandOrControl+M", () => { + emitMutedKeyPress(); + }); }); // Quit when all windows are closed. diff --git a/desktop/src/auto-updater.ts b/desktop/src/auto-updater.ts index 7a48a334..e796e808 100644 --- a/desktop/src/auto-updater.ts +++ b/desktop/src/auto-updater.ts @@ -38,7 +38,7 @@ export async function manualRequestUpdateCheck() { isManualRequestedUpdate = false; } -export function init() { +function init() { autoUpdater.logger = log; autoUpdater.on("update-downloaded", ({ releaseNotes, releaseName }) => { @@ -92,3 +92,7 @@ export function init() { // run update check every hour again setInterval(() => checkForUpdates, 1000 * 60 * 1); } + +export default { + init, +}; diff --git a/desktop/src/ipc.ts b/desktop/src/ipc.ts new file mode 100644 index 00000000..7d6dc95d --- /dev/null +++ b/desktop/src/ipc.ts @@ -0,0 +1,18 @@ +import { ipcMain } from "electron"; +import { createAndShowNotification } from "./notification"; +import { getWindow } from "./window"; + +export function emitMutedKeyPress() { + const mainWindow = getWindow(); + if (!mainWindow) { + throw new Error("Main window not found"); + } + + mainWindow.webContents.send("on-muted-key-press"); +} + +export default () => { + ipcMain.on("notify", (event, txt) => { + createAndShowNotification({ body: txt }); + }); +}; diff --git a/desktop/src/preload/index.ts b/desktop/src/preload/index.ts new file mode 100644 index 00000000..e1381cb8 --- /dev/null +++ b/desktop/src/preload/index.ts @@ -0,0 +1,8 @@ +import { contextBridge, ipcRenderer, IpcRendererEvent } from "electron"; + +contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", { + desktop: true, + notify: (txt: string) => ipcRenderer.send("notify", txt), + onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => + ipcRenderer.on("on-muted-key-press", callback), +}); diff --git a/desktop/src/window.ts b/desktop/src/window.ts index 1d365dd4..a8f8babf 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -1,10 +1,12 @@ import { BrowserWindow } from "electron"; +import electronIsDev from "electron-is-dev"; import windowStateKeeper from "electron-window-state"; -import { getTray } from "./tray"; +import path from "path"; let mainWindow: BrowserWindow | undefined; -const url = process.env.PLAY_URL; // TODO +const url = process.env.PLAY_URL; +// "https://play.staging.workadventu.re/@/tcm/workadventure/wa-village"; // TODO export function getWindow() { return mainWindow; @@ -32,6 +34,7 @@ export function createWindow() { show: false, title: "WorkAdventure", webPreferences: { + preload: path.join(__dirname, "../dist/preload/index.js"), // allowRunningInsecureContent: false, // contextIsolation: true, // TODO: remove in electron 12 // nodeIntegration: false, @@ -73,9 +76,12 @@ export function createWindow() { // app.confirmedExitPrompt = false; // } // }); - // and load the index.html of the app. - if (url) { + if (!url || electronIsDev) { + // TODO + mainWindow.loadFile("../test-app/index.html"); + mainWindow.webContents.openDevTools(); + } else { mainWindow.loadURL(url); // TODO: load app on demand } } diff --git a/desktop/test-app/index.html b/desktop/test-app/index.html new file mode 100644 index 00000000..4ce24a29 --- /dev/null +++ b/desktop/test-app/index.html @@ -0,0 +1,13 @@ + + + + + WorkAdventure Desktop Demo + + +
Hello World!
+ + + + + \ No newline at end of file diff --git a/desktop/test-app/web.js b/desktop/test-app/web.js new file mode 100644 index 00000000..8495a393 --- /dev/null +++ b/desktop/test-app/web.js @@ -0,0 +1,25 @@ +let muted = false; + +if (window?.WorkAdventureDesktopApi?.desktop) { + document.getElementById("demo").innerHTML = + "Hello Desktop app! Press ctrl-alt-m to mute."; + + window?.WorkAdventureDesktopApi?.onMutedKeyPress((event) => { + if (muted) { + document.getElementById("demo").innerHTML = + "Ready to speak! Press ctrl-alt-m to mute."; + } else { + document.getElementById("demo").innerHTML = + "Muted! Press ctrl-alt-m to unmute again."; + } + muted = !muted; + }); +} + +document.getElementById("btn-reload").onclick = () => { + location.reload(); +}; + +document.getElementById("btn-api").onclick = () => { + window.WorkAdventureDesktopApi.notify("Hello from website"); +}; From c891fcb1bd202005352b7d53282e0c904223c507 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 01:51:35 +0100 Subject: [PATCH 004/116] add sidebar --- desktop/package.json | 2 +- desktop/sidebar/index.html | 59 +++++++++++++++++ desktop/sidebar/index.js | 34 ++++++++++ .../src/{preload/index.ts => app/preload.ts} | 4 +- desktop/src/ipc.ts | 58 +++++++++++++++- desktop/src/log.ts | 9 +-- desktop/src/settings.ts | 7 ++ desktop/src/sidebar/preload.ts | 10 +++ desktop/src/tray.ts | 2 +- desktop/src/window.ts | 66 ++++++++++++------- desktop/test-app/index.html | 13 ---- desktop/test-app/web.js | 25 ------- 12 files changed, 211 insertions(+), 78 deletions(-) create mode 100644 desktop/sidebar/index.html create mode 100644 desktop/sidebar/index.js rename desktop/src/{preload/index.ts => app/preload.ts} (65%) create mode 100644 desktop/src/sidebar/preload.ts delete mode 100644 desktop/test-app/index.html delete mode 100644 desktop/test-app/web.js diff --git a/desktop/package.json b/desktop/package.json index 44783828..a3b929db 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -6,7 +6,7 @@ "license": "SEE LICENSE IN LICENSE.txt", "scripts": { "tsc": "tsup-node ./src/main.ts", - "dev": "tsup-node ./src/main.ts ./src/preload/index.ts --watch --onSuccess 'yarn electron dist/main.js'", + "dev": "tsup-node ./src/main.ts ./src/sidebar/preload.ts ./src/app/preload.js --watch --onSuccess 'yarn electron dist/main.js'", "prod": "tsc && node --max-old-space-size=4096 ./dist/server.js", "runprod": "node --max-old-space-size=4096 ./dist/server.js", "profile": "tsc && node --prof ./dist/server.js", diff --git a/desktop/sidebar/index.html b/desktop/sidebar/index.html new file mode 100644 index 00000000..7621461d --- /dev/null +++ b/desktop/sidebar/index.html @@ -0,0 +1,59 @@ + + + + + WorkAdventure Desktop Demo + + + +
+ + + + \ No newline at end of file diff --git a/desktop/sidebar/index.js b/desktop/sidebar/index.js new file mode 100644 index 00000000..ce9a4334 --- /dev/null +++ b/desktop/sidebar/index.js @@ -0,0 +1,34 @@ +// let muted = false; + +if (window?.WorkAdventureDesktopApi?.desktop) { + (async () => { + const servers = await window.WorkAdventureDesktopApi.getServers(); + servers.forEach((e) => { + const server = document.createElement("div"); + server.innerText = e.name; + server.onclick = () => { + window.WorkAdventureDesktopApi.selectServer(e._id); + }; + document.getElementById("servers").appendChild(server); + }); + })(); +} + +document.getElementById("btn-reload").onclick = () => { + location.reload(); +}; + +// window?.WorkAdventureDesktopApi?.onMutedKeyPress((event) => { +// if (muted) { +// document.getElementById("demo").innerHTML = +// "Ready to speak! Press ctrl-alt-m to mute."; +// } else { +// document.getElementById("demo").innerHTML = +// "Muted! Press ctrl-alt-m to unmute again."; +// } +// muted = !muted; +// }); + +// document.getElementById("btn-api").onclick = () => { +// window.WorkAdventureDesktopApi.notify("Hello from website"); +// }; diff --git a/desktop/src/preload/index.ts b/desktop/src/app/preload.ts similarity index 65% rename from desktop/src/preload/index.ts rename to desktop/src/app/preload.ts index e1381cb8..74bcb048 100644 --- a/desktop/src/preload/index.ts +++ b/desktop/src/app/preload.ts @@ -2,7 +2,7 @@ import { contextBridge, ipcRenderer, IpcRendererEvent } from "electron"; contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", { desktop: true, - notify: (txt: string) => ipcRenderer.send("notify", txt), + notify: (txt: string) => ipcRenderer.send("app:notify", txt), onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => - ipcRenderer.on("on-muted-key-press", callback), + ipcRenderer.on("app:on-muted-key-press", callback), }); diff --git a/desktop/src/ipc.ts b/desktop/src/ipc.ts index 7d6dc95d..cedc0084 100644 --- a/desktop/src/ipc.ts +++ b/desktop/src/ipc.ts @@ -1,6 +1,7 @@ import { ipcMain } from "electron"; import { createAndShowNotification } from "./notification"; -import { getWindow } from "./window"; +import settings from "./settings"; +import { getAppView, getWindow } from "./window"; export function emitMutedKeyPress() { const mainWindow = getWindow(); @@ -8,11 +9,62 @@ export function emitMutedKeyPress() { throw new Error("Main window not found"); } - mainWindow.webContents.send("on-muted-key-press"); + mainWindow.webContents.send("app:on-muted-key-press"); } export default () => { - ipcMain.on("notify", (event, txt) => { + ipcMain.on("app:notify", (event, txt) => { createAndShowNotification({ body: txt }); }); + + ipcMain.handle("sidebar:getServers", () => { + // TODO: remove + if (!settings.get("servers")) { + settings.set("servers", [ + { + _id: "1", + name: "WA Demo", + url: "https://play.staging.workadventu.re/@/tcm/workadventure/wa-village", + }, + { + _id: "2", + name: "My Server", + url: "http://play.workadventure.localhost/", + }, + ]); + } + + return settings.get("servers", []); + }); + + ipcMain.handle("sidebar:selectServer", (event, serverId: string) => { + const appView = getAppView(); + if (!appView) { + throw new Error("App view not found"); + } + + const servers = settings.get("servers", []); + const selectedServer = servers.find((s) => s._id === serverId); + + if (!selectedServer) { + return new Error("Server not found"); + } + + appView.webContents.loadURL(selectedServer.url); + return true; + }); + + ipcMain.handle( + "sidebar:addServer", + (event, serverName: string, serverUrl: string) => { + const servers = settings.get("servers", []); + servers.push({ + _id: `${servers.length + 1}`, + name: serverName, + url: serverUrl, + }); + settings.set("servers", servers); + return true; + } + ); }; diff --git a/desktop/src/log.ts b/desktop/src/log.ts index 5378115d..5fab521f 100644 --- a/desktop/src/log.ts +++ b/desktop/src/log.ts @@ -1,5 +1,4 @@ import { dialog, shell } from "electron"; -import electronIsDev from "electron-is-dev"; import log from "electron-log"; import settings from "./settings"; @@ -40,18 +39,12 @@ function onRejection(reason: Error) { function init() { const logLevel = settings.get("log_level", "info"); - log.transports.file.level = logLevel; log.transports.console.level = logLevel; + log.transports.file.level = logLevel; // eslint-disable-next-line no-console console.log = log.log.bind(log); - if (!electronIsDev) { - log.transports.file.fileName = "work-adventure.log"; - } else { - console.log("Log file is disabled in dev. Using console output instead."); - } - process.on("uncaughtException", onError); process.on("unhandledRejection", onRejection); } diff --git a/desktop/src/settings.ts b/desktop/src/settings.ts index c19a9979..fb61621c 100644 --- a/desktop/src/settings.ts +++ b/desktop/src/settings.ts @@ -1,9 +1,16 @@ import ElectronLog from "electron-log"; import Settings from "electron-settings"; +type Server = { + _id: string; + name: string; + url: string; +}; + type SettingsData = { log_level: ElectronLog.LogLevel; auto_launch_enabled: boolean; + servers: Server[]; }; let settings: SettingsData; diff --git a/desktop/src/sidebar/preload.ts b/desktop/src/sidebar/preload.ts new file mode 100644 index 00000000..71ba33ed --- /dev/null +++ b/desktop/src/sidebar/preload.ts @@ -0,0 +1,10 @@ +import { contextBridge, ipcRenderer } from "electron"; + +contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", { + desktop: true, + getServers: () => ipcRenderer.invoke("sidebar:getServers"), + selectServer: (serverId: string) => + ipcRenderer.invoke("sidebar:selectServer", serverId), + addServer: (serverName: string, serverUrl: string) => + ipcRenderer.invoke("sidebar:addServer", serverName, serverUrl), +}); diff --git a/desktop/src/tray.ts b/desktop/src/tray.ts index 9396e438..984cdc5b 100644 --- a/desktop/src/tray.ts +++ b/desktop/src/tray.ts @@ -20,7 +20,7 @@ export function createTray() { const trayContextMenu = Menu.buildFromTemplate([ { id: "open", - label: "Open / Close", + label: "Show / Hide", click() { const mainWindow = getWindow(); if (!mainWindow) { diff --git a/desktop/src/window.ts b/desktop/src/window.ts index a8f8babf..7bdb3262 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -1,17 +1,20 @@ -import { BrowserWindow } from "electron"; -import electronIsDev from "electron-is-dev"; +import { BrowserView, BrowserWindow } from "electron"; import windowStateKeeper from "electron-window-state"; import path from "path"; let mainWindow: BrowserWindow | undefined; +let appView: BrowserView | undefined; -const url = process.env.PLAY_URL; -// "https://play.staging.workadventu.re/@/tcm/workadventure/wa-village"; // TODO +const sidebarWidth = 70; export function getWindow() { return mainWindow; } +export function getAppView() { + return appView; +} + export function createWindow() { // do not re-create window if still existing if (mainWindow) { @@ -32,13 +35,8 @@ export function createWindow() { height: windowState.height, autoHideMenuBar: true, show: false, - title: "WorkAdventure", webPreferences: { - preload: path.join(__dirname, "../dist/preload/index.js"), - // allowRunningInsecureContent: false, - // contextIsolation: true, // TODO: remove in electron 12 - // nodeIntegration: false, - // sandbox: true, + preload: path.join(__dirname, "../dist/sidebar/preload.js"), }, }); @@ -47,18 +45,10 @@ export function createWindow() { // and restore the maximized or full screen state windowState.manage(mainWindow); - mainWindow.on("show", () => { - // TODO - }); - mainWindow.on("closed", () => { mainWindow = undefined; }); - mainWindow.once("ready-to-show", () => { - mainWindow?.show(); - }); - // mainWindow.on('close', async (event) => { // if (!app.confirmedExitPrompt) { // event.preventDefault(); // Prevents the window from closing @@ -77,11 +67,37 @@ export function createWindow() { // } // }); - if (!url || electronIsDev) { - // TODO - mainWindow.loadFile("../test-app/index.html"); - mainWindow.webContents.openDevTools(); - } else { - mainWindow.loadURL(url); // TODO: load app on demand - } + appView = new BrowserView({ + webPreferences: { + preload: path.join(__dirname, "../dist/app/index.js"), + }, + }); + mainWindow.setBrowserView(appView); + appView.setBounds({ + x: sidebarWidth, + y: 0, + width: mainWindow.getBounds().width - sidebarWidth, + height: mainWindow.getBounds().height, + }); + appView.setAutoResize({ + width: true, + height: true, + }); + + mainWindow.once("ready-to-show", () => { + (async () => { + await appView?.webContents.loadURL("https://workadventu.re/"); // TODO: use some splashscreen ? + // appView.webContents.openDevTools({ + // mode: "detach", + // }); + mainWindow?.show(); + // mainWindow?.webContents.openDevTools({ mode: "detach" }); + })(); + }); + + mainWindow.webContents.on("did-finish-load", () => { + mainWindow?.setTitle("WorkAdventure Desktop"); + }); + + mainWindow.loadFile("../sidebar/index.html"); } diff --git a/desktop/test-app/index.html b/desktop/test-app/index.html deleted file mode 100644 index 4ce24a29..00000000 --- a/desktop/test-app/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - WorkAdventure Desktop Demo - - -
Hello World!
- - - - - \ No newline at end of file diff --git a/desktop/test-app/web.js b/desktop/test-app/web.js deleted file mode 100644 index 8495a393..00000000 --- a/desktop/test-app/web.js +++ /dev/null @@ -1,25 +0,0 @@ -let muted = false; - -if (window?.WorkAdventureDesktopApi?.desktop) { - document.getElementById("demo").innerHTML = - "Hello Desktop app! Press ctrl-alt-m to mute."; - - window?.WorkAdventureDesktopApi?.onMutedKeyPress((event) => { - if (muted) { - document.getElementById("demo").innerHTML = - "Ready to speak! Press ctrl-alt-m to mute."; - } else { - document.getElementById("demo").innerHTML = - "Muted! Press ctrl-alt-m to unmute again."; - } - muted = !muted; - }); -} - -document.getElementById("btn-reload").onclick = () => { - location.reload(); -}; - -document.getElementById("btn-api").onclick = () => { - window.WorkAdventureDesktopApi.notify("Hello from website"); -}; From a86bf32ee20536ac975a244c9316865aed2b78b7 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 10:26:21 +0100 Subject: [PATCH 005/116] extract types for ipc --- desktop/src/app/preload.ts | 7 +++++-- desktop/src/app/types.ts | 7 +++++++ desktop/src/settings.ts | 7 +------ desktop/src/sidebar/preload.ts | 7 +++++-- desktop/src/sidebar/types.ts | 12 ++++++++++++ 5 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 desktop/src/app/types.ts create mode 100644 desktop/src/sidebar/types.ts diff --git a/desktop/src/app/preload.ts b/desktop/src/app/preload.ts index 74bcb048..d406fbed 100644 --- a/desktop/src/app/preload.ts +++ b/desktop/src/app/preload.ts @@ -1,8 +1,11 @@ import { contextBridge, ipcRenderer, IpcRendererEvent } from "electron"; +import type { WorkAdventureDesktopApi } from "./types"; -contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", { +const api: WorkAdventureDesktopApi = { desktop: true, notify: (txt: string) => ipcRenderer.send("app:notify", txt), onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => ipcRenderer.on("app:on-muted-key-press", callback), -}); +}; + +contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/app/types.ts b/desktop/src/app/types.ts new file mode 100644 index 00000000..a76f834f --- /dev/null +++ b/desktop/src/app/types.ts @@ -0,0 +1,7 @@ +import type { IpcRendererEvent } from "electron"; + +export type WorkAdventureDesktopApi = { + desktop: boolean; + notify: (txt: string) => void; + onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => void; +}; diff --git a/desktop/src/settings.ts b/desktop/src/settings.ts index fb61621c..3e923247 100644 --- a/desktop/src/settings.ts +++ b/desktop/src/settings.ts @@ -1,11 +1,6 @@ import ElectronLog from "electron-log"; import Settings from "electron-settings"; - -type Server = { - _id: string; - name: string; - url: string; -}; +import type { Server } from "./sidebar/types"; type SettingsData = { log_level: ElectronLog.LogLevel; diff --git a/desktop/src/sidebar/preload.ts b/desktop/src/sidebar/preload.ts index 71ba33ed..3d159deb 100644 --- a/desktop/src/sidebar/preload.ts +++ b/desktop/src/sidebar/preload.ts @@ -1,10 +1,13 @@ import { contextBridge, ipcRenderer } from "electron"; +import type { WorkAdventureSidebarApi } from "./types"; -contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", { +const api: WorkAdventureSidebarApi = { desktop: true, getServers: () => ipcRenderer.invoke("sidebar:getServers"), selectServer: (serverId: string) => ipcRenderer.invoke("sidebar:selectServer", serverId), addServer: (serverName: string, serverUrl: string) => ipcRenderer.invoke("sidebar:addServer", serverName, serverUrl), -}); +}; + +contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/sidebar/types.ts b/desktop/src/sidebar/types.ts new file mode 100644 index 00000000..79114d1e --- /dev/null +++ b/desktop/src/sidebar/types.ts @@ -0,0 +1,12 @@ +export type Server = { + _id: string; + name: string; + url: string; +}; + +export type WorkAdventureSidebarApi = { + desktop: boolean; + getServers: () => Promise; + selectServer: (serverId: string) => Promise; + addServer: (serverName: string, serverUrl: string) => Promise; +}; From 6e4041560ba84c7e0c42b8f8ca4a54b1445d4d9f Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 10:26:36 +0100 Subject: [PATCH 006/116] add ci --- .github/workflows/continuous_integration.yml | 37 ++++++ desktop/.prettierignore | 1 + desktop/.prettierrc.json | 4 + desktop/package.json | 127 ++++++++++--------- desktop/tests/.gitkeep | 0 desktop/tsconfig.json | 4 +- desktop/yarn.lock | 5 + 7 files changed, 114 insertions(+), 64 deletions(-) create mode 100644 desktop/.prettierignore create mode 100644 desktop/.prettierrc.json create mode 100644 desktop/tests/.gitkeep diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 45bcbfe0..2ef1269b 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -166,3 +166,40 @@ jobs: run: yarn run pretty-check working-directory: "back" + continuous-integration-desktop: + name: "Continuous Integration Desktop" + + runs-on: "ubuntu-latest" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2.0.0" + + - name: "Setup NodeJS" + uses: actions/setup-node@v1 + with: + node-version: '12.x' + + - name: "Install dependencies" + run: yarn install --froze-lockfile + working-directory: "desktop" + + - name: "Build" + run: yarn build + working-directory: "desktop" + + - name: "Typecheck" + run: yarn typecheck + working-directory: "desktop" + + - name: "Lint" + run: yarn lint + working-directory: "desktop" + + - name: "Jasmine" + run: yarn test + working-directory: "desktop" + + - name: "Prettier" + run: yarn pretty-check + working-directory: "desktop" diff --git a/desktop/.prettierignore b/desktop/.prettierignore new file mode 100644 index 00000000..1f453464 --- /dev/null +++ b/desktop/.prettierignore @@ -0,0 +1 @@ +src/Messages/generated diff --git a/desktop/.prettierrc.json b/desktop/.prettierrc.json new file mode 100644 index 00000000..e8980d15 --- /dev/null +++ b/desktop/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "printWidth": 120, + "tabWidth": 4 +} diff --git a/desktop/package.json b/desktop/package.json index a3b929db..457f59de 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,69 +1,70 @@ { - "name": "@workadventure/desktop", - "version": "1.0.0", - "description": "", - "main": "index.js", - "license": "SEE LICENSE IN LICENSE.txt", - "scripts": { - "tsc": "tsup-node ./src/main.ts", - "dev": "tsup-node ./src/main.ts ./src/sidebar/preload.ts ./src/app/preload.js --watch --onSuccess 'yarn electron dist/main.js'", - "prod": "tsc && node --max-old-space-size=4096 ./dist/server.js", - "runprod": "node --max-old-space-size=4096 ./dist/server.js", - "profile": "tsc && node --prof ./dist/server.js", - "test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json", - "lint": "node_modules/.bin/eslint src/ . --ext .ts", - "fix": "node_modules/.bin/eslint --fix src/ . --ext .ts" - }, - "dependencies": { - "auto-launch": "^5.0.5", - "electron-is-dev": "^2.0.0", - "electron-log": "^4.4.6", - "electron-settings": "^4.0.2", - "electron-updater": "^4.6.5", - "electron-util": "^0.17.2", - "electron-window-state": "^5.0.3" - }, - "devDependencies": { - "@types/auto-launch": "^5.0.2", - "@types/jasmine": "^3.5.10", - "@typescript-eslint/eslint-plugin": "^2.26.0", - "@typescript-eslint/parser": "^2.26.0", - "electron": "^17.0.1", - "electron-builder": "^22.14.13", - "eslint": "^6.8.0", - "jasmine": "^3.5.0", - "tsup": "^5.11.13", - "typescript": "^3.8.3" - }, - "build": { - "appId": "re.workadventu.desktop", - "files": [ - "src/**/*", - "assets/**/*" - ], - "dmg": { - "icon": false + "name": "@workadventure/desktop", + "version": "1.0.0", + "description": "", + "main": "index.js", + "license": "SEE LICENSE IN LICENSE.txt", + "scripts": { + "build": "tsup-node ./src/main.ts ./src/sidebar/preload.ts ./src/app/preload.js", + "typecheck": "tsc --noEmit", + "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", + "test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json", + "lint": "yarn eslint src/ . --ext .ts", + "fix": "yarn eslint --fix src/ . --ext .ts", + "pretty": "yarn prettier --write 'src/**/*.{ts,tsx}'", + "pretty-check": "yarn prettier --check 'src/**/*.{ts,tsx}'" }, - "linux": { - "category": "TODO;TODO", - "packageCategory": "TODO;TODO", - "maintainer": "TODO", - "icon": "assets/icons/TODO.icns", - "description": "TODO", - "target": [ - "deb", - "zip", - "AppImage" - ], - "artifactName": "${productName}-${version}-${arch}.${ext}" + "dependencies": { + "auto-launch": "^5.0.5", + "electron-is-dev": "^2.0.0", + "electron-log": "^4.4.6", + "electron-settings": "^4.0.2", + "electron-updater": "^4.6.5", + "electron-util": "^0.17.2", + "electron-window-state": "^5.0.3" }, - "win": { - "icon": "assets/icons/TODO.ico", - "artifactName": "${productName}-${version}-setup.${ext}" + "devDependencies": { + "@types/auto-launch": "^5.0.2", + "@types/jasmine": "^3.5.10", + "@typescript-eslint/eslint-plugin": "^2.26.0", + "@typescript-eslint/parser": "^2.26.0", + "electron": "^17.0.1", + "electron-builder": "^22.14.13", + "eslint": "^6.8.0", + "jasmine": "^3.5.0", + "prettier": "^2.5.1", + "tsup": "^5.11.13", + "typescript": "^3.8.3" }, - "publish": { - "provider": "generic", - "url": "TODO" + "build": { + "appId": "re.workadventu.desktop", + "files": [ + "src/**/*", + "assets/**/*" + ], + "dmg": { + "icon": false + }, + "linux": { + "category": "TODO;TODO", + "packageCategory": "TODO;TODO", + "maintainer": "TODO", + "icon": "assets/icons/TODO.icns", + "description": "TODO", + "target": [ + "deb", + "zip", + "AppImage" + ], + "artifactName": "${productName}-${version}-${arch}.${ext}" + }, + "win": { + "icon": "assets/icons/TODO.ico", + "artifactName": "${productName}-${version}-setup.${ext}" + }, + "publish": { + "provider": "generic", + "url": "TODO" + } } - } } diff --git a/desktop/tests/.gitkeep b/desktop/tests/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index 6972715f..78248218 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -67,6 +67,8 @@ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ /* Advanced Options */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + + "skipLibCheck": true } } diff --git a/desktop/yarn.lock b/desktop/yarn.lock index c7540652..69f9c033 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -2413,6 +2413,11 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" From d64c7f96052db92fdd50d9d8ea23b71b9a59abca Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 10:27:55 +0100 Subject: [PATCH 007/116] update node --- .github/workflows/continuous_integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 2ef1269b..ed0a6333 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -178,7 +178,7 @@ jobs: - name: "Setup NodeJS" uses: actions/setup-node@v1 with: - node-version: '12.x' + node-version: '14.x' - name: "Install dependencies" run: yarn install --froze-lockfile From 1c1d61bd6053491158265d21b74a3874f35a6780 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 11:49:53 +0100 Subject: [PATCH 008/116] add release and electron-builder setup --- .../workflows/build-and-release-desktop.yml | 104 ++++++++++++++++++ desktop/.gitignore | 2 +- desktop/electron-builder.yml | 33 ++++++ desktop/package.json | 41 +------ desktop/tsconfig.json | 2 +- 5 files changed, 145 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/build-and-release-desktop.yml create mode 100644 desktop/electron-builder.yml diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml new file mode 100644 index 00000000..e166c47f --- /dev/null +++ b/.github/workflows/build-and-release-desktop.yml @@ -0,0 +1,104 @@ +name: Build & Release Desktop App + +on: + push: + branches: + - master + - develop + pull_request: + release: + types: [created] + +jobs: + build_on_linux: + runs-on: ubuntu-latest + steps: + - name: "Checkout" + uses: "actions/checkout@v2.0.0" + + - name: "Setup NodeJS" + uses: actions/setup-node@v1 + with: + node-version: '14.x' + + - name: "Install dependencies" + run: yarn install --froze-lockfile + working-directory: "desktop" + + - name: "Build Typescript" + run: yarn build + working-directory: "desktop" + + - name: "Build App" + run: yarn bundle + working-directory: "desktop" + if: ${{ github.event_name != 'release' }} + + - name: "Build & Publish App" + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: yarn release + working-directory: "desktop" + if: ${{ github.event_name == 'release' }} + + build_on_mac: + runs-on: macos-latest + steps: + - name: "Checkout" + uses: "actions/checkout@v2.0.0" + + - name: "Setup NodeJS" + uses: actions/setup-node@v1 + with: + node-version: '14.x' + + - name: "Install dependencies" + run: yarn install --froze-lockfile + working-directory: "desktop" + + - name: "Build Typescript" + run: yarn build + working-directory: "desktop" + + - name: "Build App" + run: yarn bundle + working-directory: "desktop" + if: ${{ github.event_name != 'release' }} + + - name: "Build & Publish App" + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: yarn release + working-directory: "desktop" + if: ${{ github.event_name == 'release' }} + + build_on_win: + runs-on: windows-latest + steps: + - name: "Checkout" + uses: "actions/checkout@v2.0.0" + + - name: "Setup NodeJS" + uses: actions/setup-node@v1 + with: + node-version: '14.x' + + - name: "Install dependencies" + run: yarn install --froze-lockfile + working-directory: "desktop" + + - name: "Build Typescript" + run: yarn build + working-directory: "desktop" + + - name: "Build App" + run: yarn bundle + working-directory: "desktop" + if: ${{ github.event_name != 'release' }} + + - name: "Build & Publish App" + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: yarn release + working-directory: "desktop" + if: ${{ github.event_name == 'release' }} diff --git a/desktop/.gitignore b/desktop/.gitignore index ca0a17d7..0cc5bd90 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -1,4 +1,4 @@ /dist/ /node_modules/ -/dist/bundle.js /yarn-error.log +/build/ \ No newline at end of file diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml new file mode 100644 index 00000000..98c64031 --- /dev/null +++ b/desktop/electron-builder.yml @@ -0,0 +1,33 @@ +appId: re.workadventu.desktop + +files: + - "build/**/*" + - "assets/**/*" + - "sidebar/**/*" + +dmg: + icon: false + +linux: + category: "TODO;TODO" + packageCategory: "TODO;TODO" + maintainer: "TODO" + icon: "assets/icons/TODO.icns" + description: "TODO" + target: + # - deb + - zip + - AppImage + + artifactName: "${productName}-${version}-${arch}.${ext}" + +win: + icon: "assets/icons/TODO.ico" + artifactName: "${productName}-${version}-setup.${ext}" + +publish: + provider: github + owner: thecodingmachine + repo: workadventure + vPrefixedTagName: false + releaseType: draft diff --git a/desktop/package.json b/desktop/package.json index 457f59de..1351170f 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,13 +1,15 @@ { - "name": "@workadventure/desktop", + "name": "workadventure-desktop", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "build/main.js", "license": "SEE LICENSE IN LICENSE.txt", "scripts": { - "build": "tsup-node ./src/main.ts ./src/sidebar/preload.ts ./src/app/preload.js", + "build": "tsup-node -d build ./src/main.ts ./src/sidebar/preload.ts ./src/app/preload.ts", + "dev": "yarn build --watch --onSuccess 'yarn electron build/main.js'", + "bundle": "electron-builder install-app-deps && electron-builder", + "release": "yarn bundle", "typecheck": "tsc --noEmit", - "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", "test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json", "lint": "yarn eslint src/ . --ext .ts", "fix": "yarn eslint --fix src/ . --ext .ts", @@ -35,36 +37,5 @@ "prettier": "^2.5.1", "tsup": "^5.11.13", "typescript": "^3.8.3" - }, - "build": { - "appId": "re.workadventu.desktop", - "files": [ - "src/**/*", - "assets/**/*" - ], - "dmg": { - "icon": false - }, - "linux": { - "category": "TODO;TODO", - "packageCategory": "TODO;TODO", - "maintainer": "TODO", - "icon": "assets/icons/TODO.icns", - "description": "TODO", - "target": [ - "deb", - "zip", - "AppImage" - ], - "artifactName": "${productName}-${version}-${arch}.${ext}" - }, - "win": { - "icon": "assets/icons/TODO.ico", - "artifactName": "${productName}-${version}-setup.${ext}" - }, - "publish": { - "provider": "generic", - "url": "TODO" - } } } diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index 78248218..2c73c49c 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -14,7 +14,7 @@ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ + "outDir": "./build", /* Redirect output structure to the directory. */ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ From de43233f36008be4b46b3bb5b6ce287498e039c3 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 12:02:41 +0100 Subject: [PATCH 009/116] fix release --- .../workflows/build-and-release-desktop.yml | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index e166c47f..d0bfc47c 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -30,7 +30,9 @@ jobs: working-directory: "desktop" - name: "Build App" - run: yarn bundle + run: yarn bundle --publish never + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: "desktop" if: ${{ github.event_name != 'release' }} @@ -61,13 +63,15 @@ jobs: working-directory: "desktop" - name: "Build App" - run: yarn bundle + run: yarn bundle --publish never + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: "desktop" if: ${{ github.event_name != 'release' }} - name: "Build & Publish App" - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: yarn release working-directory: "desktop" if: ${{ github.event_name == 'release' }} @@ -92,13 +96,15 @@ jobs: working-directory: "desktop" - name: "Build App" - run: yarn bundle + run: yarn bundle --publish never + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: "desktop" if: ${{ github.event_name != 'release' }} - name: "Build & Publish App" - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: yarn release working-directory: "desktop" if: ${{ github.event_name == 'release' }} From f755f188294e544b4e800a73411de1595569f183 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 12:03:48 +0100 Subject: [PATCH 010/116] add some pretty names --- .github/workflows/build-and-release-desktop.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index d0bfc47c..e47792a9 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -1,4 +1,4 @@ -name: Build & Release Desktop App +name: Build & release desktop app on: push: @@ -11,6 +11,7 @@ on: jobs: build_on_linux: + name: "Build & release for Linux" runs-on: ubuntu-latest steps: - name: "Checkout" @@ -44,6 +45,7 @@ jobs: if: ${{ github.event_name == 'release' }} build_on_mac: + name: "Build & release for MacOS" runs-on: macos-latest steps: - name: "Checkout" @@ -77,6 +79,7 @@ jobs: if: ${{ github.event_name == 'release' }} build_on_win: + name: "Build & release for Windows" runs-on: windows-latest steps: - name: "Checkout" From 770e82456e5e8a6bb56d90e548290296f92ff4f7 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 22:36:24 +0100 Subject: [PATCH 011/116] simplify ci and upload build artifacts --- .../workflows/build-and-release-desktop.yml | 113 +++++++----------- desktop/electron-builder.yml | 1 - 2 files changed, 41 insertions(+), 73 deletions(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index e47792a9..4be67da8 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -11,103 +11,72 @@ on: jobs: build_on_linux: - name: "Build & release for Linux" - runs-on: ubuntu-latest + name: "Build & release desktop app for ${{ matrix.os }}" + + strategy: + matrix: + node-version: [14.x] + runtime: [ linux-x64, win-x64, osx-x64 ] + include: + - runtime: linux-x64 + os: ubuntu-latest + + - runtime: osx-x64 + os: macos-latest + + - runtime: win-x64 + os: windows-latest + + runs-on: ${{ matrix.os }} + steps: - name: "Checkout" uses: "actions/checkout@v2.0.0" - name: "Setup NodeJS" - uses: actions/setup-node@v1 + uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: ${{ matrix.node-version }} - name: "Install dependencies" run: yarn install --froze-lockfile working-directory: "desktop" - - name: "Build Typescript" + - name: "Build typescript" run: yarn build working-directory: "desktop" - - name: "Build App" + - name: "Build app" run: yarn bundle --publish never env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: "desktop" if: ${{ github.event_name != 'release' }} - - name: "Build & Publish App" - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: "Build & publish App" run: yarn release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} working-directory: "desktop" if: ${{ github.event_name == 'release' }} - build_on_mac: - name: "Build & release for MacOS" - runs-on: macos-latest - steps: - - name: "Checkout" - uses: "actions/checkout@v2.0.0" - - - name: "Setup NodeJS" - uses: actions/setup-node@v1 + - name: Upload Linux .AppImage artifact + uses: actions/upload-artifact@v2 + if: startsWith(matrix.os, 'linux') with: - node-version: '14.x' + name: workadventure-desktop-linux-x64.AppImage + path: desktop/workadventure-desktop-*x86_64.AppImage - - name: "Install dependencies" - run: yarn install --froze-lockfile - working-directory: "desktop" - - - name: "Build Typescript" - run: yarn build - working-directory: "desktop" - - - name: "Build App" - run: yarn bundle --publish never - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - working-directory: "desktop" - if: ${{ github.event_name != 'release' }} - - - name: "Build & Publish App" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: yarn release - working-directory: "desktop" - if: ${{ github.event_name == 'release' }} - - build_on_win: - name: "Build & release for Windows" - runs-on: windows-latest - steps: - - name: "Checkout" - uses: "actions/checkout@v2.0.0" - - - name: "Setup NodeJS" - uses: actions/setup-node@v1 + - name: Upload Windows .exe artifact + uses: actions/upload-artifact@v2 + if: startsWith(matrix.os, 'windows') with: - node-version: '14.x' + name: workadventure-desktop-win-x64.exe + path: desktop/workadventure-desktop-*.exe - - name: "Install dependencies" - run: yarn install --froze-lockfile - working-directory: "desktop" - - - name: "Build Typescript" - run: yarn build - working-directory: "desktop" - - - name: "Build App" - run: yarn bundle --publish never - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - working-directory: "desktop" - if: ${{ github.event_name != 'release' }} - - - name: "Build & Publish App" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: yarn release - working-directory: "desktop" - if: ${{ github.event_name == 'release' }} + - name: Upload MacOS .dmg artifact + uses: actions/upload-artifact@v2 + if: startsWith(matrix.os, 'macos') + with: + name: workadventure-mac.dmg + path: desktop/workadventure-desktop-*.dmg diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index 98c64031..537b05c8 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -16,7 +16,6 @@ linux: description: "TODO" target: # - deb - - zip - AppImage artifactName: "${productName}-${version}-${arch}.${ext}" From 49feeb44260718015d4fb8881387cf0cd07de614 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 22:42:45 +0100 Subject: [PATCH 012/116] fix path --- .github/workflows/build-and-release-desktop.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index 4be67da8..128f8df7 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -65,18 +65,18 @@ jobs: if: startsWith(matrix.os, 'linux') with: name: workadventure-desktop-linux-x64.AppImage - path: desktop/workadventure-desktop-*x86_64.AppImage + path: desktop/dist/workadventure-desktop-*x86_64.AppImage - name: Upload Windows .exe artifact uses: actions/upload-artifact@v2 if: startsWith(matrix.os, 'windows') with: name: workadventure-desktop-win-x64.exe - path: desktop/workadventure-desktop-*.exe + path: desktop/dist/workadventure-desktop-*.exe - name: Upload MacOS .dmg artifact uses: actions/upload-artifact@v2 if: startsWith(matrix.os, 'macos') with: name: workadventure-mac.dmg - path: desktop/workadventure-desktop-*.dmg + path: desktop/dist/workadventure-desktop-*.dmg From 635bce83791caefeb27a684dc4a2c696d513da74 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 22:52:49 +0100 Subject: [PATCH 013/116] fix linux artifact upload --- .github/workflows/build-and-release-desktop.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index 128f8df7..80fc6e22 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -62,10 +62,10 @@ jobs: - name: Upload Linux .AppImage artifact uses: actions/upload-artifact@v2 - if: startsWith(matrix.os, 'linux') + if: startsWith(matrix.os, 'ubuntu') with: name: workadventure-desktop-linux-x64.AppImage - path: desktop/dist/workadventure-desktop-*x86_64.AppImage + path: desktop/dist/workadventure-desktop-*-x86_64.AppImage - name: Upload Windows .exe artifact uses: actions/upload-artifact@v2 From 4db20eea0a8f3102db8c86b590db29a0816d75cc Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 23:03:05 +0100 Subject: [PATCH 014/116] fix ts & pretty --- desktop/src/app.ts | 114 +++++++++++----------- desktop/src/app/preload.ts | 8 +- desktop/src/app/types.ts | 6 +- desktop/src/auto-updater.ts | 118 +++++++++++------------ desktop/src/ipc.ts | 101 ++++++++++---------- desktop/src/log.ts | 65 ++++++------- desktop/src/main.ts | 4 +- desktop/src/notification.ts | 26 +++-- desktop/src/settings.ts | 42 ++++---- desktop/src/sidebar/preload.ts | 11 +-- desktop/src/sidebar/types.ts | 14 +-- desktop/src/tray.ts | 113 +++++++++++----------- desktop/src/update-auto-launch.ts | 58 +++++------ desktop/src/window.ts | 154 +++++++++++++++--------------- 14 files changed, 407 insertions(+), 427 deletions(-) diff --git a/desktop/src/app.ts b/desktop/src/app.ts index 0a278f52..39a4fb97 100644 --- a/desktop/src/app.ts +++ b/desktop/src/app.ts @@ -7,74 +7,74 @@ import updateAutoLaunch from "./update-auto-launch"; import ipc, { emitMutedKeyPress } from "./ipc"; function init() { - const appLock = app.requestSingleInstanceLock(); + const appLock = app.requestSingleInstanceLock(); - if (!appLock) { - console.log("Application already running"); - app.quit(); - return; - } - - app.on("second-instance", () => { - // re-create window if closed - createWindow(); - - const mainWindow = getWindow(); - - // Someone tried to run a second instance, we should focus our window. - if (mainWindow) { - if (mainWindow.isMinimized()) { - mainWindow.restore(); - } - - mainWindow.focus(); + if (!appLock) { + console.log("Application already running"); + app.quit(); + return; } - }); - // This method will be called when Electron has finished loading - app.on("ready", () => { - autoUpdater.init(); + app.on("second-instance", () => { + // re-create window if closed + createWindow(); - // enable auto launch - updateAutoLaunch(); + const mainWindow = getWindow(); - // Don't show the app in the doc - // if (app.dock) { - // app.dock.hide(); - // } + // Someone tried to run a second instance, we should focus our window. + if (mainWindow) { + if (mainWindow.isMinimized()) { + mainWindow.restore(); + } - createWindow(); - createTray(); - - // load ipc handler - ipc(); - - globalShortcut.register("Alt+CommandOrControl+M", () => { - emitMutedKeyPress(); + mainWindow.focus(); + } }); - }); - // Quit when all windows are closed. - app.on("window-all-closed", () => { - // macOs users have to press Cmd + Q to stop the app - if (process.platform !== "darwin") { - app.quit(); - } - }); + // This method will be called when Electron has finished loading + app.on("ready", () => { + autoUpdater.init(); - app.on("activate", () => { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) { - createWindow(); - } - }); + // enable auto launch + updateAutoLaunch(); - app.on("quit", () => { - // TODO - }); + // Don't show the app in the doc + // if (app.dock) { + // app.dock.hide(); + // } + + createWindow(); + createTray(); + + // load ipc handler + ipc(); + + globalShortcut.register("Alt+CommandOrControl+M", () => { + emitMutedKeyPress(); + }); + }); + + // Quit when all windows are closed. + app.on("window-all-closed", () => { + // macOs users have to press Cmd + Q to stop the app + if (process.platform !== "darwin") { + app.quit(); + } + }); + + app.on("activate", () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } + }); + + app.on("quit", () => { + // TODO + }); } export default { - init, + init, }; diff --git a/desktop/src/app/preload.ts b/desktop/src/app/preload.ts index d406fbed..d4a8682c 100644 --- a/desktop/src/app/preload.ts +++ b/desktop/src/app/preload.ts @@ -2,10 +2,10 @@ import { contextBridge, ipcRenderer, IpcRendererEvent } from "electron"; import type { WorkAdventureDesktopApi } from "./types"; const api: WorkAdventureDesktopApi = { - desktop: true, - notify: (txt: string) => ipcRenderer.send("app:notify", txt), - onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => - ipcRenderer.on("app:on-muted-key-press", callback), + desktop: true, + notify: (txt: string) => ipcRenderer.send("app:notify", txt), + onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => + ipcRenderer.on("app:on-muted-key-press", callback), }; contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/app/types.ts b/desktop/src/app/types.ts index a76f834f..263af35b 100644 --- a/desktop/src/app/types.ts +++ b/desktop/src/app/types.ts @@ -1,7 +1,7 @@ import type { IpcRendererEvent } from "electron"; export type WorkAdventureDesktopApi = { - desktop: boolean; - notify: (txt: string) => void; - onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => void; + desktop: boolean; + notify: (txt: string) => void; + onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => void; }; diff --git a/desktop/src/auto-updater.ts b/desktop/src/auto-updater.ts index e796e808..5c4af88e 100644 --- a/desktop/src/auto-updater.ts +++ b/desktop/src/auto-updater.ts @@ -12,87 +12,85 @@ let isCheckPending = false; let isManualRequestedUpdate = false; export async function checkForUpdates() { - if (isCheckPending) { - return; - } + if (isCheckPending) { + return; + } - // Don't do auto-updates in development - if (isDev) { - return; - } + // Don't do auto-updates in development + if (isDev) { + return; + } - // check for updates right away - await autoUpdater.checkForUpdates(); + // check for updates right away + await autoUpdater.checkForUpdates(); - isCheckPending = false; + isCheckPending = false; } export async function manualRequestUpdateCheck() { - isManualRequestedUpdate = true; + isManualRequestedUpdate = true; - createAndShowNotification({ - body: "Checking for updates ...", - }); + createAndShowNotification({ + body: "Checking for updates ...", + }); - await checkForUpdates(); - isManualRequestedUpdate = false; + await checkForUpdates(); + isManualRequestedUpdate = false; } function init() { - autoUpdater.logger = log; + autoUpdater.logger = log; - autoUpdater.on("update-downloaded", ({ releaseNotes, releaseName }) => { - (async () => { - const dialogOpts = { - type: "question", - buttons: ["Install and Restart", "Install Later"], - defaultId: 0, - title: "WorkAdventure - Update", - message: process.platform === "win32" ? releaseNotes : releaseName, - detail: - "A new version has been downloaded. Restart the application to apply the updates.", - }; + autoUpdater.on("update-downloaded", ({ releaseNotes, releaseName }) => { + (async () => { + const dialogOpts = { + type: "question", + buttons: ["Install and Restart", "Install Later"], + defaultId: 0, + title: "WorkAdventure - Update", + message: process.platform === "win32" ? releaseNotes : releaseName, + detail: "A new version has been downloaded. Restart the application to apply the updates.", + }; - const { response } = await dialog.showMessageBox(dialogOpts); - if (response === 0) { - await sleep(1000); + const { response } = await dialog.showMessageBox(dialogOpts); + if (response === 0) { + await sleep(1000); - autoUpdater.quitAndInstall(); + autoUpdater.quitAndInstall(); - // Force app to quit. This is just a workaround, ideally autoUpdater.quitAndInstall() should relaunch the app. - app.isQuiting = true; - app.confirmedExitPrompt = true; - app.quit(); - } - })(); - }); - - if (process.platform === "linux" && !process.env.APPIMAGE) { - autoUpdater.autoDownload = false; - autoUpdater.autoInstallOnAppQuit = false; - - autoUpdater.on("update-available", () => { - createAndShowNotification({ - title: "WorkAdventure - Update available", - body: "Please go to our website and install the newest version", - }); + // Force app to quit. This is just a workaround, ideally autoUpdater.quitAndInstall() should relaunch the app. + // app.confirmedExitPrompt = true; + app.quit(); + } + })(); }); - } - autoUpdater.on("update-not-available", () => { - if (isManualRequestedUpdate) { - createAndShowNotification({ - body: "No update available.", - }); + if (process.platform === "linux" && !process.env.APPIMAGE) { + autoUpdater.autoDownload = false; + autoUpdater.autoInstallOnAppQuit = false; + + autoUpdater.on("update-available", () => { + createAndShowNotification({ + title: "WorkAdventure - Update available", + body: "Please go to our website and install the newest version", + }); + }); } - }); - checkForUpdates(); + autoUpdater.on("update-not-available", () => { + if (isManualRequestedUpdate) { + createAndShowNotification({ + body: "No update available.", + }); + } + }); - // run update check every hour again - setInterval(() => checkForUpdates, 1000 * 60 * 1); + checkForUpdates(); + + // run update check every hour again + setInterval(() => checkForUpdates, 1000 * 60 * 1); } export default { - init, + init, }; diff --git a/desktop/src/ipc.ts b/desktop/src/ipc.ts index cedc0084..eb90d526 100644 --- a/desktop/src/ipc.ts +++ b/desktop/src/ipc.ts @@ -4,67 +4,64 @@ import settings from "./settings"; import { getAppView, getWindow } from "./window"; export function emitMutedKeyPress() { - const mainWindow = getWindow(); - if (!mainWindow) { - throw new Error("Main window not found"); - } + const mainWindow = getWindow(); + if (!mainWindow) { + throw new Error("Main window not found"); + } - mainWindow.webContents.send("app:on-muted-key-press"); + mainWindow.webContents.send("app:on-muted-key-press"); } export default () => { - ipcMain.on("app:notify", (event, txt) => { - createAndShowNotification({ body: txt }); - }); + ipcMain.on("app:notify", (event, txt) => { + createAndShowNotification({ body: txt }); + }); - ipcMain.handle("sidebar:getServers", () => { - // TODO: remove - if (!settings.get("servers")) { - settings.set("servers", [ - { - _id: "1", - name: "WA Demo", - url: "https://play.staging.workadventu.re/@/tcm/workadventure/wa-village", - }, - { - _id: "2", - name: "My Server", - url: "http://play.workadventure.localhost/", - }, - ]); - } + ipcMain.handle("sidebar:getServers", () => { + // TODO: remove + if (!settings.get("servers")) { + settings.set("servers", [ + { + _id: "1", + name: "WA Demo", + url: "https://play.staging.workadventu.re/@/tcm/workadventure/wa-village", + }, + { + _id: "2", + name: "My Server", + url: "http://play.workadventure.localhost/", + }, + ]); + } - return settings.get("servers", []); - }); + return settings.get("servers", []); + }); - ipcMain.handle("sidebar:selectServer", (event, serverId: string) => { - const appView = getAppView(); - if (!appView) { - throw new Error("App view not found"); - } + ipcMain.handle("sidebar:selectServer", (event, serverId: string) => { + const appView = getAppView(); + if (!appView) { + throw new Error("App view not found"); + } - const servers = settings.get("servers", []); - const selectedServer = servers.find((s) => s._id === serverId); + const servers = settings.get("servers", []); + const selectedServer = servers.find((s) => s._id === serverId); - if (!selectedServer) { - return new Error("Server not found"); - } + if (!selectedServer) { + return new Error("Server not found"); + } - appView.webContents.loadURL(selectedServer.url); - return true; - }); + appView.webContents.loadURL(selectedServer.url); + return true; + }); - ipcMain.handle( - "sidebar:addServer", - (event, serverName: string, serverUrl: string) => { - const servers = settings.get("servers", []); - servers.push({ - _id: `${servers.length + 1}`, - name: serverName, - url: serverUrl, - }); - settings.set("servers", servers); - return true; - } - ); + ipcMain.handle("sidebar:addServer", (event, serverName: string, serverUrl: string) => { + const servers = settings.get("servers", []); + servers.push({ + _id: `${servers.length + 1}`, + name: serverName, + url: serverUrl, + }); + settings.set("servers", servers); + return true; + }); }; diff --git a/desktop/src/log.ts b/desktop/src/log.ts index 5fab521f..4da9f8ca 100644 --- a/desktop/src/log.ts +++ b/desktop/src/log.ts @@ -4,56 +4,53 @@ import log from "electron-log"; import settings from "./settings"; function onError(e: Error) { - try { - log.error(e); + try { + log.error(e); - dialog.showErrorBox( - "WorkAdventure - A JavaScript error occurred", - e.stack || "" - ); - } catch (logError) { - // eslint-disable-next-line no-console - console.error(e); - } + dialog.showErrorBox("WorkAdventure - A JavaScript error occurred", e.stack || ""); + } catch (logError) { + // eslint-disable-next-line no-console + console.error(e); + } } function onRejection(reason: Error) { - if (reason instanceof Error) { - let _reason = reason; - const errPrototype = Object.getPrototypeOf(reason); - const nameProperty = Object.getOwnPropertyDescriptor(errPrototype, "name"); + if (reason instanceof Error) { + let _reason = reason; + const errPrototype = Object.getPrototypeOf(reason); + const nameProperty = Object.getOwnPropertyDescriptor(errPrototype, "name"); - if (!nameProperty || !nameProperty.writable) { - _reason = new Error(reason.message); + if (!nameProperty || !nameProperty.writable) { + _reason = new Error(reason.message); + } + + _reason.name = `UnhandledRejection ${_reason.name}`; + onError(_reason); + return; } - _reason.name = `UnhandledRejection ${_reason.name}`; - onError(_reason); - return; - } - - const error = new Error(JSON.stringify(reason)); - error.name = "UnhandledRejection"; - onError(error); + const error = new Error(JSON.stringify(reason)); + error.name = "UnhandledRejection"; + onError(error); } function init() { - const logLevel = settings.get("log_level", "info"); - log.transports.console.level = logLevel; - log.transports.file.level = logLevel; + const logLevel = settings.get("log_level", "info"); + log.transports.console.level = logLevel; + log.transports.file.level = logLevel; - // eslint-disable-next-line no-console - console.log = log.log.bind(log); + // eslint-disable-next-line no-console + console.log = log.log.bind(log); - process.on("uncaughtException", onError); - process.on("unhandledRejection", onRejection); + process.on("uncaughtException", onError); + process.on("unhandledRejection", onRejection); } export async function openLog() { - const logFilePath = log.transports.file.getFile().path; - await shell.openPath(logFilePath); + const logFilePath = log.transports.file.getFile().path; + await shell.openPath(logFilePath); } export default { - init, + init, }; diff --git a/desktop/src/main.ts b/desktop/src/main.ts index 6817ebff..eea55629 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -3,8 +3,8 @@ import log from "./log"; import settings from "./settings"; async function start() { - await settings.init(); - log.init(); + await settings.init(); + log.init(); } start(); diff --git a/desktop/src/notification.ts b/desktop/src/notification.ts index 49a92f20..56f4df61 100644 --- a/desktop/src/notification.ts +++ b/desktop/src/notification.ts @@ -1,24 +1,20 @@ import path from "path"; import { Notification, NotificationConstructorOptions } from "electron"; -export function createNotification( - options: Partial -) { - const notification = new Notification({ - title: "WorkAdventure", - icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), - ...(options || {}), - }); +export function createNotification(options: Partial) { + const notification = new Notification({ + title: "WorkAdventure", + icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), + ...(options || {}), + }); - return notification; + return notification; } -export function createAndShowNotification( - options: Partial -) { - const notification = createNotification(options); +export function createAndShowNotification(options: Partial) { + const notification = createNotification(options); - notification.show(); + notification.show(); - return notification; + return notification; } diff --git a/desktop/src/settings.ts b/desktop/src/settings.ts index 3e923247..3a8e95ec 100644 --- a/desktop/src/settings.ts +++ b/desktop/src/settings.ts @@ -3,42 +3,36 @@ import Settings from "electron-settings"; import type { Server } from "./sidebar/types"; type SettingsData = { - log_level: ElectronLog.LogLevel; - auto_launch_enabled: boolean; - servers: Server[]; + log_level: ElectronLog.LogLevel; + auto_launch_enabled: boolean; + servers: Server[]; }; let settings: SettingsData; async function init() { - settings = (await Settings.get()) as SettingsData; + settings = (await Settings.get()) as SettingsData; } -function get( - key: T, - fallback?: SettingsData[T] -): SettingsData[T] { - if (settings === null) { - throw new Error("Settings not initialized"); - } +function get(key: T, fallback?: SettingsData[T]): SettingsData[T] { + if (settings === null) { + throw new Error("Settings not initialized"); + } - return settings[key]; + return settings?.[key]; } -export function set( - key: T, - value: SettingsData[T] -) { - if (settings === null) { - throw new Error("Settings not initialized"); - } +export function set(key: T, value: SettingsData[T]) { + if (settings === null) { + throw new Error("Settings not initialized"); + } - settings[key] = value; - void Settings.set(settings); + settings[key] = value; + void Settings.set(settings); } export default { - init, - get, - set, + init, + get, + set, }; diff --git a/desktop/src/sidebar/preload.ts b/desktop/src/sidebar/preload.ts index 3d159deb..910130cc 100644 --- a/desktop/src/sidebar/preload.ts +++ b/desktop/src/sidebar/preload.ts @@ -2,12 +2,11 @@ import { contextBridge, ipcRenderer } from "electron"; import type { WorkAdventureSidebarApi } from "./types"; const api: WorkAdventureSidebarApi = { - desktop: true, - getServers: () => ipcRenderer.invoke("sidebar:getServers"), - selectServer: (serverId: string) => - ipcRenderer.invoke("sidebar:selectServer", serverId), - addServer: (serverName: string, serverUrl: string) => - ipcRenderer.invoke("sidebar:addServer", serverName, serverUrl), + desktop: true, + getServers: () => ipcRenderer.invoke("sidebar:getServers"), + selectServer: (serverId: string) => ipcRenderer.invoke("sidebar:selectServer", serverId), + addServer: (serverName: string, serverUrl: string) => + ipcRenderer.invoke("sidebar:addServer", serverName, serverUrl), }; contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/sidebar/types.ts b/desktop/src/sidebar/types.ts index 79114d1e..b110f723 100644 --- a/desktop/src/sidebar/types.ts +++ b/desktop/src/sidebar/types.ts @@ -1,12 +1,12 @@ export type Server = { - _id: string; - name: string; - url: string; + _id: string; + name: string; + url: string; }; export type WorkAdventureSidebarApi = { - desktop: boolean; - getServers: () => Promise; - selectServer: (serverId: string) => Promise; - addServer: (serverName: string, serverUrl: string) => Promise; + desktop: boolean; + getServers: () => Promise; + selectServer: (serverId: string) => Promise; + addServer: (serverName: string, serverUrl: string) => Promise; }; diff --git a/desktop/src/tray.ts b/desktop/src/tray.ts index 984cdc5b..1ac4597e 100644 --- a/desktop/src/tray.ts +++ b/desktop/src/tray.ts @@ -11,70 +11,69 @@ let tray: Tray | undefined; const assetsDirectory = path.join(__dirname, "..", "assets"); export function getTray() { - return tray; + return tray; } export function createTray() { - tray = new Tray(path.join(assetsDirectory, "icons", "logo.png")); + tray = new Tray(path.join(assetsDirectory, "icons", "logo.png")); - const trayContextMenu = Menu.buildFromTemplate([ - { - id: "open", - label: "Show / Hide", - click() { + const trayContextMenu = Menu.buildFromTemplate([ + { + id: "open", + label: "Show / Hide", + click() { + const mainWindow = getWindow(); + if (!mainWindow) { + throw new Error("Main window not found"); + } + + if (mainWindow.isVisible()) { + mainWindow.hide(); + } else { + mainWindow.show(); + } + }, + }, + { + label: "Check for updates", + async click() { + await autoUpdater.manualRequestUpdateCheck(); + }, + }, + { + label: "Open Logs", + click() { + log.openLog(); + }, + }, + { + label: "About", + click() { + showAboutWindow({ + icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), + copyright: "Copyright © WorkAdventure", + }); + }, + }, + { + label: "Quit", + click() { + // app.confirmedExitPrompt = true; + app.quit(); + }, + }, + ]); + + tray.setContextMenu(trayContextMenu); + + tray.on("double-click", () => { const mainWindow = getWindow(); if (!mainWindow) { - throw new Error("Main window not found"); + throw new Error("Main window not found"); } - if (mainWindow.isVisible()) { - mainWindow.hide(); - } else { - mainWindow.show(); - } - }, - }, - { - label: "Check for updates", - async click() { - await autoUpdater.manualRequestUpdateCheck(); - }, - }, - { - label: "Open Logs", - click() { - log.openLog(); - }, - }, - { - label: "About", - click() { - showAboutWindow({ - icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), - copyright: "Copyright © WorkAdventure", - }); - }, - }, - { - label: "Quit", - click() { - app.isQuiting = true; - app.confirmedExitPrompt = true; - app.quit(); - }, - }, - ]); + mainWindow.show(); + }); - tray.setContextMenu(trayContextMenu); - - tray.on("double-click", () => { - const mainWindow = getWindow(); - if (!mainWindow) { - throw new Error("Main window not found"); - } - - mainWindow.show(); - }); - - return tray; + return tray; } diff --git a/desktop/src/update-auto-launch.ts b/desktop/src/update-auto-launch.ts index d25c29aa..5c85f997 100644 --- a/desktop/src/update-auto-launch.ts +++ b/desktop/src/update-auto-launch.ts @@ -5,37 +5,37 @@ import { app } from "electron"; import settings from "./settings"; export default async () => { - let isAutoLaunchEnabled = settings.get("auto_launch_enabled"); + let isAutoLaunchEnabled = settings.get("auto_launch_enabled"); - // set default to enabled - if (isAutoLaunchEnabled === null) { - settings.set("auto_launch_enabled", true); - isAutoLaunchEnabled = true; - } - - // Don't run this in development - if (isDev) { - return; - } - - // `setLoginItemSettings` doesn't support linux - if (process.platform === "linux") { - const autoLauncher = new AutoLaunch({ - name: "WorkAdventure", - isHidden: true, - }); - - if (isAutoLaunchEnabled) { - await autoLauncher.enable(); - } else { - await autoLauncher.disable(); + // set default to enabled + if (isAutoLaunchEnabled === null) { + settings.set("auto_launch_enabled", true); + isAutoLaunchEnabled = true; } - return; - } + // Don't run this in development + if (isDev) { + return; + } - app.setLoginItemSettings({ - openAtLogin: isAutoLaunchEnabled, - openAsHidden: true, - }); + // `setLoginItemSettings` doesn't support linux + if (process.platform === "linux") { + const autoLauncher = new AutoLaunch({ + name: "WorkAdventure", + isHidden: true, + }); + + if (isAutoLaunchEnabled) { + await autoLauncher.enable(); + } else { + await autoLauncher.disable(); + } + + return; + } + + app.setLoginItemSettings({ + openAtLogin: isAutoLaunchEnabled, + openAsHidden: true, + }); }; diff --git a/desktop/src/window.ts b/desktop/src/window.ts index 7bdb3262..8277bc1a 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -8,96 +8,96 @@ let appView: BrowserView | undefined; const sidebarWidth = 70; export function getWindow() { - return mainWindow; + return mainWindow; } export function getAppView() { - return appView; + return appView; } export function createWindow() { - // do not re-create window if still existing - if (mainWindow) { - return; - } + // do not re-create window if still existing + if (mainWindow) { + return; + } - // Load the previous state with fallback to defaults - const windowState = windowStateKeeper({ - defaultWidth: 1000, - defaultHeight: 800, - maximize: true, - }); + // Load the previous state with fallback to defaults + const windowState = windowStateKeeper({ + defaultWidth: 1000, + defaultHeight: 800, + maximize: true, + }); - mainWindow = new BrowserWindow({ - x: windowState.x, - y: windowState.y, - width: windowState.width, - height: windowState.height, - autoHideMenuBar: true, - show: false, - webPreferences: { - preload: path.join(__dirname, "../dist/sidebar/preload.js"), - }, - }); + mainWindow = new BrowserWindow({ + x: windowState.x, + y: windowState.y, + width: windowState.width, + height: windowState.height, + autoHideMenuBar: true, + show: false, + webPreferences: { + preload: path.join(__dirname, "../dist/sidebar/preload.js"), + }, + }); - // Let us register listeners on the window, so we can update the state - // automatically (the listeners will be removed when the window is closed) - // and restore the maximized or full screen state - windowState.manage(mainWindow); + // Let us register listeners on the window, so we can update the state + // automatically (the listeners will be removed when the window is closed) + // and restore the maximized or full screen state + windowState.manage(mainWindow); - mainWindow.on("closed", () => { - mainWindow = undefined; - }); + mainWindow.on("closed", () => { + mainWindow = undefined; + }); - // mainWindow.on('close', async (event) => { - // if (!app.confirmedExitPrompt) { - // event.preventDefault(); // Prevents the window from closing - // const choice = await dialog.showMessageBox(getMainWindow(), { - // type: 'question', - // buttons: ['Yes', 'Abort'], - // title: 'Confirm', - // message: 'Are you sure you want to quit?', - // }); - // if (choice.response === 0) { - // app.confirmedExitPrompt = true; - // mainWindow.close(); - // } - // } else { - // app.confirmedExitPrompt = false; - // } - // }); + // mainWindow.on('close', async (event) => { + // if (!app.confirmedExitPrompt) { + // event.preventDefault(); // Prevents the window from closing + // const choice = await dialog.showMessageBox(getMainWindow(), { + // type: 'question', + // buttons: ['Yes', 'Abort'], + // title: 'Confirm', + // message: 'Are you sure you want to quit?', + // }); + // if (choice.response === 0) { + // app.confirmedExitPrompt = true; + // mainWindow.close(); + // } + // } else { + // app.confirmedExitPrompt = false; + // } + // }); - appView = new BrowserView({ - webPreferences: { - preload: path.join(__dirname, "../dist/app/index.js"), - }, - }); - mainWindow.setBrowserView(appView); - appView.setBounds({ - x: sidebarWidth, - y: 0, - width: mainWindow.getBounds().width - sidebarWidth, - height: mainWindow.getBounds().height, - }); - appView.setAutoResize({ - width: true, - height: true, - }); + appView = new BrowserView({ + webPreferences: { + preload: path.join(__dirname, "../dist/app/index.js"), + }, + }); + mainWindow.setBrowserView(appView); + appView.setBounds({ + x: sidebarWidth, + y: 0, + width: mainWindow.getBounds().width - sidebarWidth, + height: mainWindow.getBounds().height, + }); + appView.setAutoResize({ + width: true, + height: true, + }); - mainWindow.once("ready-to-show", () => { - (async () => { - await appView?.webContents.loadURL("https://workadventu.re/"); // TODO: use some splashscreen ? - // appView.webContents.openDevTools({ - // mode: "detach", - // }); - mainWindow?.show(); - // mainWindow?.webContents.openDevTools({ mode: "detach" }); - })(); - }); + mainWindow.once("ready-to-show", () => { + (async () => { + await appView?.webContents.loadURL("https://workadventu.re/"); // TODO: use some splashscreen ? + // appView.webContents.openDevTools({ + // mode: "detach", + // }); + mainWindow?.show(); + // mainWindow?.webContents.openDevTools({ mode: "detach" }); + })(); + }); - mainWindow.webContents.on("did-finish-load", () => { - mainWindow?.setTitle("WorkAdventure Desktop"); - }); + mainWindow.webContents.on("did-finish-load", () => { + mainWindow?.setTitle("WorkAdventure Desktop"); + }); - mainWindow.loadFile("../sidebar/index.html"); + mainWindow.loadFile("../sidebar/index.html"); } From 533210e6f79ba666ab853344d495cfc8b4a4fc08 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 23:27:20 +0100 Subject: [PATCH 015/116] fix path --- desktop/src/window.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/src/window.ts b/desktop/src/window.ts index 8277bc1a..fe86c6fa 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -99,5 +99,5 @@ export function createWindow() { mainWindow?.setTitle("WorkAdventure Desktop"); }); - mainWindow.loadFile("../sidebar/index.html"); + mainWindow.loadFile(path.resolve(__dirname, "..", "sidebar", "index.html")); } From 313366d5b1ab2b4323986b41f30cb037518ac6a6 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 23:33:22 +0100 Subject: [PATCH 016/116] disable jasmine for now --- desktop/jasmine.json | 5 ----- desktop/package.json | 4 +--- desktop/yarn.lock | 18 ------------------ 3 files changed, 1 insertion(+), 26 deletions(-) delete mode 100644 desktop/jasmine.json diff --git a/desktop/jasmine.json b/desktop/jasmine.json deleted file mode 100644 index b51ed79d..00000000 --- a/desktop/jasmine.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "spec_dir": "tests", - "spec_files": ["**/*[tT]est.ts"], - "stopSpecOnExpectationFailure": false -} \ No newline at end of file diff --git a/desktop/package.json b/desktop/package.json index 1351170f..c75d948c 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -10,7 +10,7 @@ "bundle": "electron-builder install-app-deps && electron-builder", "release": "yarn bundle", "typecheck": "tsc --noEmit", - "test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json", + "test": "exit 0", "lint": "yarn eslint src/ . --ext .ts", "fix": "yarn eslint --fix src/ . --ext .ts", "pretty": "yarn prettier --write 'src/**/*.{ts,tsx}'", @@ -27,13 +27,11 @@ }, "devDependencies": { "@types/auto-launch": "^5.0.2", - "@types/jasmine": "^3.5.10", "@typescript-eslint/eslint-plugin": "^2.26.0", "@typescript-eslint/parser": "^2.26.0", "electron": "^17.0.1", "electron-builder": "^22.14.13", "eslint": "^6.8.0", - "jasmine": "^3.5.0", "prettier": "^2.5.1", "tsup": "^5.11.13", "typescript": "^3.8.3" diff --git a/desktop/yarn.lock b/desktop/yarn.lock index 69f9c033..cc783a6d 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -150,11 +150,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/jasmine@^3.5.10": - version "3.10.3" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.10.3.tgz#a89798b3d5a8bd23ca56e855a9aee3e5a93bdaaa" - integrity sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g== - "@types/json-schema@^7.0.3": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -1950,19 +1945,6 @@ jake@^10.6.1: filelist "^1.0.1" minimatch "^3.0.4" -jasmine-core@~3.99.0: - version "3.99.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.99.0.tgz#99a3da0d38ba2de82614d9198b7b1bc1c32a5960" - integrity sha512-+ZDaJlEfRopINQqgE+hvzRyDIQDeKfqqTvF8RzXsvU1yE3pBDRud2+Qfh9WvGgRpuzqxyQJVI6Amy5XQ11r/3w== - -jasmine@^3.5.0: - version "3.99.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.99.0.tgz#7cc7aeda7ade2d57694fc818a374f778cbb4ea62" - integrity sha512-YIThBuHzaIIcjxeuLmPD40SjxkEcc8i//sGMDKCgkRMVgIwRJf5qyExtlJpQeh7pkeoBSOe6lQEdg+/9uKg9mw== - dependencies: - glob "^7.1.6" - jasmine-core "~3.99.0" - joycon@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" From 2c0cb2f62be94b05124e9cafee2c46ed0bf57a7e Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 23:49:36 +0100 Subject: [PATCH 017/116] fix preload script paths --- desktop/src/window.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src/window.ts b/desktop/src/window.ts index fe86c6fa..607562ec 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -36,7 +36,7 @@ export function createWindow() { autoHideMenuBar: true, show: false, webPreferences: { - preload: path.join(__dirname, "../dist/sidebar/preload.js"), + preload: path.resolve(__dirname, "..", "build", "sidebar", "preload.js"), }, }); @@ -69,7 +69,7 @@ export function createWindow() { appView = new BrowserView({ webPreferences: { - preload: path.join(__dirname, "../dist/app/index.js"), + preload: path.resolve(__dirname, "..", "build", "app", "preload.js"), }, }); mainWindow.setBrowserView(appView); @@ -87,8 +87,8 @@ export function createWindow() { mainWindow.once("ready-to-show", () => { (async () => { await appView?.webContents.loadURL("https://workadventu.re/"); // TODO: use some splashscreen ? - // appView.webContents.openDevTools({ - // mode: "detach", + // appView?.webContents.openDevTools({ + // mode: "detach", // }); mainWindow?.show(); // mainWindow?.webContents.openDevTools({ mode: "detach" }); From 389c2e48446c4e629bad7933776564f94d873bff Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Fri, 18 Feb 2022 23:55:40 +0100 Subject: [PATCH 018/116] add caching --- .github/workflows/build-and-release-desktop.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index 80fc6e22..76c0792e 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -9,6 +9,9 @@ on: release: types: [created] +env: + YARN_CACHE_FOLDER: ~/.yarn + jobs: build_on_linux: name: "Build & release desktop app for ${{ matrix.os }}" @@ -38,6 +41,17 @@ jobs: with: node-version: ${{ matrix.node-version }} + - name: Caching + uses: actions/cache@v2 + with: + path: | + ${{ env.YARN_CACHE_FOLDER }} + ~/.cache/electron + ~/.cache/electron-builder + key: ${{ runner.OS }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.OS }}-yarn- + - name: "Install dependencies" run: yarn install --froze-lockfile working-directory: "desktop" From 9301433fdf0a3470bc29f305a8acc17339d393cc Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sat, 19 Feb 2022 01:08:33 +0100 Subject: [PATCH 019/116] improve local-app --- desktop/README.md | 2 +- desktop/assets/icons/1024x1024.png | Bin 9132 -> 0 bytes desktop/assets/icons/logo-round.png | Bin 0 -> 2856 bytes desktop/assets/icons/logo-text.png | Bin 0 -> 3515 bytes desktop/assets/icons/logo-white.png | Bin 0 -> 4008 bytes desktop/assets/icons/logo.png | Bin 5126 -> 4337 bytes desktop/electron-builder.yml | 2 +- desktop/{sidebar => local-app}/index.html | 30 ++++++++++--- desktop/{sidebar => local-app}/index.js | 0 desktop/package.json | 2 +- desktop/src/ipc.ts | 10 ++--- desktop/src/{app => preload-app}/preload.ts | 0 desktop/src/{app => preload-app}/types.ts | 0 desktop/src/preload-local-app/preload.ts | 12 +++++ .../{sidebar => preload-local-app}/types.ts | 2 +- desktop/src/settings.ts | 2 +- desktop/src/sidebar/preload.ts | 12 ----- desktop/src/window.ts | 41 +++++++++++++++--- 18 files changed, 82 insertions(+), 33 deletions(-) delete mode 100644 desktop/assets/icons/1024x1024.png create mode 100644 desktop/assets/icons/logo-round.png create mode 100644 desktop/assets/icons/logo-text.png create mode 100644 desktop/assets/icons/logo-white.png rename desktop/{sidebar => local-app}/index.html (66%) rename desktop/{sidebar => local-app}/index.js (100%) rename desktop/src/{app => preload-app}/preload.ts (100%) rename desktop/src/{app => preload-app}/types.ts (100%) create mode 100644 desktop/src/preload-local-app/preload.ts rename desktop/src/{sidebar => preload-local-app}/types.ts (87%) delete mode 100644 desktop/src/sidebar/preload.ts diff --git a/desktop/README.md b/desktop/README.md index f8788332..44fae8ab 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -1,3 +1,3 @@ # Desktop -The desktop component is an electron app. \ No newline at end of file +The desktop component is an electron app. It uses a hybrid setup. The sidebar to view servers and the main window used to add servers are bundled. After selecting a server the main window gets overlayed by a BrowserView showing the frontend of an external deployment with the actual WorkAdventure frontend. \ No newline at end of file diff --git a/desktop/assets/icons/1024x1024.png b/desktop/assets/icons/1024x1024.png deleted file mode 100644 index 9fdd695cf34c4a9c9aa77315528322f5e4bad5eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9132 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 diff --git a/desktop/assets/icons/logo-round.png b/desktop/assets/icons/logo-round.png new file mode 100644 index 0000000000000000000000000000000000000000..429d75e5b8b3755411b88bd175701be542506723 GIT binary patch literal 2856 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 literal 0 HcmV?d00001 diff --git a/desktop/assets/icons/logo-white.png b/desktop/assets/icons/logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..49637fc8d5a16aae10285378e409b3c7d79ccceb GIT binary patch literal 4008 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 x3mg15j4Vo3{%V{)W$ZVhoOFqh37}n(q%AV{ zrPV-X-?xwi3KRu}utOkFh%8~>0|AnE_3zhtPiFew%=_ccIdkUTJNJC&`@Y}zyN|Bg zm`NUzJp=%dv@pM93jiFN!oh+4(6EN@5kSMiZ_S;80Qf5X!v$+UnqCaRXD=)+ePxGF zpXYcyN%Zz=S@!jef|*{D+5fj!UT3ZCtDH&&qB5#%W5(mZX;iYZAJr zAHG=_sj#*PSH`};#`nGa{GN{7P&Ty_i_z|shv%FASZ^27aN&shil{^D-HirESI_p@ zx2Zwxi>nqY?(`{A=IUX_XxOOED$d%EBtkv5o0Y!=790>B^4Mtr-qiWGPGVKe9)lS6BWI` zC}Y$YPJy1Tv~6ue?f}+Ny)~)BnQGLFwsH#W;NY*zj10@5n|rAVCP*P*U7Jj@joL=+ zM|ouQsKUOT822E%7qfm6Lz@xCT9t)ai2B4Kp=Rx-7`i3AB!a^vASgnAmZnP(n8vS5 z9SF<}p2!gmcpzYr=(O2TphsJm0@oO>Qjt&lPJz<5E9zwM%r{9F5qS|h7x+N{4x9l% z=@|f#=>Mk$j*Prg`wWDuLwqt_?_y7{vDW!cxJjxu94K}CX4~pK>#l%(p#Am)44_}K zm#(h4eU=6Lk1^Q7)LT75Fw1kh+D@G`w2#o&?~{pHQs?J?At9L5B@REr__i{>kIwP7 z!eF<$nkQnZ9>1>T-ks-+wqnEzPlJ?W9b`VwQnPHH>VPCyd~YnETTeXLmXpd*+{Kdz zSKjtjrf{QL6uxxH#MgC|cnog#B*Y<7j1-`+Re}NVKpX(^V~}Xf!C$>F<6KH;{Ndr$ zDto1go9I3^LQ6{iMq*pmXn`YUtVR}~M8iG7a>Ti@`z>9X=ZM3l%`vT-8XmU1beGIQ zXI^!#!cJFio5xee+Xbp*I(^OnU;S$J2MBowK^lt#zey3h6V6Mtj33yb z=d_9OQ4tNP2TepZWnE6Q_tq*#@h>$dH~U6*lbN#Dx7N9ULwMZQRL| zl4iGWkhgAJAeQ@#RU=_q7HNG&8d3#9FPA65xH)`H=)_~06K~$pw?}?1CGy7Y6;;YJ zP$6_>P5wNDFv5uvnAHac6_T-;**_QPYj;ovpTt+q~qJJOMITW;6$a3 z$N57Cp%%Bx=Eb_RA;2*qN0=PAvi}u0@cfBWg0rAXpE9ylr@H3j=CVg!F#>@=pWt7` zD0TzHBYWYB58CR{^768!X7^C{O&H~2x?ya3tpT{OluG78JB zqmyqDRJu*Y0cL!ScY7!n>5j|W7b&wcS!n3p`Q4Va+|}K2CVqL`vPC$Pn>aD+!elSq zTgU#u+=?E3g=@DNKe{)QER|D2BiO4OvwhkOn#CCg)cf$wE?lyJZciY1e{PhLnPsL zGy9G+vvSPAiG`}FD_cZU%M|e<^DQBH=SpLXJd`YW#0*mamTEX*;p8yC_2Y68sS?ML z3DT-IcKRfU{!o56>;BCic<|Z>4dka8*F%#T3`Ue{U$-GG-6*JXjGLrUGr#h?(NkGP zMgBa>L>!if{7fDu7+-Q!%EfaJ}^F!uRIn(ZxtKqUk1qQBA*J(09Ums!+5 zBCl`9tInYDlgYb9V=7OcrK*6)O5EgdP1g`tWzx=IQ`orz)&2}!wTROq!Y8LyNKKxm zy`k%Qcjvl)b(tJIxMUhKH|%EG5{n`ZXOfiPol?<(bfJ^Wpcc99W{<@7htg7lOoY9# zPYqiTs;md5#yd_I!i7W^t2;MFhh^V$fPN>b5rtl!o_o@&KX|udkw_2JrDM4#jy#Aa4v77)dZdI5K`DMRML*=*ye!)&X z`WWKgGmAe>WdAZBm!7;TvE3QRM+JXNTAg$keg~0aAV4*oFS?5{+in;zW90Z~{L3b@ut6!+Fb9WL8ZPC+m|^WJDnxBf#Pep!tiz=2V? zJ2nt_{W+@ZBH#J+7x#pSsd7k_K+`s#G|L*^D?-J5zui!yJ z0Ki^^@dXP2c%dN=S6~&BW_u8^afKre0Sg`#Gb5kMN^h6S3T)xD zbhH&~jqj}$-3cF6cFxb{s*;=M03HzG1&Qs;qc$QG2n(kY6r(ymp2q zHCfQYOBF3Qjl6Fsmm2F^_Tsd%z0RUsplSEs_5+pr-dQBA*%T%3oQE{k49(QEYNWRS z;)KgSHMx?Kf_OpcSJVCvt{yXE-vivd$+Wg7$)$TP-jDEs-~F`yk~XsH!}$GGb*`ux z$X3C#Pw%-9cJpFaXhWhiDUkP0?oH*w30etXckbgp2ZuR75tn1j8MXEaSF2i}Sg7~BC5kX|!kNKhEmt{pA@P}nh6^yjr zA9YAMy7RJ-q4d8DpP&21#yZ~^cFE)!?><98O(8QrC8OOpMOu?Zk{^5s6p{~z-QV9b zJJjEwUVP(>(3?-Lxr>oRbyg(D6;s!sT_3DBpMH;}9K@U1*HBiH+ZX9&-?6U9dL%c7 zhy`y;GZLOM=B3_CHB2iW$gxz>wM1kXWjX1G_$Vi8`7T!A^_r*SsIH305R`Rq8se~N zkfR04xoD*yYl*I3zu*zjxjRRT``V*eVK`|#6rq8s2cHx8AfHnF8sG(LZ7s4q7?Vru z^#4A>*42x>dViU(s!(Q=MA0-1G)gAvtntCA5y<3uq^TdfwMNB&TjIZR_x@(n2CX_E zr0d+IxBHS0kq?)%nwp+HnRR1;NX5M5aM|lCmkoHdW^dUFC7cSWpB)hfoMq3(w=a9e z;>@G80DY3KpYHZ93*^mjZoL|RLE@eRrl$4dF$k2aK6p#gKU1+BBPEXIy|neP2EcPm z_cpAK(x5YtW!uCpd2rFTsHkyyKsYM`Bm`WG&HXT+MnQN{1ZZ?oh}Gi+fX&K4(1=qA zW{!dnE(d|CYO@eOeCPylaS^@C2Y`esRLVO5kcG&=1AqVkaA*YCL;%1+qc2Z=<8oQZ z;a?B=D(`>;*Vv#jf_pHodDJU)I zkdOety?pL>HE8evD=wEetwn3fTHE;K)_NgF+eq6bMNFtnUT5SGV`O82D(3D%9e&Cv zX72#FAEFoy0XTo|DPbP&-mih7_z?xzi5DjjFt5ZNOwMZ3ehjYf*-r|L8p?R@-IG~! zqC@&oIwRr0o&3n=-uSSpm7BNk>g|IARpW#FlffL@t>Y{fE2US=Fewqcp}aoHt-jhr zYqlxwY~V6_mqKO6g{+&9kRGEYSIbkL0>Bs}nQc_*pLod3d2RB-mPo z)7cl)H_V15xjaFW<-aGTG&dGr$+x5@8*JUKV@@O0}Hw<14s8#5v z-I%-WyaO&j+3>kbl5ulTi^g=DG2wo&en6Rq$-FtM$y~VOG9eVzhNoB#lJ;y!NA3I{ zv3>!D|26d&pt$I>Zacu9WHoIMh)_(q*T>9}i*E^c#Tu$VmlUh$Cmu&7jOEy-EE}Pi z7KEl7yCK;%gSFZ7>EG_gLXYP&{`VTfZH=IL0^S`|FP~c@BwmZIxAt_tEGNVLXdUs! zTjgm~x_f&3ds{qO*FF6@Wzo83Vdvi*Xy9a+ScEJlVlU1r4^B}jBb#+xUjktZSzt51 zeq-(aukQ8{3@73QVh1lS$12sHeC^D#L)9^-%c7Fcdeqei=k8@{tLgn(<$bYM0OxRx zp5e@OrKMOAdTMJE3@?wr^-<40#S6kizM4rVR5E!2-!=CMO%%#B=rO{`O9S41AO6@+ zs!)iH8XN2@I!!5F8VDnI@0a2^-d3(V-`Rj#sqy>%eGd}XSh!ZJak{39C=PaYq}1~Q z9FN@BXpYvCxn0#e+>>chOJl@kgt^^vUzM?1cNVp1?-=a#Acf7O{=67^*zLFYnX03? z^`9JT=0~!w$O5DiXjfB-99Ca4B1BHl2;&M`@#NLeG&fPWl;TZ z!ac#u!hW4t5<_Fp{WjaL6h)Va{yjh4(_yIX-p#PS0gEdzCU+xCtA5+K>mZknES9GW zQi@DH1q5&ts=At)eEf%}?#)IHeE5l3Q>+=rqdVDY22;14>P;XGCv}Y-Q(pZYMVNf+ z(>;47;;OODKQ>T;pWr5wTZjJbfz(iP~JnEzPfcuLqc6H99SxPrM@+$swqCU5BNN8mTMx>6>a&L^sT z%Lz`zVc9Yzbw`XYiz;@!TW}H6)(Tb#?pja5$~%-k$z(*)9T{2JX8Pk#GcjShn3W-e zg-n6(0MfxeRr2Y9>1*?Ul$+~O!4S+;Af~p9Ab{o_Ay#t zZFuo7HGh7YrCp)zVd@jqQm*>7)WJ=-tIOh|F&?&}>!W)$J@R`TDmt=!UsyBK|yT4Z!Bh8Bxr(vxaOSKp1j5&-`X8UF9+aS&<#($}vB>+iRPZK`d1w;>%l zHu4*NGb$sv3lc(4=k&)Y58HBp0`A!RPeK6GW(jrX#UrS9y4z=9$c{ zc)}s%>qDLDYF2D6wv#_=2k*B=xsAZ_8|k`+dIqQ3>SAR z621Ev)7MHrb`aJs>Ic3iS)yP1uIM<=>-_>XadS`Q4`YhRt6J{%MXqaS85c#@GWe;r5`e%b1~Mz-)H(=7ZR74I^B$&4rxyzHy#b6p9jFC&r`*X zv0!ZO)R(kOA?|k}pUr*z85F8~Q^P;`hZ8Y{U-go4JjN_Q*^0K&6K2_)8sat6#k!I74L=FTv77gR z>Mcv}YkvCZExNE0!TXHR1k67I+uVEq;89B8r9;7`qxvhsJ7xiL)6$K3o&~;?*F6?kYqM0x@*D@YtXzr zB552Az5+teY^W~k+}th*)K)(nQ2hnkxUDDOawUUyedF@&b|DMt|9?{Qe?&22wG-YV z0bKGzybwYed|=P7d{uI!OlXjN)#GH_^}W1c7h>I@N-p;-bT^cSZt=Fg2Q3F1G9F)% z2C5>b%%ZobfaZ4?sDgp)>ju&QT9I~qz33@`qcM(SKNHT}-`pWvg+wKfBZ)k?`p@aj z?^hD_qCOgIW=_wN4D7x)H>qrj2YH03+S65>f@9|4uegHYwD&91&%Ml%OWzTpcWuqI zajKN%Aey|U66;$2=uy;Sck(BdWS=+~AIM9SHeT{q^pf#$T75EI$bknI1Z%MrRR-Rl zx*IL8Ncvt|xh)`hDZgsMf;uVj46l;NBDUxdg8pEfG!KY~<8FmdI!b$(1>Rzz>-6Qd z5-UGtb?kSVeBwk>nhY!(v<`_tU&rK_)MPD56dw?iDUCDN9ax^DN6)V4C0@UAa$=*J z%g^4LUkPPCi&v?%)9`@IMx%jw5wP8YM>ySTZv;+35n{BeUh17=4 h*j==p*0AKJjIlX>*KN7QcTlbX!Vq}@f6nFBe*r=Wi+un9 diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index 537b05c8..a8731092 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -3,7 +3,7 @@ appId: re.workadventu.desktop files: - "build/**/*" - "assets/**/*" - - "sidebar/**/*" + - "local-app/**/*" dmg: icon: false diff --git a/desktop/sidebar/index.html b/desktop/local-app/index.html similarity index 66% rename from desktop/sidebar/index.html rename to desktop/local-app/index.html index 7621461d..131536af 100644 --- a/desktop/sidebar/index.html +++ b/desktop/local-app/index.html @@ -12,19 +12,25 @@ html, body { height: 100%; + width: 100%; } body { display: flex; - flex-direction: column; + flex-direction: row; + background-color: #30343D; + } + + .sidebar { + display: flex; width: 70px; - background-color: #25292E; + flex-direction: column; + background-color: #2B2F37; } #servers { display: flex; flex-direction: column; - margin-bottom: 1rem; } #servers div { @@ -49,11 +55,25 @@ #btn-reload { margin-top: auto; } + + .main { + display: flex; + flex-grow: 1; + justify-content: center; + align-items: center; + } -
- + +
+ +
\ No newline at end of file diff --git a/desktop/sidebar/index.js b/desktop/local-app/index.js similarity index 100% rename from desktop/sidebar/index.js rename to desktop/local-app/index.js diff --git a/desktop/package.json b/desktop/package.json index c75d948c..eb7e3bed 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -5,7 +5,7 @@ "main": "build/main.js", "license": "SEE LICENSE IN LICENSE.txt", "scripts": { - "build": "tsup-node -d build ./src/main.ts ./src/sidebar/preload.ts ./src/app/preload.ts", + "build": "tsup-node -d build ./src/main.ts ./src/preload-local-app/preload.ts ./src/preload-app/preload.ts", "dev": "yarn build --watch --onSuccess 'yarn electron build/main.js'", "bundle": "electron-builder install-app-deps && electron-builder", "release": "yarn bundle", diff --git a/desktop/src/ipc.ts b/desktop/src/ipc.ts index eb90d526..6641f59e 100644 --- a/desktop/src/ipc.ts +++ b/desktop/src/ipc.ts @@ -1,7 +1,7 @@ import { ipcMain } from "electron"; import { createAndShowNotification } from "./notification"; import settings from "./settings"; -import { getAppView, getWindow } from "./window"; +import { getAppView, getWindow, showAppView } from "./window"; export function emitMutedKeyPress() { const mainWindow = getWindow(); @@ -17,7 +17,7 @@ export default () => { createAndShowNotification({ body: txt }); }); - ipcMain.handle("sidebar:getServers", () => { + ipcMain.handle("local-app:getServers", () => { // TODO: remove if (!settings.get("servers")) { settings.set("servers", [ @@ -37,7 +37,7 @@ export default () => { return settings.get("servers", []); }); - ipcMain.handle("sidebar:selectServer", (event, serverId: string) => { + ipcMain.handle("local-app:selectServer", (event, serverId: string) => { const appView = getAppView(); if (!appView) { throw new Error("App view not found"); @@ -50,11 +50,11 @@ export default () => { return new Error("Server not found"); } - appView.webContents.loadURL(selectedServer.url); + showAppView(selectedServer.url); return true; }); - ipcMain.handle("sidebar:addServer", (event, serverName: string, serverUrl: string) => { + ipcMain.handle("local-app:addServer", (event, serverName: string, serverUrl: string) => { const servers = settings.get("servers", []); servers.push({ _id: `${servers.length + 1}`, diff --git a/desktop/src/app/preload.ts b/desktop/src/preload-app/preload.ts similarity index 100% rename from desktop/src/app/preload.ts rename to desktop/src/preload-app/preload.ts diff --git a/desktop/src/app/types.ts b/desktop/src/preload-app/types.ts similarity index 100% rename from desktop/src/app/types.ts rename to desktop/src/preload-app/types.ts diff --git a/desktop/src/preload-local-app/preload.ts b/desktop/src/preload-local-app/preload.ts new file mode 100644 index 00000000..32e63575 --- /dev/null +++ b/desktop/src/preload-local-app/preload.ts @@ -0,0 +1,12 @@ +import { contextBridge, ipcRenderer } from "electron"; +import type { WorkAdventureLocalAppApi } from "./types"; + +const api: WorkAdventureLocalAppApi = { + desktop: true, + getServers: () => ipcRenderer.invoke("local-app:getServers"), + selectServer: (serverId: string) => ipcRenderer.invoke("local-app:selectServer", serverId), + addServer: (serverName: string, serverUrl: string) => + ipcRenderer.invoke("local-app:addServer", serverName, serverUrl), +}; + +contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/sidebar/types.ts b/desktop/src/preload-local-app/types.ts similarity index 87% rename from desktop/src/sidebar/types.ts rename to desktop/src/preload-local-app/types.ts index b110f723..2d28697b 100644 --- a/desktop/src/sidebar/types.ts +++ b/desktop/src/preload-local-app/types.ts @@ -4,7 +4,7 @@ export type Server = { url: string; }; -export type WorkAdventureSidebarApi = { +export type WorkAdventureLocalAppApi = { desktop: boolean; getServers: () => Promise; selectServer: (serverId: string) => Promise; diff --git a/desktop/src/settings.ts b/desktop/src/settings.ts index 3a8e95ec..e8e7197b 100644 --- a/desktop/src/settings.ts +++ b/desktop/src/settings.ts @@ -1,6 +1,6 @@ import ElectronLog from "electron-log"; import Settings from "electron-settings"; -import type { Server } from "./sidebar/types"; +import type { Server } from "./preload-local-app/types"; type SettingsData = { log_level: ElectronLog.LogLevel; diff --git a/desktop/src/sidebar/preload.ts b/desktop/src/sidebar/preload.ts deleted file mode 100644 index 910130cc..00000000 --- a/desktop/src/sidebar/preload.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { contextBridge, ipcRenderer } from "electron"; -import type { WorkAdventureSidebarApi } from "./types"; - -const api: WorkAdventureSidebarApi = { - desktop: true, - getServers: () => ipcRenderer.invoke("sidebar:getServers"), - selectServer: (serverId: string) => ipcRenderer.invoke("sidebar:selectServer", serverId), - addServer: (serverName: string, serverUrl: string) => - ipcRenderer.invoke("sidebar:addServer", serverName, serverUrl), -}; - -contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/window.ts b/desktop/src/window.ts index 607562ec..cd586123 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -36,7 +36,7 @@ export function createWindow() { autoHideMenuBar: true, show: false, webPreferences: { - preload: path.resolve(__dirname, "..", "build", "sidebar", "preload.js"), + preload: path.resolve(__dirname, "..", "build", "preload-local-app", "preload.js"), }, }); @@ -69,10 +69,9 @@ export function createWindow() { appView = new BrowserView({ webPreferences: { - preload: path.resolve(__dirname, "..", "build", "app", "preload.js"), + preload: path.resolve(__dirname, "..", "build", "preload-app", "preload.js"), }, }); - mainWindow.setBrowserView(appView); appView.setBounds({ x: sidebarWidth, y: 0, @@ -86,12 +85,11 @@ export function createWindow() { mainWindow.once("ready-to-show", () => { (async () => { - await appView?.webContents.loadURL("https://workadventu.re/"); // TODO: use some splashscreen ? // appView?.webContents.openDevTools({ // mode: "detach", // }); mainWindow?.show(); - // mainWindow?.webContents.openDevTools({ mode: "detach" }); + mainWindow?.webContents.openDevTools({ mode: "detach" }); })(); }); @@ -99,5 +97,36 @@ export function createWindow() { mainWindow?.setTitle("WorkAdventure Desktop"); }); - mainWindow.loadFile(path.resolve(__dirname, "..", "sidebar", "index.html")); + mainWindow.loadFile(path.resolve(__dirname, "..", "local-app", "index.html")); +} + +export function showAppView(url?: string) { + if (!appView) { + throw new Error("App view not found"); + } + + if (!mainWindow) { + throw new Error("Main window not found"); + } + + if (mainWindow.getBrowserView()) { + mainWindow.removeBrowserView(appView); + } + mainWindow.addBrowserView(appView); + + if (url) { + appView.webContents.loadURL(url); + } +} + +export function hideAppView() { + if (!appView) { + throw new Error("App view not found"); + } + + if (!mainWindow) { + throw new Error("Main window not found"); + } + + mainWindow.removeBrowserView(appView); } From a5c7aa3969838fb3b968f1236b4ce8379f94fc93 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sat, 19 Feb 2022 01:17:38 +0100 Subject: [PATCH 020/116] fix name and icons --- desktop/assets/icons/logo.icns | Bin 0 -> 27789 bytes desktop/assets/icons/logo.ico | Bin 0 -> 4430 bytes desktop/electron-builder.yml | 11 +++++------ 3 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 desktop/assets/icons/logo.icns create mode 100644 desktop/assets/icons/logo.ico diff --git a/desktop/assets/icons/logo.icns b/desktop/assets/icons/logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..0b57eb3d4258fe58748c5acbbed7e2492a8c6325 GIT binary patch literal 27789 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 J`H~J<_&;*6Z?ymb literal 0 HcmV?d00001 diff --git a/desktop/assets/icons/logo.ico b/desktop/assets/icons/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..624dd12d423c1dd5f4c08a33fcd138f3a7c6d9a8 GIT binary patch literal 4430 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 literal 0 HcmV?d00001 diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index a8731092..53a7aacc 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -1,4 +1,5 @@ appId: re.workadventu.desktop +productName: "WorkAdventure desktop" files: - "build/**/*" @@ -11,17 +12,15 @@ dmg: linux: category: "TODO;TODO" packageCategory: "TODO;TODO" - maintainer: "TODO" - icon: "assets/icons/TODO.icns" - description: "TODO" + maintainer: "thecodingmachine" + icon: "assets/icons/logo.icns" + description: "Desktop app for WorkAdventure" target: - # - deb - AppImage - artifactName: "${productName}-${version}-${arch}.${ext}" win: - icon: "assets/icons/TODO.ico" + icon: "assets/icons/logo.ico" artifactName: "${productName}-${version}-setup.${ext}" publish: From 904525a08453efa23a995c74e8b7e7b7d9eee965 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sat, 19 Feb 2022 01:48:56 +0100 Subject: [PATCH 021/116] fix loading & cleanup --- desktop/electron-builder.yml | 8 ++++---- desktop/package.json | 9 +++++---- desktop/src/app.ts | 9 ++++++++- desktop/src/ipc.ts | 6 +++--- desktop/src/log.ts | 14 ++++++-------- desktop/src/main.ts | 8 +------- desktop/src/settings.ts | 6 +++--- desktop/src/tray.ts | 4 ++-- desktop/src/update-auto-launch.ts | 4 ++-- desktop/src/window.ts | 6 +++--- desktop/tsconfig.json | 2 +- 11 files changed, 38 insertions(+), 38 deletions(-) diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index 53a7aacc..ccc81163 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -1,20 +1,20 @@ appId: re.workadventu.desktop -productName: "WorkAdventure desktop" files: - - "build/**/*" + - "dist/**/*" - "assets/**/*" - "local-app/**/*" +directories: + output: ./build + dmg: icon: false linux: category: "TODO;TODO" packageCategory: "TODO;TODO" - maintainer: "thecodingmachine" icon: "assets/icons/logo.icns" - description: "Desktop app for WorkAdventure" target: - AppImage artifactName: "${productName}-${version}-${arch}.${ext}" diff --git a/desktop/package.json b/desktop/package.json index eb7e3bed..5b501f49 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,12 +1,13 @@ { "name": "workadventure-desktop", "version": "1.0.0", - "description": "", - "main": "build/main.js", + "description": "Desktop application for WorkAdventure", + "author": "thecodingmachine", + "main": "dist/main.js", "license": "SEE LICENSE IN LICENSE.txt", "scripts": { - "build": "tsup-node -d build ./src/main.ts ./src/preload-local-app/preload.ts ./src/preload-app/preload.ts", - "dev": "yarn build --watch --onSuccess 'yarn electron build/main.js'", + "build": "tsup-node ./src/main.ts ./src/preload-local-app/preload.ts ./src/preload-app/preload.ts", + "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", "bundle": "electron-builder install-app-deps && electron-builder", "release": "yarn bundle", "typecheck": "tsc --noEmit", diff --git a/desktop/src/app.ts b/desktop/src/app.ts index 39a4fb97..918905bb 100644 --- a/desktop/src/app.ts +++ b/desktop/src/app.ts @@ -5,6 +5,8 @@ import { createTray } from "./tray"; import autoUpdater from "./auto-updater"; import updateAutoLaunch from "./update-auto-launch"; import ipc, { emitMutedKeyPress } from "./ipc"; +import settings from "./settings"; +import { setLogLevel } from "./log"; function init() { const appLock = app.requestSingleInstanceLock(); @@ -32,7 +34,12 @@ function init() { }); // This method will be called when Electron has finished loading - app.on("ready", () => { + app.on("ready", async () => { + await settings.init(); + + const logLevel = settings.get("log_level"); + setLogLevel(logLevel || "info"); + autoUpdater.init(); // enable auto launch diff --git a/desktop/src/ipc.ts b/desktop/src/ipc.ts index 6641f59e..ff993757 100644 --- a/desktop/src/ipc.ts +++ b/desktop/src/ipc.ts @@ -34,7 +34,7 @@ export default () => { ]); } - return settings.get("servers", []); + return settings.get("servers") || []; }); ipcMain.handle("local-app:selectServer", (event, serverId: string) => { @@ -43,7 +43,7 @@ export default () => { throw new Error("App view not found"); } - const servers = settings.get("servers", []); + const servers = settings.get("servers") || []; const selectedServer = servers.find((s) => s._id === serverId); if (!selectedServer) { @@ -55,7 +55,7 @@ export default () => { }); ipcMain.handle("local-app:addServer", (event, serverName: string, serverUrl: string) => { - const servers = settings.get("servers", []); + const servers = settings.get("servers") || []; servers.push({ _id: `${servers.length + 1}`, name: serverName, diff --git a/desktop/src/log.ts b/desktop/src/log.ts index 4da9f8ca..2c9d6e6c 100644 --- a/desktop/src/log.ts +++ b/desktop/src/log.ts @@ -1,15 +1,13 @@ import { dialog, shell } from "electron"; +import ElectronLog from "electron-log"; import log from "electron-log"; -import settings from "./settings"; - function onError(e: Error) { try { log.error(e); dialog.showErrorBox("WorkAdventure - A JavaScript error occurred", e.stack || ""); } catch (logError) { - // eslint-disable-next-line no-console console.error(e); } } @@ -35,11 +33,6 @@ function onRejection(reason: Error) { } function init() { - const logLevel = settings.get("log_level", "info"); - log.transports.console.level = logLevel; - log.transports.file.level = logLevel; - - // eslint-disable-next-line no-console console.log = log.log.bind(log); process.on("uncaughtException", onError); @@ -51,6 +44,11 @@ export async function openLog() { await shell.openPath(logFilePath); } +export function setLogLevel(logLevel: ElectronLog.LogLevel) { + log.transports.console.level = logLevel; + log.transports.file.level = logLevel; +} + export default { init, }; diff --git a/desktop/src/main.ts b/desktop/src/main.ts index eea55629..6d4bcb6a 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -1,11 +1,5 @@ import app from "./app"; import log from "./log"; -import settings from "./settings"; -async function start() { - await settings.init(); - log.init(); -} - -start(); +log.init(); app.init(); diff --git a/desktop/src/settings.ts b/desktop/src/settings.ts index e8e7197b..592f159f 100644 --- a/desktop/src/settings.ts +++ b/desktop/src/settings.ts @@ -14,8 +14,8 @@ async function init() { settings = (await Settings.get()) as SettingsData; } -function get(key: T, fallback?: SettingsData[T]): SettingsData[T] { - if (settings === null) { +function get(key: T): SettingsData[T] | undefined { + if (settings === undefined) { throw new Error("Settings not initialized"); } @@ -23,7 +23,7 @@ function get(key: T, fallback?: SettingsData[T]): } export function set(key: T, value: SettingsData[T]) { - if (settings === null) { + if (settings === undefined) { throw new Error("Settings not initialized"); } diff --git a/desktop/src/tray.ts b/desktop/src/tray.ts index 1ac4597e..9205ee85 100644 --- a/desktop/src/tray.ts +++ b/desktop/src/tray.ts @@ -1,5 +1,5 @@ import { app, Tray, Menu } from "electron"; -import * as path from "path"; +import path from "path"; import { showAboutWindow } from "electron-util"; import * as autoUpdater from "./auto-updater"; @@ -50,7 +50,7 @@ export function createTray() { label: "About", click() { showAboutWindow({ - icon: path.join(__dirname, "..", "assets", "icons", "logo.png"), + icon: path.join(assetsDirectory, "icons", "logo.png"), copyright: "Copyright © WorkAdventure", }); }, diff --git a/desktop/src/update-auto-launch.ts b/desktop/src/update-auto-launch.ts index 5c85f997..678463f4 100644 --- a/desktop/src/update-auto-launch.ts +++ b/desktop/src/update-auto-launch.ts @@ -1,5 +1,5 @@ import AutoLaunch from "auto-launch"; -import * as isDev from "electron-is-dev"; +import isDev from "electron-is-dev"; import { app } from "electron"; import settings from "./settings"; @@ -8,7 +8,7 @@ export default async () => { let isAutoLaunchEnabled = settings.get("auto_launch_enabled"); // set default to enabled - if (isAutoLaunchEnabled === null) { + if (isAutoLaunchEnabled === undefined) { settings.set("auto_launch_enabled", true); isAutoLaunchEnabled = true; } diff --git a/desktop/src/window.ts b/desktop/src/window.ts index cd586123..429a314b 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -36,7 +36,7 @@ export function createWindow() { autoHideMenuBar: true, show: false, webPreferences: { - preload: path.resolve(__dirname, "..", "build", "preload-local-app", "preload.js"), + preload: path.resolve(__dirname, "..", "dist", "preload-local-app", "preload.js"), }, }); @@ -69,7 +69,7 @@ export function createWindow() { appView = new BrowserView({ webPreferences: { - preload: path.resolve(__dirname, "..", "build", "preload-app", "preload.js"), + preload: path.resolve(__dirname, "..", "dist", "preload-app", "preload.js"), }, }); appView.setBounds({ @@ -89,7 +89,7 @@ export function createWindow() { // mode: "detach", // }); mainWindow?.show(); - mainWindow?.webContents.openDevTools({ mode: "detach" }); + // mainWindow?.webContents.openDevTools({ mode: "detach" }); })(); }); diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json index 2c73c49c..78248218 100644 --- a/desktop/tsconfig.json +++ b/desktop/tsconfig.json @@ -14,7 +14,7 @@ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./build", /* Redirect output structure to the directory. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ From bafc51e4a6b3ce2964a0cf86aab1ed870f16c4f9 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sat, 19 Feb 2022 01:55:05 +0100 Subject: [PATCH 022/116] fix lint --- desktop/src/app.ts | 5 ++--- desktop/src/window.ts | 12 +++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/desktop/src/app.ts b/desktop/src/app.ts index 918905bb..c3ccb23f 100644 --- a/desktop/src/app.ts +++ b/desktop/src/app.ts @@ -34,11 +34,10 @@ function init() { }); // This method will be called when Electron has finished loading - app.on("ready", async () => { + app.whenReady().then(async () => { await settings.init(); - const logLevel = settings.get("log_level"); - setLogLevel(logLevel || "info"); + setLogLevel(settings.get("log_level") || "info"); autoUpdater.init(); diff --git a/desktop/src/window.ts b/desktop/src/window.ts index 429a314b..5bf6708e 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -84,13 +84,11 @@ export function createWindow() { }); mainWindow.once("ready-to-show", () => { - (async () => { - // appView?.webContents.openDevTools({ - // mode: "detach", - // }); - mainWindow?.show(); - // mainWindow?.webContents.openDevTools({ mode: "detach" }); - })(); + // appView?.webContents.openDevTools({ + // mode: "detach", + // }); + mainWindow?.show(); + // mainWindow?.webContents.openDevTools({ mode: "detach" }); }); mainWindow.webContents.on("did-finish-load", () => { From 2b08faaa33c7b276269792dba6c5a95432fd539a Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sat, 19 Feb 2022 01:59:57 +0100 Subject: [PATCH 023/116] fix artifacts --- .github/workflows/build-and-release-desktop.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index 76c0792e..c6bc3c04 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -79,18 +79,18 @@ jobs: if: startsWith(matrix.os, 'ubuntu') with: name: workadventure-desktop-linux-x64.AppImage - path: desktop/dist/workadventure-desktop-*-x86_64.AppImage + path: desktop/build/workadventure-desktop-*-x86_64.AppImage - name: Upload Windows .exe artifact uses: actions/upload-artifact@v2 if: startsWith(matrix.os, 'windows') with: name: workadventure-desktop-win-x64.exe - path: desktop/dist/workadventure-desktop-*.exe + path: desktop/build/workadventure-desktop-*.exe - name: Upload MacOS .dmg artifact uses: actions/upload-artifact@v2 if: startsWith(matrix.os, 'macos') with: name: workadventure-mac.dmg - path: desktop/dist/workadventure-desktop-*.dmg + path: desktop/build/workadventure-desktop-*.dmg From d526db5bf3a7f2d8c7f2597b2baab11f6a2b46a7 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sun, 20 Feb 2022 20:30:53 +0100 Subject: [PATCH 024/116] add svelte local-app --- desktop/README.md | 23 +- desktop/electron-builder.yml | 2 +- desktop/local-app/.gitignore | 24 + desktop/local-app/.prettierignore | 1 + desktop/local-app/.prettierrc.json | 4 + desktop/local-app/index.html | 80 +- desktop/local-app/index.js | 16 +- desktop/local-app/package.json | 28 + desktop/local-app/src/App.svelte | 39 + desktop/local-app/src/assets/svelte.png | Bin 0 -> 5185 bytes desktop/local-app/src/lib/Lazy.svelte | 35 + desktop/local-app/src/lib/LazyRoute.svelte | 20 + desktop/local-app/src/lib/Link.svelte | 18 + desktop/local-app/src/lib/Sidebar.svelte | 49 ++ desktop/local-app/src/main.ts | 8 + desktop/local-app/src/store.ts | 30 + desktop/local-app/src/views/AddServer.svelte | 12 + desktop/local-app/src/views/Home.svelte | 7 + desktop/local-app/src/vite-env.d.ts | 2 + desktop/local-app/svelte.config.js | 7 + desktop/local-app/tsconfig.json | 20 + desktop/local-app/tsconfig.node.json | 8 + desktop/local-app/vite.config.ts | 7 + desktop/local-app/yarn.lock | 789 +++++++++++++++++++ desktop/package.json | 4 +- desktop/src/app.ts | 10 +- desktop/src/ipc.ts | 52 +- desktop/src/preload-app/preload.ts | 1 + desktop/src/preload-app/types.ts | 1 + desktop/src/preload-local-app/preload.ts | 8 +- desktop/src/preload-local-app/types.ts | 5 +- desktop/src/serve.ts | 9 + desktop/src/tray.ts | 2 - desktop/src/window.ts | 22 +- desktop/yarn.lock | 5 + 35 files changed, 1225 insertions(+), 123 deletions(-) create mode 100644 desktop/local-app/.gitignore create mode 100644 desktop/local-app/.prettierignore create mode 100644 desktop/local-app/.prettierrc.json create mode 100644 desktop/local-app/package.json create mode 100644 desktop/local-app/src/App.svelte create mode 100644 desktop/local-app/src/assets/svelte.png create mode 100644 desktop/local-app/src/lib/Lazy.svelte create mode 100644 desktop/local-app/src/lib/LazyRoute.svelte create mode 100644 desktop/local-app/src/lib/Link.svelte create mode 100644 desktop/local-app/src/lib/Sidebar.svelte create mode 100644 desktop/local-app/src/main.ts create mode 100644 desktop/local-app/src/store.ts create mode 100644 desktop/local-app/src/views/AddServer.svelte create mode 100644 desktop/local-app/src/views/Home.svelte create mode 100644 desktop/local-app/src/vite-env.d.ts create mode 100644 desktop/local-app/svelte.config.js create mode 100644 desktop/local-app/tsconfig.json create mode 100644 desktop/local-app/tsconfig.node.json create mode 100644 desktop/local-app/vite.config.ts create mode 100644 desktop/local-app/yarn.lock create mode 100644 desktop/src/serve.ts diff --git a/desktop/README.md b/desktop/README.md index 44fae8ab..6cc24f1d 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -1,3 +1,22 @@ -# Desktop +# Desktop app -The desktop component is an electron app. It uses a hybrid setup. The sidebar to view servers and the main window used to add servers are bundled. After selecting a server the main window gets overlayed by a BrowserView showing the frontend of an external deployment with the actual WorkAdventure frontend. \ No newline at end of file +The desktop component is an electron app. It uses a hybrid setup based of two main components: +- A `local-app` bundled into the electron app. It has two main parts: + - A sidebar to show the server list, with the currently selected server + - A main page which is used to manage servers and to show other "local" pages like the options +- A BrowserView (often called `appView` or `app`) showing the actual frontend of an external WorkAdventure deployment. + If a server is selected the BrowserView / `appView` is overlaying the main part right to the sidebar. + +## Development + +```bash +# start local-app +cd local-app/ +yarn dev + +# start electron app +LOCAL_APP_URL=http://localhost:3000 yarn dev + +# or create an executable by running: +yarn bundle +``` \ No newline at end of file diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index ccc81163..143c80b1 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -3,7 +3,7 @@ appId: re.workadventu.desktop files: - "dist/**/*" - "assets/**/*" - - "local-app/**/*" + - "local-app/dist/**/*" directories: output: ./build diff --git a/desktop/local-app/.gitignore b/desktop/local-app/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/desktop/local-app/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/desktop/local-app/.prettierignore b/desktop/local-app/.prettierignore new file mode 100644 index 00000000..1f453464 --- /dev/null +++ b/desktop/local-app/.prettierignore @@ -0,0 +1 @@ +src/Messages/generated diff --git a/desktop/local-app/.prettierrc.json b/desktop/local-app/.prettierrc.json new file mode 100644 index 00000000..e8980d15 --- /dev/null +++ b/desktop/local-app/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "printWidth": 120, + "tabWidth": 4 +} diff --git a/desktop/local-app/index.html b/desktop/local-app/index.html index 131536af..0cf06db5 100644 --- a/desktop/local-app/index.html +++ b/desktop/local-app/index.html @@ -1,79 +1,29 @@ - + - - WorkAdventure Desktop Demo + + + + WorkAdventure Desktop - -
- -
- +
+ - \ No newline at end of file + diff --git a/desktop/local-app/index.js b/desktop/local-app/index.js index ce9a4334..337e0bd5 100644 --- a/desktop/local-app/index.js +++ b/desktop/local-app/index.js @@ -1,21 +1,7 @@ // let muted = false; -if (window?.WorkAdventureDesktopApi?.desktop) { - (async () => { - const servers = await window.WorkAdventureDesktopApi.getServers(); - servers.forEach((e) => { - const server = document.createElement("div"); - server.innerText = e.name; - server.onclick = () => { - window.WorkAdventureDesktopApi.selectServer(e._id); - }; - document.getElementById("servers").appendChild(server); - }); - })(); -} - document.getElementById("btn-reload").onclick = () => { - location.reload(); + location.reload(); }; // window?.WorkAdventureDesktopApi?.onMutedKeyPress((event) => { diff --git a/desktop/local-app/package.json b/desktop/local-app/package.json new file mode 100644 index 00000000..961e1caf --- /dev/null +++ b/desktop/local-app/package.json @@ -0,0 +1,28 @@ +{ + "name": "vite-project", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json", + "pretty": "yarn prettier --write 'src/**/*.{ts,tsx}'", + "pretty-check": "yarn prettier --check 'src/**/*.{ts,tsx}'" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30", + "@tsconfig/svelte": "^2.0.1", + "prettier": "^2.5.1", + "svelte": "^3.44.0", + "svelte-check": "^2.2.7", + "svelte-navigator": "^3.1.5", + "svelte-preprocess": "^4.9.8", + "tslib": "^2.3.1", + "typescript": "^4.5.4", + "vite": "^2.8.0", + "vite-plugin-windicss": "^1.7.1", + "windicss": "^3.4.3" + } +} diff --git a/desktop/local-app/src/App.svelte b/desktop/local-app/src/App.svelte new file mode 100644 index 00000000..9abbfaf0 --- /dev/null +++ b/desktop/local-app/src/App.svelte @@ -0,0 +1,39 @@ + + +{#if insideElectron} + + +
+ Loading ... + Loading ... + +

404

+

No Route could be matched.

+
+
+
+{:else} +
Please open the app inside of Electron.
+{/if} + + diff --git a/desktop/local-app/src/assets/svelte.png b/desktop/local-app/src/assets/svelte.png new file mode 100644 index 0000000000000000000000000000000000000000..e673c91c7bcb0e3a1be737745af56990613a641e GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/desktop/local-app/src/lib/Lazy.svelte b/desktop/local-app/src/lib/Lazy.svelte new file mode 100644 index 00000000..1f9031ef --- /dev/null +++ b/desktop/local-app/src/lib/Lazy.svelte @@ -0,0 +1,35 @@ + + +{#if loadedComponent} + +{:else if showFallback} + +{/if} diff --git a/desktop/local-app/src/lib/LazyRoute.svelte b/desktop/local-app/src/lib/LazyRoute.svelte new file mode 100644 index 00000000..1080b9f2 --- /dev/null +++ b/desktop/local-app/src/lib/LazyRoute.svelte @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/desktop/local-app/src/lib/Link.svelte b/desktop/local-app/src/lib/Link.svelte new file mode 100644 index 00000000..bc902bf1 --- /dev/null +++ b/desktop/local-app/src/lib/Link.svelte @@ -0,0 +1,18 @@ + + +
+ +
\ No newline at end of file diff --git a/desktop/local-app/src/lib/Sidebar.svelte b/desktop/local-app/src/lib/Sidebar.svelte new file mode 100644 index 00000000..ab1ca92d --- /dev/null +++ b/desktop/local-app/src/lib/Sidebar.svelte @@ -0,0 +1,49 @@ + + + + + diff --git a/desktop/local-app/src/main.ts b/desktop/local-app/src/main.ts new file mode 100644 index 00000000..67ea9463 --- /dev/null +++ b/desktop/local-app/src/main.ts @@ -0,0 +1,8 @@ +import "virtual:windi.css"; +import App from "./App.svelte"; + +const app = new App({ + target: document.getElementById("app"), +}); + +export default app; diff --git a/desktop/local-app/src/store.ts b/desktop/local-app/src/store.ts new file mode 100644 index 00000000..5b82f7b9 --- /dev/null +++ b/desktop/local-app/src/store.ts @@ -0,0 +1,30 @@ +import { writable, get } from "svelte/store"; + +type Server = { + _id: string; + name: string; + url: string; +}; + +export const newServer = writable>({ + name: "", + url: "", +}); +export const servers = writable([]); +export const selectedServer = writable(undefined); + +export async function selectServer(server: Server) { + await window.WorkAdventureDesktopApi.selectServer(server._id); + selectedServer.set(server._id); +} + +export async function addServer(event: Event) { + const addedServer = await window?.WorkAdventureDesktopApi?.addServer(get(newServer)); + newServer.set({ name: "", url: "" }); + servers.update((s) => [...s, addedServer]); + await selectServer(addedServer); +} + +export async function loadServers() { + servers.set(await window.WorkAdventureDesktopApi.getServers()); +} diff --git a/desktop/local-app/src/views/AddServer.svelte b/desktop/local-app/src/views/AddServer.svelte new file mode 100644 index 00000000..060f5cad --- /dev/null +++ b/desktop/local-app/src/views/AddServer.svelte @@ -0,0 +1,12 @@ + + +
+ +
+ + + +
+
diff --git a/desktop/local-app/src/views/Home.svelte b/desktop/local-app/src/views/Home.svelte new file mode 100644 index 00000000..11c3c248 --- /dev/null +++ b/desktop/local-app/src/views/Home.svelte @@ -0,0 +1,7 @@ + + +
+ WorkAdeventure logo +
diff --git a/desktop/local-app/src/vite-env.d.ts b/desktop/local-app/src/vite-env.d.ts new file mode 100644 index 00000000..4078e747 --- /dev/null +++ b/desktop/local-app/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/desktop/local-app/svelte.config.js b/desktop/local-app/svelte.config.js new file mode 100644 index 00000000..3630bb39 --- /dev/null +++ b/desktop/local-app/svelte.config.js @@ -0,0 +1,7 @@ +import sveltePreprocess from 'svelte-preprocess' + +export default { + // Consult https://github.com/sveltejs/svelte-preprocess + // for more information about preprocessors + preprocess: sveltePreprocess() +} diff --git a/desktop/local-app/tsconfig.json b/desktop/local-app/tsconfig.json new file mode 100644 index 00000000..4d6c04cf --- /dev/null +++ b/desktop/local-app/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "resolveJsonModule": true, + "baseUrl": ".", + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true + }, + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/desktop/local-app/tsconfig.node.json b/desktop/local-app/tsconfig.node.json new file mode 100644 index 00000000..e993792c --- /dev/null +++ b/desktop/local-app/tsconfig.node.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "composite": true, + "module": "esnext", + "moduleResolution": "node" + }, + "include": ["vite.config.ts"] +} diff --git a/desktop/local-app/vite.config.ts b/desktop/local-app/vite.config.ts new file mode 100644 index 00000000..ed8db069 --- /dev/null +++ b/desktop/local-app/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; +import WindiCSS from "vite-plugin-windicss"; + +export default defineConfig({ + plugins: [svelte(), WindiCSS()], +}); diff --git a/desktop/local-app/yarn.lock b/desktop/local-app/yarn.lock new file mode 100644 index 00000000..5f03ded2 --- /dev/null +++ b/desktop/local-app/yarn.lock @@ -0,0 +1,789 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@antfu/utils@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.4.0.tgz#df100ed9922d7359bf6c99083765b5207086b9a7" + integrity sha512-gqkpvjkgFUu+s3kP+Ly33OKpo5zvVY3FDFhv5BIb98SncS3KD6DNxPfNDjwHIoyXbz1leWo1j8DtRLZ1D2Jv+Q== + dependencies: + "@types/throttle-debounce" "^2.1.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@rollup/pluginutils@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.2.tgz#ed5821c15e5e05e32816f5fb9ec607cdf5a75751" + integrity sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@sveltejs/vite-plugin-svelte@^1.0.0-next.30": + version "1.0.0-next.37" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz#bb553425a3f9b780221134b04b9ace4165279d3c" + integrity sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA== + dependencies: + "@rollup/pluginutils" "^4.1.2" + debug "^4.3.3" + kleur "^4.1.4" + magic-string "^0.25.7" + svelte-hmr "^0.14.9" + +"@tsconfig/svelte@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-2.0.1.tgz#0e8d7caa693e9b2afce5e622c0475bb0fd89c12c" + integrity sha512-aqkICXbM1oX5FfgZd2qSSAGdyo/NRxjWCamxoyi3T8iVQnzGge19HhDYzZ6NrVOW7bhcWNSq9XexWFtMzbB24A== + +"@types/node@*": + version "17.0.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" + integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== + +"@types/pug@^2.0.4": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" + integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + +"@types/sass@^1.16.0": + version "1.43.1" + resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.43.1.tgz#86bb0168e9e881d7dade6eba16c9ed6d25dc2f68" + integrity sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g== + dependencies: + "@types/node" "*" + +"@types/throttle-debounce@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" + integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== + +"@windicss/config@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@windicss/config/-/config-1.7.1.tgz#f0c432796bff75bad58c72f168329fbe34619025" + integrity sha512-bT4Ze8d1kTKbVdQZ7yal9vjhIfuYypco2gVTy4OXvg6eAHFNZaOB/Ai4FqdRKvbgOqChHGiC32r5J55hmq6tDw== + dependencies: + debug "^4.3.3" + jiti "^1.12.9" + windicss "^3.4.3" + +"@windicss/plugin-utils@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@windicss/plugin-utils/-/plugin-utils-1.7.1.tgz#f1d5ac3d0d437d88c93ee4ea575c41907537523d" + integrity sha512-VMBLZ11s5kQt1RIIwfB45xFswb+SI1cvI5mK07dUSlfpomG1d1bqnB57bioo/jFNZh2Rl8wVnEvLTl7iZ4r09Q== + dependencies: + "@antfu/utils" "^0.4.0" + "@windicss/config" "1.7.1" + debug "^4.3.3" + fast-glob "^3.2.11" + magic-string "^0.25.7" + micromatch "^4.0.4" + windicss "^3.4.3" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chokidar@^3.4.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +debug@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +dedent-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dedent-js/-/dedent-js-1.0.1.tgz#bee5fb7c9e727d85dffa24590d10ec1ab1255305" + integrity sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU= + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +esbuild-android-arm64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.23.tgz#c89b3c50b4f47668dcbeb0b34ee4615258818e71" + integrity sha512-k9sXem++mINrZty1v4FVt6nC5BQCFG4K2geCIUUqHNlTdFnuvcqsY7prcKZLFhqVC1rbcJAr9VSUGFL/vD4vsw== + +esbuild-darwin-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.23.tgz#1c131e8cb133ed935ca32f824349a117c896a15b" + integrity sha512-lB0XRbtOYYL1tLcYw8BoBaYsFYiR48RPrA0KfA/7RFTr4MV7Bwy/J4+7nLsVnv9FGuQummM3uJ93J3ptaTqFug== + +esbuild-darwin-arm64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.23.tgz#3c6245a50109dd84953f53d7833bd3b4f0e8c6fa" + integrity sha512-yat73Z/uJ5tRcfRiI4CCTv0FSnwErm3BJQeZAh+1tIP0TUNh6o+mXg338Zl5EKChD+YGp6PN+Dbhs7qa34RxSw== + +esbuild-freebsd-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.23.tgz#0cdc54e72d3dd9cd992f9c2960055e68a7f8650c" + integrity sha512-/1xiTjoLuQ+LlbfjJdKkX45qK/M7ARrbLmyf7x3JhyQGMjcxRYVR6Dw81uH3qlMHwT4cfLW4aEVBhP1aNV7VsA== + +esbuild-freebsd-arm64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.23.tgz#1d11faed3a0c429e99b7dddef84103eb509788b2" + integrity sha512-uyPqBU/Zcp6yEAZS4LKj5jEE0q2s4HmlMBIPzbW6cTunZ8cyvjG6YWpIZXb1KK3KTJDe62ltCrk3VzmWHp+iLg== + +esbuild-linux-32@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.23.tgz#fd9f033fc27dcab61100cb1eb1c936893a68c841" + integrity sha512-37R/WMkQyUfNhbH7aJrr1uCjDVdnPeTHGeDhZPUNhfoHV0lQuZNCKuNnDvlH/u/nwIYZNdVvz1Igv5rY/zfrzQ== + +esbuild-linux-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.23.tgz#c04c438514f1359ecb1529205d0c836d4165f198" + integrity sha512-H0gztDP60qqr8zoFhAO64waoN5yBXkmYCElFklpd6LPoobtNGNnDe99xOQm28+fuD75YJ7GKHzp/MLCLhw2+vQ== + +esbuild-linux-arm64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.23.tgz#d1b3ab2988ab0734886eb9e811726f7db099ab96" + integrity sha512-c4MLOIByNHR55n3KoYf9hYDfBRghMjOiHLaoYLhkQkIabb452RWi+HsNgB41sUpSlOAqfpqKPFNg7VrxL3UX9g== + +esbuild-linux-arm@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.23.tgz#df7558b6a5076f5eb9fd387c8704f768b61d97fb" + integrity sha512-x64CEUxi8+EzOAIpCUeuni0bZfzPw/65r8tC5cy5zOq9dY7ysOi5EVQHnzaxS+1NmV+/RVRpmrzGw1QgY2Xpmw== + +esbuild-linux-mips64le@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.23.tgz#bb4c47fccc9493d460ffeb1f88e8a97a98a14f8b" + integrity sha512-kHKyKRIAedYhKug2EJpyJxOUj3VYuamOVA1pY7EimoFPzaF3NeY7e4cFBAISC/Av0/tiV0xlFCt9q0HJ68IBIw== + +esbuild-linux-ppc64le@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.23.tgz#a332dbc8a1b4e30cfe1261bfaa5cef57c9c8c02a" + integrity sha512-7ilAiJEPuJJnJp/LiDO0oJm5ygbBPzhchJJh9HsHZzeqO+3PUzItXi+8PuicY08r0AaaOe25LA7sGJ0MzbfBag== + +esbuild-linux-riscv64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.23.tgz#85675f3f931f5cd7cfb238fd82f77a62ffcb6d86" + integrity sha512-fbL3ggK2wY0D8I5raPIMPhpCvODFE+Bhb5QGtNP3r5aUsRR6TQV+ZBXIaw84iyvKC8vlXiA4fWLGhghAd/h/Zg== + +esbuild-linux-s390x@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.23.tgz#a526282a696e6d846f4c628f5315475518c0c0f0" + integrity sha512-GHMDCyfy7+FaNSO8RJ8KCFsnax8fLUsOrj9q5Gi2JmZMY0Zhp75keb5abTFCq2/Oy6KVcT0Dcbyo/bFb4rIFJA== + +esbuild-netbsd-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.23.tgz#8e456605694719aa1be4be266d6cd569c06dfaf5" + integrity sha512-ovk2EX+3rrO1M2lowJfgMb/JPN1VwVYrx0QPUyudxkxLYrWeBxDKQvc6ffO+kB4QlDyTfdtAURrVzu3JeNdA2g== + +esbuild-openbsd-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.23.tgz#f2fc51714b4ddabc86e4eb30ca101dd325db2f7d" + integrity sha512-uYYNqbVR+i7k8ojP/oIROAHO9lATLN7H2QeXKt2H310Fc8FJj4y3Wce6hx0VgnJ4k1JDrgbbiXM8rbEgQyg8KA== + +esbuild-sunos-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.23.tgz#a408f33ea20e215909e20173a0fd78b1aaad1f8e" + integrity sha512-hAzeBeET0+SbScknPzS2LBY6FVDpgE+CsHSpe6CEoR51PApdn2IB0SyJX7vGelXzlyrnorM4CAsRyb9Qev4h9g== + +esbuild-windows-32@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.23.tgz#b9005bbff54dac3975ff355d5de2b5e37165d128" + integrity sha512-Kttmi3JnohdaREbk6o9e25kieJR379TsEWF0l39PQVHXq3FR6sFKtVPgY8wk055o6IB+rllrzLnbqOw/UV60EA== + +esbuild-windows-64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.23.tgz#2b5a99befeaca6aefdad32d738b945730a60a060" + integrity sha512-JtIT0t8ymkpl6YlmOl6zoSWL5cnCgyLaBdf/SiU/Eg3C13r0NbHZWNT/RDEMKK91Y6t79kTs3vyRcNZbfu5a8g== + +esbuild-windows-arm64@0.14.23: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.23.tgz#edc560bbadb097eb45fc235aeacb942cb94a38c0" + integrity sha512-cTFaQqT2+ik9e4hePvYtRZQ3pqOvKDVNarzql0VFIzhc0tru/ZgdLoXd6epLiKT+SzoSce6V9YJ+nn6RCn6SHw== + +esbuild@^0.14.14: + version "0.14.23" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.23.tgz#95e842cb22bc0c7d82c140adc16788aac91469fe" + integrity sha512-XjnIcZ9KB6lfonCa+jRguXyRYcldmkyZ99ieDksqW/C8bnyEX299yA4QH2XcgijCgaddEZePPTgvx/2imsq7Ig== + optionalDependencies: + esbuild-android-arm64 "0.14.23" + esbuild-darwin-64 "0.14.23" + esbuild-darwin-arm64 "0.14.23" + esbuild-freebsd-64 "0.14.23" + esbuild-freebsd-arm64 "0.14.23" + esbuild-linux-32 "0.14.23" + esbuild-linux-64 "0.14.23" + esbuild-linux-arm "0.14.23" + esbuild-linux-arm64 "0.14.23" + esbuild-linux-mips64le "0.14.23" + esbuild-linux-ppc64le "0.14.23" + esbuild-linux-riscv64 "0.14.23" + esbuild-linux-s390x "0.14.23" + esbuild-netbsd-64 "0.14.23" + esbuild-openbsd-64 "0.14.23" + esbuild-sunos-64 "0.14.23" + esbuild-windows-32 "0.14.23" + esbuild-windows-64 "0.14.23" + esbuild-windows-arm64 "0.14.23" + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +fast-glob@^3.2.11, fast-glob@^3.2.7: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.3: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +jiti@^1.12.9: + version "1.13.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.13.0.tgz#3cdfc4e651ca0cca4c62ed5e47747b5841d41a8e" + integrity sha512-/n9mNxZj/HDSrincJ6RP+L+yXbpnB8FybySBa+IjIaoH9FIxBbrbRT5XUbe8R7zuVM2AQqNMNDDqz0bzx3znOQ== + +kleur@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" + integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== + +kolorist@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.5.1.tgz#c3d66dc4fabde4f6b7faa6efda84c00491f9e52b" + integrity sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ== + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +pascal-case@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postcss@^8.4.6: + version "8.4.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1" + integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA== + dependencies: + nanoid "^3.2.0" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.5.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rollup@^2.59.0: + version "2.67.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.67.3.tgz#3f04391fc296f807d067c9081d173e0a33dbd37e" + integrity sha512-G/x1vUwbGtP6O5ZM8/sWr8+p7YfZhI18pPqMRtMYMWSbHjKZ/ajHGiM+GWNTlWyOR0EHIdT8LHU+Z4ciIZ1oBw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +sade@^1.7.4: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + integrity sha1-dB4kXiMfB8r7b98PEzrfohalAq0= + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + integrity sha1-iukK19fLBfxZ8asMY3hF1cFaUrc= + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svelte-check@^2.2.7: + version "2.4.5" + resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-2.4.5.tgz#a2001993034d495118980bd95577fb3e7980661a" + integrity sha512-nRft8BbG2wcxyCdHDZ7X43xLcvDzua3xLwq6wzHGcAF3ka3Jyhv2rvgq0+SF9NwHLMefp9C2XkM6etzsxK/cMQ== + dependencies: + chokidar "^3.4.1" + fast-glob "^3.2.7" + import-fresh "^3.2.1" + minimist "^1.2.5" + picocolors "^1.0.0" + sade "^1.7.4" + source-map "^0.7.3" + svelte-preprocess "^4.0.0" + typescript "*" + +svelte-hmr@^0.14.9: + version "0.14.9" + resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.9.tgz#35f277efc789e1a6230185717347cddb2f8e9833" + integrity sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg== + +svelte-navigator@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/svelte-navigator/-/svelte-navigator-3.1.5.tgz#f79d78b2c2c5ad907d8b1d3748d3fbe12c32195c" + integrity sha512-CGTaexasSLpUaTSN2AlYqii0JeisIgg7uZbm8XCLKlpM9Qv3IltlJ7Nvh90Xw9ND97KqtGOjNJ3LNwMN1ABV0w== + dependencies: + svelte2tsx "^0.1.151" + +svelte-preprocess@^4.0.0, svelte-preprocess@^4.9.8: + version "4.10.3" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.10.3.tgz#9aac89a8abc3889fa5740fb34f7dd74f3c578e13" + integrity sha512-ttw17lJfb/dx2ZJT9sesaXT5l7mPQ9Apx1H496Kli3Hkk7orIRGpOw6rCPkRNzr6ueVPqb4vzodS5x7sBFhKHw== + dependencies: + "@types/pug" "^2.0.4" + "@types/sass" "^1.16.0" + detect-indent "^6.0.0" + magic-string "^0.25.7" + sorcery "^0.10.0" + strip-indent "^3.0.0" + +svelte2tsx@^0.1.151: + version "0.1.193" + resolved "https://registry.yarnpkg.com/svelte2tsx/-/svelte2tsx-0.1.193.tgz#16fe594898ef455e4f715ac317d219c9c757656b" + integrity sha512-vzy4YQNYDnoqp2iZPnJy7kpPAY6y121L0HKrSBjU/IWW7DQ6T7RMJed2VVHFmVYm0zAGYMDl9urPc6R4DDUyhg== + dependencies: + dedent-js "^1.0.1" + pascal-case "^3.1.1" + +svelte@^3.44.0: + version "3.46.4" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.46.4.tgz#0c46bc4a3e20a2617a1b7dc43a722f9d6c084a38" + integrity sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^2.0.3, tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +typescript@*, typescript@^4.5.4: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +vite-plugin-windicss@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/vite-plugin-windicss/-/vite-plugin-windicss-1.7.1.tgz#23fadfcb400bd0d7e991d0264f547f499bd57ddc" + integrity sha512-eEDeTPaeQAfe0widkTkm9X51BVpOE/yDIuFbULIKjXI7CfY1yjsPcxA6E3aZbLBYQcUmfhVUTYVaH5iAE5L8Hg== + dependencies: + "@windicss/plugin-utils" "1.7.1" + debug "^4.3.3" + kolorist "^1.5.1" + windicss "^3.4.3" + +vite@^2.8.0: + version "2.8.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.8.4.tgz#4e52a534289b7b4e94e646df2fc5556ceaa7336b" + integrity sha512-GwtOkkaT2LDI82uWZKcrpRQxP5tymLnC7hVHHqNkhFNknYr0hJUlDLfhVRgngJvAy3RwypkDCWtTKn1BjO96Dw== + dependencies: + esbuild "^0.14.14" + postcss "^8.4.6" + resolve "^1.22.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +windicss@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/windicss/-/windicss-3.4.3.tgz#347d09fee8eb6b3fc5e6e68b435c76ccb24a748c" + integrity sha512-UnugThsvEgy8RsPm4/B5DYMCAqvZzD6yWU7Anh+f07t5RSJ8zvmAylGLbXrHPJEmCKzo2Mf+fOUvISH7IJqM3A== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= diff --git a/desktop/package.json b/desktop/package.json index 5b501f49..d29f240c 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -8,7 +8,8 @@ "scripts": { "build": "tsup-node ./src/main.ts ./src/preload-local-app/preload.ts ./src/preload-app/preload.ts", "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", - "bundle": "electron-builder install-app-deps && electron-builder", + "build:local-app": "cd local-app && yarn build", + "bundle": "yarn build:local-app && yarn build && electron-builder install-app-deps && electron-builder", "release": "yarn bundle", "typecheck": "tsc --noEmit", "test": "exit 0", @@ -21,6 +22,7 @@ "auto-launch": "^5.0.5", "electron-is-dev": "^2.0.0", "electron-log": "^4.4.6", + "electron-serve": "^1.1.0", "electron-settings": "^4.0.2", "electron-updater": "^4.6.5", "electron-util": "^0.17.2", diff --git a/desktop/src/app.ts b/desktop/src/app.ts index c3ccb23f..26b1d57a 100644 --- a/desktop/src/app.ts +++ b/desktop/src/app.ts @@ -7,6 +7,7 @@ import updateAutoLaunch from "./update-auto-launch"; import ipc, { emitMutedKeyPress } from "./ipc"; import settings from "./settings"; import { setLogLevel } from "./log"; +import "./serve"; // prepare custom url scheme function init() { const appLock = app.requestSingleInstanceLock(); @@ -44,17 +45,18 @@ function init() { // enable auto launch updateAutoLaunch(); + // load ipc handler + ipc(); + // Don't show the app in the doc // if (app.dock) { // app.dock.hide(); // } - createWindow(); + await createWindow(); createTray(); - // load ipc handler - ipc(); - + // TODO globalShortcut.register("Alt+CommandOrControl+M", () => { emitMutedKeyPress(); }); diff --git a/desktop/src/ipc.ts b/desktop/src/ipc.ts index ff993757..e8568c83 100644 --- a/desktop/src/ipc.ts +++ b/desktop/src/ipc.ts @@ -1,7 +1,9 @@ import { ipcMain } from "electron"; +import electronIsDev from "electron-is-dev"; import { createAndShowNotification } from "./notification"; +import { Server } from "./preload-local-app/types"; import settings from "./settings"; -import { getAppView, getWindow, showAppView } from "./window"; +import { getWindow, hideAppView, showAppView } from "./window"; export function emitMutedKeyPress() { const mainWindow = getWindow(); @@ -13,36 +15,31 @@ export function emitMutedKeyPress() { } export default () => { + ipcMain.handle("is-development", () => electronIsDev); + + // app ipc ipcMain.on("app:notify", (event, txt) => { createAndShowNotification({ body: txt }); }); + // local-app ipc + ipcMain.handle("local-app:showLocalApp", () => { + hideAppView(); + }); + ipcMain.handle("local-app:getServers", () => { - // TODO: remove - if (!settings.get("servers")) { - settings.set("servers", [ + return ( + settings.get("servers") || [ { _id: "1", name: "WA Demo", url: "https://play.staging.workadventu.re/@/tcm/workadventure/wa-village", }, - { - _id: "2", - name: "My Server", - url: "http://play.workadventure.localhost/", - }, - ]); - } - - return settings.get("servers") || []; + ] + ); }); ipcMain.handle("local-app:selectServer", (event, serverId: string) => { - const appView = getAppView(); - if (!appView) { - throw new Error("App view not found"); - } - const servers = settings.get("servers") || []; const selectedServer = servers.find((s) => s._id === serverId); @@ -54,14 +51,23 @@ export default () => { return true; }); - ipcMain.handle("local-app:addServer", (event, serverName: string, serverUrl: string) => { + ipcMain.handle("local-app:addServer", (event, server: Omit) => { const servers = settings.get("servers") || []; - servers.push({ + const newServer = { + ...server, _id: `${servers.length + 1}`, - name: serverName, - url: serverUrl, - }); + }; + servers.push(newServer); settings.set("servers", servers); + return newServer; + }); + + ipcMain.handle("local-app:removeServer", (event, server: Server) => { + const servers = settings.get("servers") || []; + settings.set( + "servers", + servers.filter((s) => s._id !== server._id) + ); return true; }); }; diff --git a/desktop/src/preload-app/preload.ts b/desktop/src/preload-app/preload.ts index d4a8682c..860fee5a 100644 --- a/desktop/src/preload-app/preload.ts +++ b/desktop/src/preload-app/preload.ts @@ -3,6 +3,7 @@ import type { WorkAdventureDesktopApi } from "./types"; const api: WorkAdventureDesktopApi = { desktop: true, + isDevelopment: () => ipcRenderer.invoke("is-development"), notify: (txt: string) => ipcRenderer.send("app:notify", txt), onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => ipcRenderer.on("app:on-muted-key-press", callback), diff --git a/desktop/src/preload-app/types.ts b/desktop/src/preload-app/types.ts index 263af35b..df08c97c 100644 --- a/desktop/src/preload-app/types.ts +++ b/desktop/src/preload-app/types.ts @@ -2,6 +2,7 @@ import type { IpcRendererEvent } from "electron"; export type WorkAdventureDesktopApi = { desktop: boolean; + isDevelopment: () => Promise; notify: (txt: string) => void; onMutedKeyPress: (callback: (event: IpcRendererEvent) => void) => void; }; diff --git a/desktop/src/preload-local-app/preload.ts b/desktop/src/preload-local-app/preload.ts index 32e63575..527085aa 100644 --- a/desktop/src/preload-local-app/preload.ts +++ b/desktop/src/preload-local-app/preload.ts @@ -1,12 +1,14 @@ import { contextBridge, ipcRenderer } from "electron"; -import type { WorkAdventureLocalAppApi } from "./types"; +import type { Server, WorkAdventureLocalAppApi } from "./types"; const api: WorkAdventureLocalAppApi = { desktop: true, + isDevelopment: () => ipcRenderer.invoke("is-development"), + showLocalApp: () => ipcRenderer.invoke("local-app:showLocalApp"), getServers: () => ipcRenderer.invoke("local-app:getServers"), selectServer: (serverId: string) => ipcRenderer.invoke("local-app:selectServer", serverId), - addServer: (serverName: string, serverUrl: string) => - ipcRenderer.invoke("local-app:addServer", serverName, serverUrl), + addServer: (server: Omit) => ipcRenderer.invoke("local-app:addServer", server), + removeServer: (serverId: Server["_id"]) => ipcRenderer.invoke("local-app:removeServer", serverId), }; contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/src/preload-local-app/types.ts b/desktop/src/preload-local-app/types.ts index 2d28697b..8e9f6a2d 100644 --- a/desktop/src/preload-local-app/types.ts +++ b/desktop/src/preload-local-app/types.ts @@ -6,7 +6,10 @@ export type Server = { export type WorkAdventureLocalAppApi = { desktop: boolean; + isDevelopment: () => Promise; + showLocalApp: () => Promise; getServers: () => Promise; selectServer: (serverId: string) => Promise; - addServer: (serverName: string, serverUrl: string) => Promise; + addServer: (server: Omit) => Promise; + removeServer: (serverId: Server["_id"]) => Promise; }; diff --git a/desktop/src/serve.ts b/desktop/src/serve.ts new file mode 100644 index 00000000..8cc0590e --- /dev/null +++ b/desktop/src/serve.ts @@ -0,0 +1,9 @@ +import { BrowserWindow } from "electron"; +import serve from "electron-serve"; +import path from "path"; + +let customScheme = serve({ directory: path.resolve(__dirname, "..", "local-app", "dist") }); + +export async function loadCustomScheme(window: BrowserWindow) { + await customScheme(window); +} diff --git a/desktop/src/tray.ts b/desktop/src/tray.ts index 9205ee85..6cf45a2b 100644 --- a/desktop/src/tray.ts +++ b/desktop/src/tray.ts @@ -74,6 +74,4 @@ export function createTray() { mainWindow.show(); }); - - return tray; } diff --git a/desktop/src/window.ts b/desktop/src/window.ts index 5bf6708e..122270f9 100644 --- a/desktop/src/window.ts +++ b/desktop/src/window.ts @@ -1,6 +1,8 @@ import { BrowserView, BrowserWindow } from "electron"; +import electronIsDev from "electron-is-dev"; import windowStateKeeper from "electron-window-state"; import path from "path"; +import { loadCustomScheme } from "./serve"; let mainWindow: BrowserWindow | undefined; let appView: BrowserView | undefined; @@ -15,7 +17,7 @@ export function getAppView() { return appView; } -export function createWindow() { +export async function createWindow() { // do not re-create window if still existing if (mainWindow) { return; @@ -84,18 +86,26 @@ export function createWindow() { }); mainWindow.once("ready-to-show", () => { - // appView?.webContents.openDevTools({ - // mode: "detach", - // }); mainWindow?.show(); - // mainWindow?.webContents.openDevTools({ mode: "detach" }); + if (electronIsDev) { + // appView?.webContents.openDevTools({ + // mode: "detach", + // }); + mainWindow?.webContents.openDevTools({ mode: "detach" }); + } }); mainWindow.webContents.on("did-finish-load", () => { mainWindow?.setTitle("WorkAdventure Desktop"); }); - mainWindow.loadFile(path.resolve(__dirname, "..", "local-app", "index.html")); + if (electronIsDev && process.env.LOCAL_APP_URL) { + await mainWindow.loadURL(process.env.LOCAL_APP_URL); + } else { + // load custom url scheme app:// + await loadCustomScheme(mainWindow); + await mainWindow.loadURL("app://-"); + } } export function showAppView(url?: string) { diff --git a/desktop/yarn.lock b/desktop/yarn.lock index cc783a6d..44c6ad47 100644 --- a/desktop/yarn.lock +++ b/desktop/yarn.lock @@ -1035,6 +1035,11 @@ electron-publish@22.14.13: lazy-val "^1.0.5" mime "^2.5.2" +electron-serve@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/electron-serve/-/electron-serve-1.1.0.tgz#507f56c8512c501880d3a9bec792fa92512af378" + integrity sha512-tQJBCbXKoKCfkBC143QCqnEtT1s8dNE2V+b/82NF6lxnGO/2Q3a3GSLHtKl3iEDQgdzTf9pH7p418xq2rXbz1Q== + electron-settings@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/electron-settings/-/electron-settings-4.0.2.tgz#26ef242397393e0e69119f6fb879fc2287d0f508" From 05d7f64d1dc6a38fe870bf91dfcd87c967667899 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sun, 20 Feb 2022 20:44:55 +0100 Subject: [PATCH 025/116] fix ci --- .github/workflows/build-and-release-desktop.yml | 8 ++++++++ desktop/package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-release-desktop.yml b/.github/workflows/build-and-release-desktop.yml index c6bc3c04..e2716929 100644 --- a/.github/workflows/build-and-release-desktop.yml +++ b/.github/workflows/build-and-release-desktop.yml @@ -52,6 +52,14 @@ jobs: restore-keys: | ${{ runner.OS }}-yarn- + - name: "local-app: Install dependencies" + run: yarn install --froze-lockfile + working-directory: "desktop/local-app" + + - name: "local-app: Build" + run: yarn build + working-directory: "desktop/local-app" + - name: "Install dependencies" run: yarn install --froze-lockfile working-directory: "desktop" diff --git a/desktop/package.json b/desktop/package.json index d29f240c..e4372914 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "tsup-node ./src/main.ts ./src/preload-local-app/preload.ts ./src/preload-app/preload.ts", "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", - "build:local-app": "cd local-app && yarn build", + "build:local-app": "cd local-app && yarn && yarn build", "bundle": "yarn build:local-app && yarn build && electron-builder install-app-deps && electron-builder", "release": "yarn bundle", "typecheck": "tsc --noEmit", From 4337264157b71802d946ab54de785eafc96047eb Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sun, 20 Feb 2022 21:06:27 +0100 Subject: [PATCH 026/116] cleanup --- desktop/README.md | 28 ++++++++++++- desktop/local-app/index.html | 50 ++++++++++++----------- desktop/local-app/index.js | 20 --------- desktop/local-app/package.json | 2 +- desktop/local-app/src/App.svelte | 9 ++++ desktop/local-app/src/assets/svelte.png | Bin 5185 -> 0 bytes desktop/local-app/src/lib/Sidebar.svelte | 7 ---- desktop/package.json | 3 +- 8 files changed, 64 insertions(+), 55 deletions(-) delete mode 100644 desktop/local-app/index.js delete mode 100644 desktop/local-app/src/assets/svelte.png diff --git a/desktop/README.md b/desktop/README.md index 6cc24f1d..4fac65f5 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -11,12 +11,36 @@ The desktop component is an electron app. It uses a hybrid setup based of two ma ```bash # start local-app -cd local-app/ -yarn dev +yarn dev:local-app # start electron app LOCAL_APP_URL=http://localhost:3000 yarn dev # or create an executable by running: yarn bundle +``` + +## API for front + +TODO: + +```ts +if (window?.WorkAdventureDesktopApi?.desktop) { + alert('Yeah you are using the desktop app ;)'); +} + +let muted = false; + +window?.WorkAdventureDesktopApi?.onMutedKeyPress((event) => { + if (muted) { + document.getElementById("info-box").innerHTML = + "Ready to speak! Press ctrl-alt-m to mute."; + } else { + document.getElementById("info-box").innerHTML = + "Muted! Press ctrl-alt-m to unmute again."; + } + muted = !muted; +}); + +window.WorkAdventureDesktopApi.notify("Hello from front"); ``` \ No newline at end of file diff --git a/desktop/local-app/index.html b/desktop/local-app/index.html index 0cf06db5..4eef13fd 100644 --- a/desktop/local-app/index.html +++ b/desktop/local-app/index.html @@ -1,29 +1,31 @@ - - - - - WorkAdventure Desktop - - - -
- - + #app { + display: flex; + } + + + +
+ + diff --git a/desktop/local-app/index.js b/desktop/local-app/index.js deleted file mode 100644 index 337e0bd5..00000000 --- a/desktop/local-app/index.js +++ /dev/null @@ -1,20 +0,0 @@ -// let muted = false; - -document.getElementById("btn-reload").onclick = () => { - location.reload(); -}; - -// window?.WorkAdventureDesktopApi?.onMutedKeyPress((event) => { -// if (muted) { -// document.getElementById("demo").innerHTML = -// "Ready to speak! Press ctrl-alt-m to mute."; -// } else { -// document.getElementById("demo").innerHTML = -// "Muted! Press ctrl-alt-m to unmute again."; -// } -// muted = !muted; -// }); - -// document.getElementById("btn-api").onclick = () => { -// window.WorkAdventureDesktopApi.notify("Hello from website"); -// }; diff --git a/desktop/local-app/package.json b/desktop/local-app/package.json index 961e1caf..e1110d73 100644 --- a/desktop/local-app/package.json +++ b/desktop/local-app/package.json @@ -8,7 +8,7 @@ "build": "vite build", "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json", - "pretty": "yarn prettier --write 'src/**/*.{ts,tsx}'", + "pretty": "yarn prettier --write 'src/**/*.{ts,tsx,svelte}'", "pretty-check": "yarn prettier --check 'src/**/*.{ts,tsx}'" }, "devDependencies": { diff --git a/desktop/local-app/src/App.svelte b/desktop/local-app/src/App.svelte index 9abbfaf0..31697514 100644 --- a/desktop/local-app/src/App.svelte +++ b/desktop/local-app/src/App.svelte @@ -34,6 +34,15 @@ } main { + /* TODO */ background-color: #30343d; + + /* background-color: #2b2f37; */ + + /* color: #62727c; + border: 1px solid #62727c; */ + + /* border-color: #e1e4e8; + color: #e1e4e8; */ } diff --git a/desktop/local-app/src/assets/svelte.png b/desktop/local-app/src/assets/svelte.png deleted file mode 100644 index e673c91c7bcb0e3a1be737745af56990613a641e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5185 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 diff --git a/desktop/local-app/src/lib/Sidebar.svelte b/desktop/local-app/src/lib/Sidebar.svelte index ab1ca92d..bea59715 100644 --- a/desktop/local-app/src/lib/Sidebar.svelte +++ b/desktop/local-app/src/lib/Sidebar.svelte @@ -38,12 +38,5 @@ diff --git a/desktop/package.json b/desktop/package.json index e4372914..57d76e63 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -7,8 +7,9 @@ "license": "SEE LICENSE IN LICENSE.txt", "scripts": { "build": "tsup-node ./src/main.ts ./src/preload-local-app/preload.ts ./src/preload-app/preload.ts", - "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", "build:local-app": "cd local-app && yarn && yarn build", + "dev": "yarn build --watch --onSuccess 'yarn electron dist/main.js'", + "dev:local-app": "cd local-app && yarn && yarn dev", "bundle": "yarn build:local-app && yarn build && electron-builder install-app-deps && electron-builder", "release": "yarn bundle", "typecheck": "tsc --noEmit", From 0f910693ef51ec993f3a4da731b79c59f9472e79 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sun, 20 Feb 2022 21:09:15 +0100 Subject: [PATCH 027/116] add ci --- .github/workflows/continuous_integration.yml | 38 ++++++++++++++++++++ desktop/local-app/package.json | 2 ++ 2 files changed, 40 insertions(+) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index ed0a6333..8d5acc8b 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -203,3 +203,41 @@ jobs: - name: "Prettier" run: yarn pretty-check working-directory: "desktop" + + continuous-integration-desktop-local-app: + name: "Continuous Integration Desktop Local App" + + runs-on: "ubuntu-latest" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2.0.0" + + - name: "Setup NodeJS" + uses: actions/setup-node@v1 + with: + node-version: '14.x' + + - name: "Install dependencies" + run: yarn install --froze-lockfile + working-directory: "desktop/local-app" + + - name: "Build" + run: yarn build + working-directory: "desktop/local-app" + + - name: "Typecheck" + run: yarn check + working-directory: "desktop/local-app" + + - name: "Lint" + run: yarn lint + working-directory: "desktop/local-app" + + - name: "Jasmine" + run: yarn test + working-directory: "desktop/local-app" + + - name: "Prettier" + run: yarn pretty-check + working-directory: "desktop/local-app" \ No newline at end of file diff --git a/desktop/local-app/package.json b/desktop/local-app/package.json index e1110d73..5d264a46 100644 --- a/desktop/local-app/package.json +++ b/desktop/local-app/package.json @@ -8,6 +8,8 @@ "build": "vite build", "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json", + "lint": "exit 0", + "test": "exit 0", "pretty": "yarn prettier --write 'src/**/*.{ts,tsx,svelte}'", "pretty-check": "yarn prettier --check 'src/**/*.{ts,tsx}'" }, From 6844e0d39d623d1186382c40616319cce4e5ca89 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Sun, 20 Feb 2022 21:51:55 +0100 Subject: [PATCH 028/116] improve style --- desktop/local-app/index.html | 13 +++++++++++++ desktop/local-app/src/lib/Sidebar.svelte | 14 ++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/desktop/local-app/index.html b/desktop/local-app/index.html index 4eef13fd..6065affb 100644 --- a/desktop/local-app/index.html +++ b/desktop/local-app/index.html @@ -22,6 +22,19 @@ #app { display: flex; } + + *::-webkit-scrollbar { + width: 10px; + height: 10px; + } + *::-webkit-scrollbar-track { + background-color: transparent; + border-radius: 10px; + } + *::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.4); + border-radius: 10px; + } diff --git a/desktop/local-app/src/lib/Sidebar.svelte b/desktop/local-app/src/lib/Sidebar.svelte index bea59715..67736f2e 100644 --- a/desktop/local-app/src/lib/Sidebar.svelte +++ b/desktop/local-app/src/lib/Sidebar.svelte @@ -5,6 +5,12 @@ let isDevelopment = false; + function getServerColor(i: number) { + const serverColors = ['bg-red-400', 'bg-yellow-500', 'bg-green-500', 'bg-blue-500', 'bg-indigo-500', 'bg-purple-500']; + + return serverColors[i % serverColors.length]; + } + onMount(async () => { await loadServers(); isDevelopment = await window?.WorkAdventureDesktopApi?.isDevelopment(); @@ -12,16 +18,16 @@ diff --git a/desktop/local-app/src/views/Home.svelte b/desktop/local-app/src/views/Home.svelte index f3603e00..3175be49 100644 --- a/desktop/local-app/src/views/Home.svelte +++ b/desktop/local-app/src/views/Home.svelte @@ -1,7 +1,7 @@ {#if insideElectron} diff --git a/desktop/local-app/src/lib/Link.svelte b/desktop/local-app/src/lib/Link.svelte index 41f1de79..d5d9ff46 100644 --- a/desktop/local-app/src/lib/Link.svelte +++ b/desktop/local-app/src/lib/Link.svelte @@ -1,5 +1,6 @@ diff --git a/desktop/local-app/src/lib/Sidebar.svelte b/desktop/local-app/src/lib/Sidebar.svelte index b0ec6333..d1e1929b 100644 --- a/desktop/local-app/src/lib/Sidebar.svelte +++ b/desktop/local-app/src/lib/Sidebar.svelte @@ -2,8 +2,9 @@ import { onMount } from "svelte"; import Link from "~/lib/Link.svelte"; - import { servers, selectedServer, selectServer, loadServers, Server } from "../store"; + import { servers, selectedServer, selectServer, loadServers } from "~/store"; import CogIcon from "~/assets/nes.icons/cog.svg"; + import { api } from "~/lib/ipc"; let isDevelopment = false; @@ -26,7 +27,7 @@ onMount(async () => { await loadServers(); - isDevelopment = await window?.WorkAdventureDesktopApi?.isDevelopment(); + isDevelopment = await api.isDevelopment(); }); diff --git a/desktop/local-app/src/lib/ipc.ts b/desktop/local-app/src/lib/ipc.ts new file mode 100644 index 00000000..217120b2 --- /dev/null +++ b/desktop/local-app/src/lib/ipc.ts @@ -0,0 +1,5 @@ +import type { WorkAdventureLocalAppApi, SettingsData, Server } from "@wa-preload-local-app"; + +export { WorkAdventureLocalAppApi, SettingsData, Server }; +// TODO fix type +export const api = (window as any)?.WorkAdventureDesktopApi as WorkAdventureLocalAppApi; diff --git a/desktop/local-app/src/store.ts b/desktop/local-app/src/store.ts index 76f9de20..fb1f27ff 100644 --- a/desktop/local-app/src/store.ts +++ b/desktop/local-app/src/store.ts @@ -1,10 +1,5 @@ import { writable, get } from "svelte/store"; - -export type Server = { - _id: string; - name: string; - url: string; -}; +import { api, Server } from "~/lib/ipc"; export const newServer = writable>({ name: "", @@ -14,15 +9,14 @@ export const servers = writable([]); export const selectedServer = writable(""); export async function selectServer(server: Server) { - await window.WorkAdventureDesktopApi.selectServer(server._id); + await api.selectServer(server._id); selectedServer.set(server._id); } export async function addServer() { - const addedServer = await window?.WorkAdventureDesktopApi?.addServer(get(newServer)); - if (!addedServer?._id) { - console.log(addedServer); - throw new Error(addedServer); + const addedServer = await api.addServer(get(newServer)); + if (addedServer instanceof Error) { + throw new Error(addedServer as unknown as string); } newServer.set({ name: "", url: "" }); servers.update((s) => [...s, addedServer]); @@ -30,5 +24,5 @@ export async function addServer() { } export async function loadServers() { - servers.set(await window.WorkAdventureDesktopApi.getServers()); + servers.set(await api.getServers()); } diff --git a/desktop/local-app/src/views/AddServer.svelte b/desktop/local-app/src/views/AddServer.svelte index 673452a1..9b7b0fe7 100644 --- a/desktop/local-app/src/views/AddServer.svelte +++ b/desktop/local-app/src/views/AddServer.svelte @@ -17,7 +17,6 @@
- diff --git a/desktop/local-app/src/views/Home.svelte b/desktop/local-app/src/views/Home.svelte index 3175be49..1fbacb0f 100644 --- a/desktop/local-app/src/views/Home.svelte +++ b/desktop/local-app/src/views/Home.svelte @@ -2,11 +2,12 @@ import { onMount } from "svelte"; import Logo from "~/../../electron/assets/icons/logo.svg"; + import { api } from "~/lib/ipc"; let version = ""; onMount(async () => { - version = await window?.WorkAdventureDesktopApi?.getVersion(); + version = await api.getVersion(); }); diff --git a/desktop/local-app/src/views/Settings.svelte b/desktop/local-app/src/views/Settings.svelte index 1d77c9e8..ca246b51 100644 --- a/desktop/local-app/src/views/Settings.svelte +++ b/desktop/local-app/src/views/Settings.svelte @@ -1,19 +1,33 @@ diff --git a/desktop/local-app/tsconfig.json b/desktop/local-app/tsconfig.json index 95b38cca..29d24a5f 100644 --- a/desktop/local-app/tsconfig.json +++ b/desktop/local-app/tsconfig.json @@ -15,7 +15,8 @@ "allowJs": true, "checkJs": true, "paths": { - "~/*": ["./*"] + "~/*": ["./src/*"], + "@wa-preload-local-app": ["../electron/src/preload-local-app/types.ts"], } }, "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], From 3f21befdc6347ac931cb59f55c70104fa6842670 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Tue, 22 Feb 2022 14:00:17 +0100 Subject: [PATCH 035/116] save auto-launch option, disable shortcuts in settings --- desktop/electron/src/ipc.ts | 12 ++-- .../electron/src/preload-local-app/preload.ts | 3 +- .../electron/src/preload-local-app/types.ts | 1 + desktop/electron/src/shortcuts.ts | 11 ++++ desktop/local-app/src/lib/ToggleSwitch.svelte | 13 +++- desktop/local-app/src/main.ts | 2 +- desktop/local-app/src/views/Settings.svelte | 60 ++++++++++--------- 7 files changed, 66 insertions(+), 36 deletions(-) diff --git a/desktop/electron/src/ipc.ts b/desktop/electron/src/ipc.ts index 2f6e7813..ba3619ce 100644 --- a/desktop/electron/src/ipc.ts +++ b/desktop/electron/src/ipc.ts @@ -3,7 +3,7 @@ import electronIsDev from "electron-is-dev"; import { createAndShowNotification } from "./notification"; import { Server } from "./preload-local-app/types"; import settings, { SettingsData } from "./settings"; -import { loadShortcuts, saveShortcut } from "./shortcuts"; +import { loadShortcuts, saveShortcut, setShortcutsEnabled } from "./shortcuts"; import { getWindow, hideAppView, showAppView } from "./window"; export function emitMuteToggle() { @@ -92,10 +92,14 @@ export default () => { return true; }); - ipcMain.handle("local-app:reloadShortcuts", (event, shortcut, key) => loadShortcuts()); + ipcMain.handle("local-app:reloadShortcuts", (event) => loadShortcuts()); ipcMain.handle("local-app:getSettings", (event) => settings.get() || {}); - ipcMain.handle("local-app:saveSetting", (event, key: T, value: SettingsData[T]) => - settings.set(key, value) + ipcMain.handle( + "local-app:saveSetting", + (event: Electron.IpcMainInvokeEvent, key: T, value: SettingsData[T]) => + settings.set(key, value) ); + + ipcMain.handle("local-app:setShortcutsEnabled", (event, enabled: boolean) => setShortcutsEnabled(enabled)); }; diff --git a/desktop/electron/src/preload-local-app/preload.ts b/desktop/electron/src/preload-local-app/preload.ts index b9570845..387bfc38 100644 --- a/desktop/electron/src/preload-local-app/preload.ts +++ b/desktop/electron/src/preload-local-app/preload.ts @@ -12,7 +12,8 @@ const api: WorkAdventureLocalAppApi = { removeServer: (serverId) => ipcRenderer.invoke("local-app:removeServer", serverId), reloadShortcuts: () => ipcRenderer.invoke("local-app:reloadShortcuts"), getSettings: () => ipcRenderer.invoke("local-app:getSettings"), - saveSetting: (key, value) => ipcRenderer.invoke("local-app:setSetting", key, value), + saveSetting: (key, value) => ipcRenderer.invoke("local-app:saveSetting", key, value), + setShortcutsEnabled: (enabled) => ipcRenderer.invoke("local-app:setShortcutsEnabled", enabled), }; contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); diff --git a/desktop/electron/src/preload-local-app/types.ts b/desktop/electron/src/preload-local-app/types.ts index c8da0d73..0ef61d96 100644 --- a/desktop/electron/src/preload-local-app/types.ts +++ b/desktop/electron/src/preload-local-app/types.ts @@ -20,4 +20,5 @@ export type WorkAdventureLocalAppApi = { reloadShortcuts: () => Promise; getSettings: () => Promise; saveSetting: (key: T, value: SettingsData[T]) => Promise; + setShortcutsEnabled: (enabled: boolean) => Promise; }; diff --git a/desktop/electron/src/shortcuts.ts b/desktop/electron/src/shortcuts.ts index 66bc4abd..7a8ef84b 100644 --- a/desktop/electron/src/shortcuts.ts +++ b/desktop/electron/src/shortcuts.ts @@ -1,6 +1,15 @@ import { globalShortcut } from "electron"; import settings, { SettingsData } from "./settings"; import { emitCameraToggle, emitMuteToggle } from "./ipc"; +import { createAndShowNotification } from "./notification"; + +export function setShortcutsEnabled(enabled: boolean) { + if (enabled) { + loadShortcuts(); + } else { + globalShortcut.unregisterAll(); + } +} export function loadShortcuts() { globalShortcut.unregisterAll(); @@ -11,12 +20,14 @@ export function loadShortcuts() { if (shortcuts?.mute_toggle && shortcuts.mute_toggle.length > 0) { globalShortcut.register(shortcuts.mute_toggle, () => { emitMuteToggle(); + createAndShowNotification({ body: "Toggled mute" }); // TODO }); } if (shortcuts?.camera_toggle && shortcuts.camera_toggle.length > 0) { globalShortcut.register(shortcuts.camera_toggle, () => { emitCameraToggle(); + createAndShowNotification({ body: "Toggled camera" }); // TODO }); } } diff --git a/desktop/local-app/src/lib/ToggleSwitch.svelte b/desktop/local-app/src/lib/ToggleSwitch.svelte index 5ad98ef0..740048cd 100644 --- a/desktop/local-app/src/lib/ToggleSwitch.svelte +++ b/desktop/local-app/src/lib/ToggleSwitch.svelte @@ -1,4 +1,7 @@

Settings

-
- {#if $shortCuts} +
+ {#if $settings} saveShortcut("mute_toggle", e.detail)} /> @@ -55,19 +55,21 @@ > saveShortcut("camera_toggle", e.detail)} /> - {/if} - - + {}} - /> - + on:change={(e) => saveAutoLaunch(e.detail)} + /> + + + Hint: Shortcuts are disabled while seeing this page + {/if}
From 1425513452dace4efc815e8b186ab8acc867f046 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Tue, 22 Feb 2022 14:09:36 +0100 Subject: [PATCH 036/116] fix type --- desktop/electron/src/settings.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desktop/electron/src/settings.ts b/desktop/electron/src/settings.ts index 97a8e67a..935c4968 100644 --- a/desktop/electron/src/settings.ts +++ b/desktop/electron/src/settings.ts @@ -36,9 +36,9 @@ function set(key: T | SettingsData, value?: Settin throw new Error("Settings not initialized"); } - if (typeof key === "string") { + if (typeof key === "string" && value !== undefined) { settings[key] = value; - } else { + } else if (typeof key !== "string") { Object.assign(settings, key); } From 4e243151dde4f408490f22cf19e5fea95b1f7896 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Tue, 22 Feb 2022 16:57:56 +0100 Subject: [PATCH 037/116] add desktop api to front --- desktop/electron/package.json | 3 +- desktop/electron/src/ipc.ts | 21 +++++----- desktop/electron/src/preload-app/preload.ts | 2 +- .../electron/src/preload-local-app/preload.ts | 2 +- desktop/electron/src/shortcuts.ts | 4 -- desktop/electron/src/window.ts | 28 +++++++------ desktop/electron/yarn.lock | 39 +++++++++++++++++++ desktop/local-app/index.html | 4 ++ desktop/local-app/src/App.svelte | 2 + desktop/local-app/src/lib/InputField.svelte | 1 - desktop/local-app/src/lib/Link.svelte | 18 --------- desktop/local-app/src/lib/Sidebar.svelte | 9 ++--- desktop/local-app/src/lib/ipc.ts | 4 +- desktop/local-app/src/store.ts | 10 ++--- desktop/local-app/src/views/Server.svelte | 25 ++++++++++++ desktop/local-app/src/window.d.ts | 7 ++++ front/src/Api/desktop/index.ts | 38 ++++++++++++++++++ front/src/iframe_api.ts | 7 ---- front/src/index.ts | 2 + front/src/window.d.ts | 10 +++++ front/tsconfig.json | 5 ++- 21 files changed, 174 insertions(+), 67 deletions(-) delete mode 100644 desktop/local-app/src/lib/Link.svelte create mode 100644 desktop/local-app/src/views/Server.svelte create mode 100644 desktop/local-app/src/window.d.ts create mode 100644 front/src/Api/desktop/index.ts create mode 100644 front/src/window.d.ts diff --git a/desktop/electron/package.json b/desktop/electron/package.json index c0eabedb..26a3929c 100644 --- a/desktop/electron/package.json +++ b/desktop/electron/package.json @@ -27,7 +27,8 @@ "electron-settings": "^4.0.2", "electron-updater": "^4.6.5", "electron-util": "^0.17.2", - "electron-window-state": "^5.0.3" + "electron-window-state": "^5.0.3", + "node-fetch": "^3.2.0" }, "devDependencies": { "@types/auto-launch": "^5.0.2", diff --git a/desktop/electron/src/ipc.ts b/desktop/electron/src/ipc.ts index ba3619ce..31a28d35 100644 --- a/desktop/electron/src/ipc.ts +++ b/desktop/electron/src/ipc.ts @@ -3,25 +3,26 @@ import electronIsDev from "electron-is-dev"; import { createAndShowNotification } from "./notification"; import { Server } from "./preload-local-app/types"; import settings, { SettingsData } from "./settings"; -import { loadShortcuts, saveShortcut, setShortcutsEnabled } from "./shortcuts"; -import { getWindow, hideAppView, showAppView } from "./window"; +import { loadShortcuts, setShortcutsEnabled } from "./shortcuts"; +import { getAppView, getWindow, hideAppView, showAppView } from "./window"; +// import fetch from "node-fetch"; export function emitMuteToggle() { - const mainWindow = getWindow(); - if (!mainWindow) { + const appView = getAppView(); + if (!appView) { throw new Error("Main window not found"); } - mainWindow.webContents.send("app:on-camera-toggle"); + appView.webContents.send("app:on-camera-toggle"); } export function emitCameraToggle() { - const mainWindow = getWindow(); - if (!mainWindow) { + const appView = getAppView(); + if (!appView) { throw new Error("Main window not found"); } - mainWindow.webContents.send("app:on-mute-toggle"); + appView.webContents.send("app:on-mute-toggle"); } export default () => { @@ -68,7 +69,7 @@ export default () => { try { // TODO: add proper test to see if server url is valid and points to a real WA server - await fetch(`${server.url}/iframe_api.js`); + // await fetch(`${server.url}/iframe_api.js`); } catch (e) { console.error(e); return new Error("Invalid server url"); @@ -76,7 +77,7 @@ export default () => { const newServer = { ...server, - _id: `${servers.length + 1}`, + _id: `${Date.now()}-${servers.length + 1}`, }; servers.push(newServer); settings.set("servers", servers); diff --git a/desktop/electron/src/preload-app/preload.ts b/desktop/electron/src/preload-app/preload.ts index d72516e3..bd7239e7 100644 --- a/desktop/electron/src/preload-app/preload.ts +++ b/desktop/electron/src/preload-app/preload.ts @@ -10,4 +10,4 @@ const api: WorkAdventureDesktopApi = { onCameraToggle: (callback) => ipcRenderer.on("app:on-camera-toggle", callback), }; -contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); +contextBridge.exposeInMainWorld("WAD", api); diff --git a/desktop/electron/src/preload-local-app/preload.ts b/desktop/electron/src/preload-local-app/preload.ts index 387bfc38..4c970e25 100644 --- a/desktop/electron/src/preload-local-app/preload.ts +++ b/desktop/electron/src/preload-local-app/preload.ts @@ -16,4 +16,4 @@ const api: WorkAdventureLocalAppApi = { setShortcutsEnabled: (enabled) => ipcRenderer.invoke("local-app:setShortcutsEnabled", enabled), }; -contextBridge.exposeInMainWorld("WorkAdventureDesktopApi", api); +contextBridge.exposeInMainWorld("WAD", api); diff --git a/desktop/electron/src/shortcuts.ts b/desktop/electron/src/shortcuts.ts index 7a8ef84b..83385e63 100644 --- a/desktop/electron/src/shortcuts.ts +++ b/desktop/electron/src/shortcuts.ts @@ -1,7 +1,6 @@ import { globalShortcut } from "electron"; import settings, { SettingsData } from "./settings"; import { emitCameraToggle, emitMuteToggle } from "./ipc"; -import { createAndShowNotification } from "./notification"; export function setShortcutsEnabled(enabled: boolean) { if (enabled) { @@ -16,18 +15,15 @@ export function loadShortcuts() { const shortcuts = settings.get("shortcuts"); - // // mute key if (shortcuts?.mute_toggle && shortcuts.mute_toggle.length > 0) { globalShortcut.register(shortcuts.mute_toggle, () => { emitMuteToggle(); - createAndShowNotification({ body: "Toggled mute" }); // TODO }); } if (shortcuts?.camera_toggle && shortcuts.camera_toggle.length > 0) { globalShortcut.register(shortcuts.camera_toggle, () => { emitCameraToggle(); - createAndShowNotification({ body: "Toggled camera" }); // TODO }); } } diff --git a/desktop/electron/src/window.ts b/desktop/electron/src/window.ts index 122270f9..064d8141 100644 --- a/desktop/electron/src/window.ts +++ b/desktop/electron/src/window.ts @@ -17,6 +17,19 @@ export function getAppView() { return appView; } +function resizeAppView() { + if (!mainWindow || !appView) { + return; + } + + appView.setBounds({ + x: sidebarWidth, + y: 0, + width: mainWindow.getBounds().width - sidebarWidth, + height: mainWindow.getBounds().height, + }); +} + export async function createWindow() { // do not re-create window if still existing if (mainWindow) { @@ -41,6 +54,7 @@ export async function createWindow() { preload: path.resolve(__dirname, "..", "dist", "preload-local-app", "preload.js"), }, }); + mainWindow.setMenu(null); // Let us register listeners on the window, so we can update the state // automatically (the listeners will be removed when the window is closed) @@ -74,16 +88,8 @@ export async function createWindow() { preload: path.resolve(__dirname, "..", "dist", "preload-app", "preload.js"), }, }); - appView.setBounds({ - x: sidebarWidth, - y: 0, - width: mainWindow.getBounds().width - sidebarWidth, - height: mainWindow.getBounds().height, - }); - appView.setAutoResize({ - width: true, - height: true, - }); + resizeAppView(); + mainWindow.on("resize", resizeAppView); mainWindow.once("ready-to-show", () => { mainWindow?.show(); @@ -91,7 +97,7 @@ export async function createWindow() { // appView?.webContents.openDevTools({ // mode: "detach", // }); - mainWindow?.webContents.openDevTools({ mode: "detach" }); + // mainWindow?.webContents.openDevTools({ mode: "detach" }); } }); diff --git a/desktop/electron/yarn.lock b/desktop/electron/yarn.lock index 44c6ad47..82034d10 100644 --- a/desktop/electron/yarn.lock +++ b/desktop/electron/yarn.lock @@ -843,6 +843,11 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +data-uri-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== + debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" @@ -1455,6 +1460,14 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.4.tgz#e8c6567f80ad7fc22fd302e7dcb72bafde9c1717" + integrity sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -1506,6 +1519,13 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" @@ -2246,6 +2266,20 @@ node-addon-api@^1.6.3: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.0.tgz#59390db4e489184fa35d4b74caf5510e8dfbaf3b" + integrity sha512-8xeimMwMItMw8hRrOl3C9/xzU49HV/yE6ORew/l+dxWimO5A4Ra8ld2rerlJvc/O7et5Z1zrWsPX43v1QBjCxw== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -3085,6 +3119,11 @@ verror@^1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +web-streams-polyfill@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" + integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" diff --git a/desktop/local-app/index.html b/desktop/local-app/index.html index 6065affb..55d6267f 100644 --- a/desktop/local-app/index.html +++ b/desktop/local-app/index.html @@ -23,6 +23,10 @@ display: flex; } + a:hover { + text-decoration: none !important; + } + *::-webkit-scrollbar { width: 10px; height: 10px; diff --git a/desktop/local-app/src/App.svelte b/desktop/local-app/src/App.svelte index 5a2e92c9..f5045791 100644 --- a/desktop/local-app/src/App.svelte +++ b/desktop/local-app/src/App.svelte @@ -8,6 +8,7 @@ const Home = () => import("~/views/Home.svelte"); const AddServer = () => import("~/views/AddServer.svelte"); const Settings = () => import("~/views/Settings.svelte"); + const Server = () => import("~/views/Server.svelte"); let insideElectron = api.desktop; @@ -19,6 +20,7 @@ Loading ... Loading ... Loading ... + Loading ...

404

No Route could be matched.

diff --git a/desktop/local-app/src/lib/InputField.svelte b/desktop/local-app/src/lib/InputField.svelte index 33a833e7..bb759793 100644 --- a/desktop/local-app/src/lib/InputField.svelte +++ b/desktop/local-app/src/lib/InputField.svelte @@ -9,7 +9,6 @@ {title} - {#if description.length > 0}

{description}

{/if} diff --git a/desktop/local-app/src/lib/Link.svelte b/desktop/local-app/src/lib/Link.svelte deleted file mode 100644 index d5d9ff46..00000000 --- a/desktop/local-app/src/lib/Link.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -
- -
diff --git a/desktop/local-app/src/lib/Sidebar.svelte b/desktop/local-app/src/lib/Sidebar.svelte index d1e1929b..5b0f6f3c 100644 --- a/desktop/local-app/src/lib/Sidebar.svelte +++ b/desktop/local-app/src/lib/Sidebar.svelte @@ -1,8 +1,8 @@ + + \ No newline at end of file diff --git a/desktop/local-app/src/window.d.ts b/desktop/local-app/src/window.d.ts new file mode 100644 index 00000000..50b20044 --- /dev/null +++ b/desktop/local-app/src/window.d.ts @@ -0,0 +1,7 @@ +import type { WorkAdventureLocalAppApi } from "@wa-preload-local-app"; + +declare global { + interface Window { + WAD: WorkAdventureLocalAppApi; + } +} diff --git a/front/src/Api/desktop/index.ts b/front/src/Api/desktop/index.ts new file mode 100644 index 00000000..be5c7901 --- /dev/null +++ b/front/src/Api/desktop/index.ts @@ -0,0 +1,38 @@ +import { isSilentStore, requestedCameraState, requestedMicrophoneState } from "../../Stores/MediaStore"; +import { get } from "svelte/store"; + +class DesktopApi { + isSilent: boolean = false; + + init() { + if (!window?.WAD?.desktop) { + return; + } + + console.log("Yipee you are using the desktop app ;)"); + + window.WAD.onMuteToggle(() => { + if (this.isSilent) return; + if (get(requestedMicrophoneState) === true) { + requestedMicrophoneState.disableMicrophone(); + } else { + requestedMicrophoneState.enableMicrophone(); + } + }); + + window.WAD.onCameraToggle(() => { + if (this.isSilent) return; + if (get(requestedCameraState) === true) { + requestedCameraState.disableWebcam(); + } else { + requestedCameraState.enableWebcam(); + } + }); + + isSilentStore.subscribe((value) => { + this.isSilent = value; + }); + } +} + +export const desktopApi = new DesktopApi(); diff --git a/front/src/iframe_api.ts b/front/src/iframe_api.ts index f5e20032..e368df32 100644 --- a/front/src/iframe_api.ts +++ b/front/src/iframe_api.ts @@ -182,13 +182,6 @@ const wa = { export type WorkAdventureApi = typeof wa; -declare global { - interface Window { - WA: WorkAdventureApi; - } - let WA: WorkAdventureApi; -} - window.WA = wa; window.addEventListener( diff --git a/front/src/index.ts b/front/src/index.ts index b34191aa..cfe06a46 100644 --- a/front/src/index.ts +++ b/front/src/index.ts @@ -16,6 +16,7 @@ import { coWebsiteManager } from "./WebRtc/CoWebsiteManager"; import { localUserStore } from "./Connexion/LocalUserStore"; import { ErrorScene } from "./Phaser/Reconnecting/ErrorScene"; import { iframeListener } from "./Api/IframeListener"; +import { desktopApi } from "./Api/desktop/index"; import { SelectCharacterMobileScene } from "./Phaser/Login/SelectCharacterMobileScene"; import { HdpiManager } from "./Phaser/Services/HdpiManager"; import { waScaleManager } from "./Phaser/Services/WaScaleManager"; @@ -154,6 +155,7 @@ coWebsiteManager.onResize.subscribe(() => { }); iframeListener.init(); +desktopApi.init(); const app = new App({ target: HtmlUtils.getElementByIdOrFail("game-overlay"), diff --git a/front/src/window.d.ts b/front/src/window.d.ts new file mode 100644 index 00000000..8393e15e --- /dev/null +++ b/front/src/window.d.ts @@ -0,0 +1,10 @@ +import { WorkAdventureApi } from "./iframe_api"; +import { WorkAdventureDesktopApi } from "@wa-preload-app"; + +declare global { + interface Window { + WA: WorkAdventureApi; + WAD: WorkAdventureDesktopApi; + } + let WA: WorkAdventureApi; +} diff --git a/front/tsconfig.json b/front/tsconfig.json index b9057d28..edb99eb5 100644 --- a/front/tsconfig.json +++ b/front/tsconfig.json @@ -27,7 +27,10 @@ "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */ + "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + "paths": { + "@wa-preload-app": ["../desktop/electron/src/preload-app/types.ts"], + } }, "exclude": [ "node_modules", From 732acb25dfd5773e571569816e1ca0fb25e7e7e0 Mon Sep 17 00:00:00 2001 From: Anton Bracke Date: Tue, 22 Feb 2022 17:56:57 +0100 Subject: [PATCH 038/116] fix selected server --- desktop/local-app/src/App.svelte | 2 +- desktop/local-app/src/lib/Sidebar.svelte | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/desktop/local-app/src/App.svelte b/desktop/local-app/src/App.svelte index f5045791..b0f9ca46 100644 --- a/desktop/local-app/src/App.svelte +++ b/desktop/local-app/src/App.svelte @@ -10,7 +10,7 @@ const Settings = () => import("~/views/Settings.svelte"); const Server = () => import("~/views/Server.svelte"); - let insideElectron = api.desktop; + let insideElectron = api?.desktop; {#if insideElectron} diff --git a/desktop/local-app/src/lib/Sidebar.svelte b/desktop/local-app/src/lib/Sidebar.svelte index 5b0f6f3c..9ffa2914 100644 --- a/desktop/local-app/src/lib/Sidebar.svelte +++ b/desktop/local-app/src/lib/Sidebar.svelte @@ -25,6 +25,8 @@ console.log("selected server changed", e); }); + $: serverWithSelection = $servers.map((s) => ({ ...s, isSelected: $selectedServer === s._id })) + onMount(async () => { await loadServers(); isDevelopment = await api.isDevelopment(); @@ -33,11 +35,11 @@