From 465bb8a4936f7d0eea276f71979f38e38f061b39 Mon Sep 17 00:00:00 2001 From: Florent Benoit Date: Tue, 8 Mar 2022 17:49:08 +0100 Subject: [PATCH] feat: initial import --- .browserslistrc | 1 + .editorconfig | 18 + .electron-builder.config.js | 59 + .electron-vendors.cache.json | 4 + .eslintrc.json | 54 + .gitignore | 5 + LICENSE | 202 + README.md | 0 buildResources/.gitkeep | 0 buildResources/icon.icns | Bin 0 -> 64925 bytes buildResources/icon.png | Bin 0 -> 16574 bytes buildResources/icon.svg | 59 + extensions/crc/icon.png | Bin 0 -> 50112 bytes extensions/crc/package.json | 33 + extensions/crc/scripts/build.js | 46 + extensions/crc/src/extension.ts | 56 + extensions/crc/tsconfig.json | 18 + extensions/docker/icon.png | Bin 0 -> 50112 bytes extensions/docker/package.json | 33 + extensions/docker/scripts/build.js | 48 + extensions/docker/src/extension.ts | 46 + extensions/docker/tsconfig.json | 18 + extensions/lima/icon.png | Bin 0 -> 50112 bytes extensions/lima/package.json | 33 + extensions/lima/scripts/build.js | 30 + extensions/lima/src/extension.ts | 47 + extensions/lima/tsconfig.json | 18 + extensions/podman/icon.png | Bin 0 -> 50112 bytes extensions/podman/package.json | 33 + extensions/podman/scripts/build.js | 46 + extensions/podman/src/extension.ts | 202 + extensions/podman/tsconfig.json | 18 + package.json | 73 + packages/extension-api/package.json | 21 + packages/extension-api/src/extension-api.d.ts | 93 + packages/extension-api/tsconfig.json | 18 + packages/extension-api/vite.config.js | 36 + packages/main/src/index.ts | 101 + packages/main/src/mainWindow.ts | 99 + packages/main/src/security-restrictions.ts | 145 + packages/main/src/tray-icon.png | Bin 0 -> 407 bytes packages/main/src/tray-icon.svg | 53 + packages/main/tests/unit.spec.ts | 69 + packages/main/tsconfig.json | 28 + packages/main/vite.config.js | 64 + packages/preload/exposedInMainWorld.d.ts | 17 + packages/preload/src/api.ts | 24 + packages/preload/src/api/container-info.ts | 35 + packages/preload/src/api/extension-info.ts | 25 + packages/preload/src/api/image-info.ts | 23 + .../preload/src/api/image-inspect-info.ts | 23 + packages/preload/src/api/provider-info.ts | 28 + packages/preload/src/command-registry.ts | 58 + packages/preload/src/container-registry.ts | 279 ++ packages/preload/src/extension-loader.ts | 331 ++ packages/preload/src/index.ts | 120 + packages/preload/src/types/disposable.ts | 51 + packages/preload/tsconfig.json | 30 + packages/preload/vite.config.js | 70 + packages/renderer/.eslintrc.json | 13 + packages/renderer/assets/logo.svg | 1 + packages/renderer/index.html | 13 + packages/renderer/package.json | 36 + packages/renderer/src/.gitignore | 4 + packages/renderer/src/App.svelte | 314 ++ packages/renderer/src/app.css | 3 + packages/renderer/src/assets/svelte.png | Bin 0 -> 5185 bytes packages/renderer/src/lib/CommandRegistry.ts | 71 + .../renderer/src/lib/ContainerIcon.svelte | 74 + .../renderer/src/lib/ContainerList.svelte | 419 ++ .../renderer/src/lib/ExtensionList.svelte | 74 + packages/renderer/src/lib/ImagesList.svelte | 264 + packages/renderer/src/lib/ProviderList.svelte | 80 + packages/renderer/src/main.ts | 8 + packages/renderer/src/override.css | 16 + packages/renderer/src/stores/containers.ts | 59 + packages/renderer/src/stores/extensions.ts | 39 + packages/renderer/src/stores/images.ts | 55 + packages/renderer/src/stores/providers.ts | 47 + packages/renderer/src/vite-env.d.ts | 2 + packages/renderer/svelte.config.js | 25 + packages/renderer/tsconfig.json | 22 + packages/renderer/vite.config.js | 54 + postcss.config.cjs | 25 + scripts/update-electron-vendors.js | 45 + scripts/watch.js | 158 + tailwind.config.cjs | 32 + tests/e2e.spec.ts | 70 + types/env.d.ts | 22 + vitest.config.js | 41 + yarn.lock | 4251 +++++++++++++++++ 91 files changed, 9378 insertions(+) create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .electron-builder.config.js create mode 100644 .electron-vendors.cache.json create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 buildResources/.gitkeep create mode 100644 buildResources/icon.icns create mode 100644 buildResources/icon.png create mode 100644 buildResources/icon.svg create mode 100644 extensions/crc/icon.png create mode 100644 extensions/crc/package.json create mode 100755 extensions/crc/scripts/build.js create mode 100644 extensions/crc/src/extension.ts create mode 100644 extensions/crc/tsconfig.json create mode 100644 extensions/docker/icon.png create mode 100644 extensions/docker/package.json create mode 100755 extensions/docker/scripts/build.js create mode 100644 extensions/docker/src/extension.ts create mode 100644 extensions/docker/tsconfig.json create mode 100644 extensions/lima/icon.png create mode 100644 extensions/lima/package.json create mode 100755 extensions/lima/scripts/build.js create mode 100644 extensions/lima/src/extension.ts create mode 100644 extensions/lima/tsconfig.json create mode 100644 extensions/podman/icon.png create mode 100644 extensions/podman/package.json create mode 100755 extensions/podman/scripts/build.js create mode 100644 extensions/podman/src/extension.ts create mode 100644 extensions/podman/tsconfig.json create mode 100644 package.json create mode 100644 packages/extension-api/package.json create mode 100644 packages/extension-api/src/extension-api.d.ts create mode 100644 packages/extension-api/tsconfig.json create mode 100644 packages/extension-api/vite.config.js create mode 100644 packages/main/src/index.ts create mode 100644 packages/main/src/mainWindow.ts create mode 100644 packages/main/src/security-restrictions.ts create mode 100644 packages/main/src/tray-icon.png create mode 100644 packages/main/src/tray-icon.svg create mode 100644 packages/main/tests/unit.spec.ts create mode 100644 packages/main/tsconfig.json create mode 100644 packages/main/vite.config.js create mode 100644 packages/preload/exposedInMainWorld.d.ts create mode 100644 packages/preload/src/api.ts create mode 100644 packages/preload/src/api/container-info.ts create mode 100644 packages/preload/src/api/extension-info.ts create mode 100644 packages/preload/src/api/image-info.ts create mode 100644 packages/preload/src/api/image-inspect-info.ts create mode 100644 packages/preload/src/api/provider-info.ts create mode 100644 packages/preload/src/command-registry.ts create mode 100644 packages/preload/src/container-registry.ts create mode 100644 packages/preload/src/extension-loader.ts create mode 100644 packages/preload/src/index.ts create mode 100644 packages/preload/src/types/disposable.ts create mode 100644 packages/preload/tsconfig.json create mode 100644 packages/preload/vite.config.js create mode 100644 packages/renderer/.eslintrc.json create mode 100644 packages/renderer/assets/logo.svg create mode 100644 packages/renderer/index.html create mode 100644 packages/renderer/package.json create mode 100644 packages/renderer/src/.gitignore create mode 100644 packages/renderer/src/App.svelte create mode 100644 packages/renderer/src/app.css create mode 100644 packages/renderer/src/assets/svelte.png create mode 100644 packages/renderer/src/lib/CommandRegistry.ts create mode 100644 packages/renderer/src/lib/ContainerIcon.svelte create mode 100644 packages/renderer/src/lib/ContainerList.svelte create mode 100644 packages/renderer/src/lib/ExtensionList.svelte create mode 100644 packages/renderer/src/lib/ImagesList.svelte create mode 100644 packages/renderer/src/lib/ProviderList.svelte create mode 100644 packages/renderer/src/main.ts create mode 100644 packages/renderer/src/override.css create mode 100644 packages/renderer/src/stores/containers.ts create mode 100644 packages/renderer/src/stores/extensions.ts create mode 100644 packages/renderer/src/stores/images.ts create mode 100644 packages/renderer/src/stores/providers.ts create mode 100644 packages/renderer/src/vite-env.d.ts create mode 100644 packages/renderer/svelte.config.js create mode 100644 packages/renderer/tsconfig.json create mode 100644 packages/renderer/vite.config.js create mode 100644 postcss.config.cjs create mode 100644 scripts/update-electron-vendors.js create mode 100644 scripts/watch.js create mode 100644 tailwind.config.cjs create mode 100644 tests/e2e.spec.ts create mode 100644 types/env.d.ts create mode 100644 vitest.config.js create mode 100644 yarn.lock diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000000..ac3922ac3ca --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +Chrome 98 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..872069e8bbc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# https://github.com/jokeyrhyme/standard-editorconfig + +# top-most EditorConfig file +root = true + +# defaults +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_size = 2 +indent_style = space + +[*.md] +trim_trailing_whitespace = false diff --git a/.electron-builder.config.js b/.electron-builder.config.js new file mode 100644 index 00000000000..61ea769289f --- /dev/null +++ b/.electron-builder.config.js @@ -0,0 +1,59 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +if (process.env.VITE_APP_VERSION === undefined) { + const now = new Date; + process.env.VITE_APP_VERSION = `${now.getUTCFullYear() - 2000}.${now.getUTCMonth() + 1}.${now.getUTCDate()}-${now.getUTCHours() * 60 + now.getUTCMinutes()}`; +} + +/** + * @type {import('electron-builder').Configuration} + * @see https://www.electron.build/configuration/configuration + */ +const config = { + productName: "container-desktop", + appId: "com.example.yourapp", + directories: { + output: 'dist', + buildResources: 'buildResources', + }, + files: [ + 'packages/**/dist/**', + 'extensions/**/builtin/*.cdix/**', + ], + dmg: { + contents: [ + { + x: 410, + y: 150, + type: "link", + path: "/Applications", + }, + { + x: 130, + y: 150, + type: "file", + }, + ], + }, + extraMetadata: { + version: process.env.VITE_APP_VERSION, + }, +}; + +module.exports = config; diff --git a/.electron-vendors.cache.json b/.electron-vendors.cache.json new file mode 100644 index 00000000000..9ab5d66d214 --- /dev/null +++ b/.electron-vendors.cache.json @@ -0,0 +1,4 @@ +{ + "chrome": "98", + "node": "16" +} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000000..3e54bb08891 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,54 @@ +{ + "root": true, + "env": { + "es2021": true, + "node": true, + "browser": false + }, + "extends": [ + "eslint:recommended", + /** @see https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#recommended-configs */ + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "ignorePatterns": [ + "packages/preload/exposedInMainWorld.d.ts", + "node_modules/**", + "**/dist/**" + ], + "rules": { + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/consistent-type-imports": "error", + + /** + * Having a semicolon helps the optimizer interpret your code correctly. + * This avoids rare errors in optimized code. + * @see https://twitter.com/alex_kozack/status/1364210394328408066 + */ + "semi": [ + "error", + "always" + ], + /** + * This will make the history of changes in the hit a little cleaner + */ + "comma-dangle": [ + "warn", + "always-multiline" + ], + /** + * Just for beauty + */ + "quotes": [ + "warn", "single" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..356e9927520 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules +.DS_Store +dist +.eslintcache +*.cdix diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..d6456956733 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/buildResources/.gitkeep b/buildResources/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/buildResources/icon.icns b/buildResources/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..bbe86eefa7c367bbac6317a1a33fedfdfac7d43c GIT binary patch literal 64925 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�fXfJ(6}S5N$F;5r=8PA4d~ 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 literal 0 HcmV?d00001 diff --git a/buildResources/icon.png b/buildResources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c4cbfb8958a6378adb15f4ff987cc34522acf2 GIT binary patch literal 16574 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 literal 0 HcmV?d00001 diff --git a/buildResources/icon.svg b/buildResources/icon.svg new file mode 100644 index 00000000000..69aec45d29d --- /dev/null +++ b/buildResources/icon.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + diff --git a/extensions/crc/icon.png b/extensions/crc/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d83e54a7e9ce52d7d5208b0a4d42cfb5db9f7272 GIT binary patch literal 50112 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ΝT~uV4VR24e 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 { + zipper.sync.unzip(destFile).save(unzippedDirectory); +}); \ No newline at end of file diff --git a/extensions/crc/src/extension.ts b/extensions/crc/src/extension.ts new file mode 100644 index 00000000000..683781a2c9a --- /dev/null +++ b/extensions/crc/src/extension.ts @@ -0,0 +1,56 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import * as extensionApi from '@tmpwip/extension-api'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs'; + + +export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { + + let socketPath; + const isWindows = os.platform() === 'win32'; + if (isWindows) { + socketPath = '//./pipe/crc-podman'; + } else { + socketPath = path.resolve(os.homedir(), '.crc/machines/crc/docker.sock'); + } + + + const dockerContainerProvider: extensionApi.ContainerProvider = { + provideName: () => 'crc/podman', + + provideConnection: async (): Promise => { + return socketPath; + }, + }; + if (fs.existsSync(socketPath)) { + const disposable = await extensionApi.container.registerContainerProvider(dockerContainerProvider); + extensionContext.subscriptions.push(disposable); + console.log('crc extension is active'); + } else { + console.error(`Could not find crc podman socket at ${socketPath}`); + } + +} + +export function deactivate(): void { + console.log('stopping crc extension'); +} + diff --git a/extensions/crc/tsconfig.json b/extensions/crc/tsconfig.json new file mode 100644 index 00000000000..398e3bfed31 --- /dev/null +++ b/extensions/crc/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "lib": [ + "ES2017", + "webworker" + ], + "sourceMap": true, + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true, + "types": [ + "node", + ] +}, +"include": [ + "src" +] +} diff --git a/extensions/docker/icon.png b/extensions/docker/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d83e54a7e9ce52d7d5208b0a4d42cfb5db9f7272 GIT binary patch literal 50112 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ΝT~uV4VR24e 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 { + zipper.sync.unzip(destFile).save(unzippedDirectory); +}); +*/ \ No newline at end of file diff --git a/extensions/docker/src/extension.ts b/extensions/docker/src/extension.ts new file mode 100644 index 00000000000..0258a19bfb7 --- /dev/null +++ b/extensions/docker/src/extension.ts @@ -0,0 +1,46 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import * as extensionApi from '@tmpwip/extension-api'; +import * as os from 'os'; + +export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { + + let socketPath: string; + const isWindows = os.platform() === 'win32'; + if (isWindows) { + socketPath = '//./pipe/docker_engine'; + } else { + socketPath = '/var/run/docker.sock'; + } + const dockerContainerProvider: extensionApi.ContainerProvider = { + provideName: () => 'Docker', + + provideConnection: async (): Promise => { + return socketPath; + }, + }; + + const disposable = await extensionApi.container.registerContainerProvider(dockerContainerProvider); + extensionContext.subscriptions.push(disposable); +} + +export function deactivate(): void { + console.log('stopping docker extension'); +} + diff --git a/extensions/docker/tsconfig.json b/extensions/docker/tsconfig.json new file mode 100644 index 00000000000..398e3bfed31 --- /dev/null +++ b/extensions/docker/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "lib": [ + "ES2017", + "webworker" + ], + "sourceMap": true, + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true, + "types": [ + "node", + ] +}, +"include": [ + "src" +] +} diff --git a/extensions/lima/icon.png b/extensions/lima/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d83e54a7e9ce52d7d5208b0a4d42cfb5db9f7272 GIT binary patch literal 50112 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ΝT~uV4VR24e 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 { + zipper.sync.unzip(destFile).save(unzippedDirectory); +}); +*/ \ No newline at end of file diff --git a/extensions/lima/src/extension.ts b/extensions/lima/src/extension.ts new file mode 100644 index 00000000000..b7c8fe32504 --- /dev/null +++ b/extensions/lima/src/extension.ts @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import * as extensionApi from '@tmpwip/extension-api'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs'; + +export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { + + const socketPath = path.resolve(os.homedir(), '.lima/podman/sock/podman.sock'); + + const dockerContainerProvider: extensionApi.ContainerProvider = { + provideName: () => 'Lima', + + provideConnection: async (): Promise => { + return socketPath; + }, + }; + if (fs.existsSync(socketPath)) { + const disposable = await extensionApi.container.registerContainerProvider(dockerContainerProvider); + extensionContext.subscriptions.push(disposable); + console.log('Lima extension is active'); + } else { + console.error(`Could not find podman socket at ${socketPath}`); + } +} + +export function deactivate(): void { + console.log('stopping lima extension'); +} + diff --git a/extensions/lima/tsconfig.json b/extensions/lima/tsconfig.json new file mode 100644 index 00000000000..398e3bfed31 --- /dev/null +++ b/extensions/lima/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "lib": [ + "ES2017", + "webworker" + ], + "sourceMap": true, + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true, + "types": [ + "node", + ] +}, +"include": [ + "src" +] +} diff --git a/extensions/podman/icon.png b/extensions/podman/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d83e54a7e9ce52d7d5208b0a4d42cfb5db9f7272 GIT binary patch literal 50112 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ΝT~uV4VR24e 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 { + zipper.sync.unzip(destFile).save(unzippedDirectory); +}); \ No newline at end of file diff --git a/extensions/podman/src/extension.ts b/extensions/podman/src/extension.ts new file mode 100644 index 00000000000..c4aa95d46f3 --- /dev/null +++ b/extensions/podman/src/extension.ts @@ -0,0 +1,202 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import * as extensionApi from '@tmpwip/extension-api'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs'; +import * as net from 'net'; +import {spawn} from 'child_process'; + +const podmanMachineSocketsDirectory = path.resolve(os.homedir(), '.local/share/containers/podman/machine'); +const podmanMachineQemuDirectory = path.resolve(podmanMachineSocketsDirectory, 'qemu'); +const watchers = new Map(); +const currentProviders: extensionApi.Disposable[] = []; +const lifecycleProviders = new Map(); +let storedExtensionContext; +let refreshMachine = false; +let stopLoop = false; +/* +function unregisterProviders() { + currentProviders.forEach(p => p.dispose()); +} +*/ +async function initMachines() { + + // we search for all sockets and try to connect if possible + const children = await fs.promises.readdir(podmanMachineSocketsDirectory, { withFileTypes: true }); + // grab all directories except qemu one + const directories = children.filter(c => c.isDirectory() && c.name !== 'qemu').map(c => c.name); + + // ok now for each directory, register a provider if socket is working + await Promise.all(directories.map(async (directory) => { + // podman.sock link + const socketPath = path.resolve(podmanMachineSocketsDirectory, directory, 'podman.sock'); + const available = await socketAvailable(socketPath); + let status = 'stopped'; + if (available) { + registerProviderFor(directory, socketPath); + status = 'started'; + } + registerProviderLifecycle(directory, status); + + // monitor qemu file + const children = await fs.promises.readdir(podmanMachineQemuDirectory, { withFileTypes: true }); + const qemuFile = children.filter(c => c.isFile() && c.name.startsWith(`${directory}_`)).map(c => c.name); + if (qemuFile.length === 1) { + monitorQemuMachine(path.resolve(podmanMachineQemuDirectory, qemuFile[0])); + } + })); +} + + +async function timeout(time: number): Promise { + return new Promise((resolve) => { + setTimeout(resolve, time); + }); +} + +async function refreshMachinesCron() { + + // we need to refresh as during the last 5 seconds, we need a refresh + if (refreshMachine) { + await Promise.all(currentProviders.map(provider => provider.dispose())); + currentProviders.length = 0; + initMachines(); + // we disable the refresh for a while + refreshMachine = false; + } + + // call us again + if (!stopLoop) { + await timeout(5000); + refreshMachinesCron(); + } +} + +async function monitorQemuMachine(qemuFileToWatch) { + if (watchers.get(qemuFileToWatch)) { + // already watching, skip + return; + } + const watcher = fs.watch(qemuFileToWatch, () => { + // we refresh the list of machines every time there is a new event in that directory + refreshMachine = true; + }); + watchers.set(qemuFileToWatch, watcher); + +} + +async function registerProviderFor(directory: string, socketPath: string) { + const provider: extensionApi.ContainerProvider = { + provideName: () => `podman-machine-${directory}`, + + provideConnection: async (): Promise => { + return socketPath; + }, + }; + + console.log('Registering podman provider for', directory); + const disposable = await extensionApi.container.registerContainerProvider(provider); + currentProviders.push(disposable); + storedExtensionContext.subscriptions.push(disposable); +} + +function execPromise(command, args) { + return new Promise((resolve) => { + spawn(command, args); + resolve(true); + }); +} + + +async function registerProviderLifecycle(directory: string, status: string) { + const providerLifecycle: extensionApi.ContainerProviderLifecycle = { + provideName: () => `podman-machine-${directory}`, + status: () => status, + + start: async (): Promise =>{ + // start the machine + console.log(`executing podman machine start ${directory}`); + await execPromise('podman', ['machine', 'start', directory]); + // wait before machine is up + await timeout(10000); + console.log('machine is started !'); + }, + stop: async (): Promise =>{ + console.log(`executing podman machine stop ${directory}`); + await execPromise('podman', ['machine', 'stop', directory]); + // wait before machine is stopped + await timeout(5000); + console.log('machine is stopped !'); + }, + handleLifecycleChange: async (callback: (event: string) => void): Promise => { + callback('started'); + }, + }; + console.log('Registering podman provider lifecyclefor', directory); + const disposable = await extensionApi.container.registerContainerProviderLifecycle(providerLifecycle); + // currentProviders.push(disposable); + storedExtensionContext.subscriptions.push(disposable); + lifecycleProviders.set(directory, providerLifecycle); + +} + +async function socketAvailable(socketPath): Promise { + + const client = new net.Socket(); + const promise = new Promise((res) => { + client.connect( + socketPath, + () => { + // stop connection + client.destroy(); + res(true); + }, + ); + client.on('error', () => res(false)); + }); + return promise; + +} + + +export async function activate(extensionContext: extensionApi.ExtensionContext): Promise { + storedExtensionContext = extensionContext; + + // no podman for now, skip + if (!fs.existsSync(podmanMachineSocketsDirectory)) { + return; + } + + // track all podman machines available + fs.watch(podmanMachineSocketsDirectory, () => { + // we refresh the list of machines every time there is a new event in that directory + refreshMachine = true; + }); + + // do the first initialization + initMachines(); + refreshMachinesCron(); +} + +export function deactivate(): void { + stopLoop = true; + console.log('stopping podman extension'); +} + diff --git a/extensions/podman/tsconfig.json b/extensions/podman/tsconfig.json new file mode 100644 index 00000000000..398e3bfed31 --- /dev/null +++ b/extensions/podman/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "lib": [ + "ES2017", + "webworker" + ], + "sourceMap": true, + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true, + "types": [ + "node", + ] +}, +"include": [ + "src" +] +} diff --git a/package.json b/package.json new file mode 100644 index 00000000000..d9c03663960 --- /dev/null +++ b/package.json @@ -0,0 +1,73 @@ +{ + "name": "container-desktop", + "license": "apache-2.0", + "private": true, + "engines": { + "node": ">=v16.13", + "npm": ">=8.1" + }, + "main": "packages/main/dist/index.cjs", + "workspaces": { + "packages": [ + "packages/*", + "extensions/*" + ] + }, + "scripts": { + "build": "npm run build:main && npm run build:preload && npm run build:renderer && npm run build:extensions", + "build:main": "cd ./packages/main && vite build", + "build:extensions": "npm run build:extensions:docker && npm run build:extensions:lima && npm run build:extensions:crc && npm run build:extensions:podman", + "build:extensions:crc": "cd ./extensions/crc && npm run build", + "build:extensions:docker": "cd ./extensions/docker && npm run build", + "build:extensions:lima": "cd ./extensions/lima && npm run build", + "build:extensions:podman": "cd ./extensions/podman && npm run build", + "build:extension-api": "cd ./packages/extension-api && vite build", + "build:preload": "cd ./packages/preload && vite build", + "build:preload:types": "dts-cb -i \"packages/preload/tsconfig.json\" -o \"packages/preload/exposedInMainWorld.d.ts\"", + "build:renderer": "vite -c packages/renderer/vite.config.js build", + "compile": "cross-env MODE=production npm run build && electron-builder build -mwl --config .electron-builder.config.js --dir --config.asar=false", + "compile:dmg": "cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js", + "test": "npm run test:main && npm run test:preload && npm run test:renderer && npm run test:e2e", + "test:e2e": "npm run build && vitest run", + "test:main": "vitest run -r packages/main --passWithNoTests", + "test:preload": "vitest run -r packages/preload --passWithNoTests", + "test:renderer": "vitest run -r packages/renderer --passWithNoTests", + "watch": "node scripts/watch.js", + "lint": "eslint . --ext js,ts,svelte", + "typecheck:main": "tsc --noEmit -p packages/main/tsconfig.json", + "typecheck:preload": "tsc --noEmit -p packages/preload/tsconfig.json", + "typecheck:renderer": "npm run build:preload:types", + "typecheck": "npm run typecheck:main && npm run typecheck:preload && npm run typecheck:renderer" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^21.0.1", + "@types/dockerode": "^3.3.3", + "@typescript-eslint/eslint-plugin": "5.11.0", + "@typescript-eslint/parser": "^5.11.0", + "cross-env": "7.0.3", + "dts-for-context-bridge": "0.7.1", + "electron": "17.0.0", + "electron-builder": "22.14.13", + "electron-devtools-installer": "3.2.0", + "eslint": "8.8.0", + "happy-dom": "2.31.1", + "nano-staged": "0.5.0", + "playwright": "1.18.1", + "postcss-import": "^14.0.2", + "simple-git-hooks": "2.7.0", + "typescript": "4.5.5", + "vite": "2.7.13", + "vitest": "0.2.8" + }, + "dependencies": { + "dockerode": "^3.3.1", + "electron-updater": "4.6.5", + "tar-fs": "^2.1.1" + }, + "resolutionsComments": { + "ssh2": "Need to use an old version of ssh2 to avoid vite/rollup issue on loading some internal lib" + }, + "resolutions": { + "ssh2": "0.8.9" + } +} diff --git a/packages/extension-api/package.json b/packages/extension-api/package.json new file mode 100644 index 00000000000..e666a0f3969 --- /dev/null +++ b/packages/extension-api/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tmpwip/extension-api", + "version": "0.0.1", + "description": "Prototype API", + "publishConfig": { + "access": "public" + }, + "license": "apache-2.0", + "types": "./src/extension-api.d.ts", + "files": [ + "src" + ], + "scripts": { + "prepare": "", + "clean": "rimraf lib *.tsbuildinfo", + "build": "", + "watch": "", + "publish:next": "yarn publish --registry=https://registry.npmjs.org/ --no-git-tag-version --new-version 0.0.1-\"$(date +%s)\"" + }, + "devDependencies": {} +} diff --git a/packages/extension-api/src/extension-api.d.ts b/packages/extension-api/src/extension-api.d.ts new file mode 100644 index 00000000000..6d18fd49c51 --- /dev/null +++ b/packages/extension-api/src/extension-api.d.ts @@ -0,0 +1,93 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +declare module '@tmpwip/extension-api' { + + /** + * Represents a reference to a command. Provides a title which + * will be used to represent a command in the UI and, optionally, + * an array of arguments which will be passed to the command handler + * function when invoked. + */ + export interface Command { + title: string; + command: string; + tooltip?: string; + arguments?: any[]; + } + + export class Disposable { + + constructor(func: () => void); + /** + * Dispose this object. + */ + dispose(): void; + + static create(func: () => void): Disposable; + + /** + * Combine many disposable-likes into one. Use this method + * when having objects with a dispose function which are not + * instances of Disposable. + * + * @param disposableLikes Objects that have at least a `dispose`-function member. + * @return Returns a new disposable which, upon dispose, will + * dispose all provided disposables. + */ + static from(...disposableLikes: { dispose: () => any }[]): Disposable; + + /** + * Creates a new Disposable calling the provided function + * on dispose. + * @param callOnDispose Function that disposes something. + */ + constructor(callOnDispose: Function); + + } + + export interface ExtensionContext { + readonly subscriptions: { dispose(): any }[]; + } + + export interface ContainerProviderLifecycle { + provideName(): string; + start(): Promise; + stop(): Promise; + status(): string; + handleLifecycleChange(callback: (event: string) => void): Promise + + } + + export interface ContainerProvider { + provideName(): string; + provideConnection(): PromiseLike; + } + + export namespace commands { + export function registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any): Disposable; + export function executeCommand(command: string, ...rest: any[]): PromiseLike; + } + + export namespace container { + export function registerContainerProvider(provider: ContainerProvider): PromiseLike; + export function registerContainerProviderLifecycle(providerLifecycle: ContainerProviderLifecycle): PromiseLike; + } + + +} \ No newline at end of file diff --git a/packages/extension-api/tsconfig.json b/packages/extension-api/tsconfig.json new file mode 100644 index 00000000000..01451e3a41f --- /dev/null +++ b/packages/extension-api/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "esnext", + "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"] +} diff --git a/packages/extension-api/vite.config.js b/packages/extension-api/vite.config.js new file mode 100644 index 00000000000..45bd5f14232 --- /dev/null +++ b/packages/extension-api/vite.config.js @@ -0,0 +1,36 @@ +/* eslint-env node */ +import {join} from 'path'; +import { svelte } from "@sveltejs/vite-plugin-svelte" +import { defineConfig } from "vite" + +const PACKAGE_ROOT = __dirname; + + +// https://vitejs.dev/config/ +export default defineConfig({ + mode: process.env.MODE, + root: PACKAGE_ROOT, + resolve: { + alias: { + '/@/': join(PACKAGE_ROOT, 'src') + '/', + }, + }, + plugins: [svelte()], + optimizeDeps: { + exclude: ['tinro'] + }, + base: '', + server: { + fs: { + strict: true, + }, + }, + build: { + sourcemap: true, + outDir: 'dist', + assetsDir: '.', + + emptyOutDir: true, + brotliSize: false, + }, +}) diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts new file mode 100644 index 00000000000..2e5f7128da4 --- /dev/null +++ b/packages/main/src/index.ts @@ -0,0 +1,101 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import trayIcon from './tray-icon.png'; +import {app, Menu, nativeImage, Tray} from 'electron'; +import './security-restrictions'; +import {restoreOrCreateWindow} from '/@/mainWindow'; + + +/** + * Prevent multiple instances + */ +const isSingleInstance = app.requestSingleInstanceLock(); +if (!isSingleInstance) { + app.quit(); + process.exit(0); +} +app.on('second-instance', restoreOrCreateWindow); + + +/** + * Disable Hardware Acceleration for more power-save + */ +app.disableHardwareAcceleration(); + +/** + * Shout down background process if all windows was closed + */ +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +/** + * @see https://www.electronjs.org/docs/v14-x-y/api/app#event-activate-macos Event: 'activate' + */ +app.on('activate', restoreOrCreateWindow); + + +/** + * Create app window when background process will be ready + */ +app.whenReady() + .then(restoreOrCreateWindow) + .catch((e) => console.error('Failed create window:', e)); + + +/** + * Install some other devtools in development mode only + */ +/* +if (import.meta.env.DEV) { + app.whenReady() + .then(() => import('electron-devtools-installer')) + .then(({default: installExtension, VUEJS3_DEVTOOLS}) => installExtension(VUEJS3_DEVTOOLS, { + loadExtensionOptions: { + allowFileAccess: true, + }, + })) + .catch(e => console.error('Failed install extension:', e)); +} +*/ + +/** + * Check new app version in production mode only + */ +if (import.meta.env.PROD) { + app.whenReady() + .then(() => import('electron-updater')) + .then(({autoUpdater}) => autoUpdater.checkForUpdatesAndNotify()) + .catch((e) => console.error('Failed check updates:', e)); +} + +const nativeTrayIcon = nativeImage.createFromDataURL(trayIcon); + +let tray = null +app.whenReady().then(() => { + tray = new Tray(nativeTrayIcon) + const contextMenu = Menu.buildFromTemplate([ + { label: 'Podman', type: 'radio' }, + { label: 'Kubernetes', type: 'separator' }, + { label: 'OpenShift', type: 'radio', checked: true }, + ]) + tray.setContextMenu(contextMenu) +}) \ No newline at end of file diff --git a/packages/main/src/mainWindow.ts b/packages/main/src/mainWindow.ts new file mode 100644 index 00000000000..77fcfc02440 --- /dev/null +++ b/packages/main/src/mainWindow.ts @@ -0,0 +1,99 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import { BrowserWindow, BrowserWindowConstructorOptions, ipcMain} from 'electron'; +import {join} from 'path'; +import {URL} from 'url'; +import * as os from 'os'; + +async function createWindow() { + const browserWindowConstructorOptions: BrowserWindowConstructorOptions = { + show: false, // Use 'ready-to-show' event to show window + width: 1050, + minWidth: 640, + minHeight: 600, + height: 600, + webPreferences: { + webSecurity: false, + nativeWindowOpen: true, + webviewTag: false, // The webview tag is not recommended. Consider alternatives like iframe or Electron's BrowserView. https://www.electronjs.org/docs/latest/api/webview-tag#warning + preload: join(__dirname, '../../preload/dist/index.cjs'), + }, + } + const osType = os.type(); + if (osType === 'Darwin') { + browserWindowConstructorOptions.titleBarStyle = "hiddenInset"; + } + const browserWindow = new BrowserWindow(browserWindowConstructorOptions); + + setTimeout(() => { + console.log('SEND SEND SEND message'); + browserWindow.webContents.send("container-stopped-event", "containerID"); + }, 5000); + + + ipcMain.on("container-stopped-event", (event: any, info: any) => { + console.log('SEND SEND SEND message', info); + browserWindow.webContents.send("container-stopped-event", event); + }); + + /** + * If you install `show: true` then it can cause issues when trying to close the window. + * Use `show: false` and listener events `ready-to-show` to fix these issues. + * + * @see https://github.com/electron/electron/issues/25012 + */ + browserWindow.on('ready-to-show', () => { + browserWindow?.show(); + + if (import.meta.env.DEV) { + browserWindow?.webContents.openDevTools(); + } + }); + + /** + * URL for main window. + * Vite dev server for development. + * `file://../renderer/index.html` for production and test + */ + const pageUrl = import.meta.env.DEV && import.meta.env.VITE_DEV_SERVER_URL !== undefined + ? import.meta.env.VITE_DEV_SERVER_URL + : new URL('../renderer/dist/index.html', 'file://' + __dirname).toString(); + + + await browserWindow.loadURL(pageUrl); + + return browserWindow; +} + +/** + * Restore existing BrowserWindow or Create new BrowserWindow + */ +export async function restoreOrCreateWindow() { + let window = BrowserWindow.getAllWindows().find(w => !w.isDestroyed()); + + if (window === undefined) { + window = await createWindow(); + } + + if (window.isMinimized()) { + window.restore(); + } + + window.focus(); +} diff --git a/packages/main/src/security-restrictions.ts b/packages/main/src/security-restrictions.ts new file mode 100644 index 00000000000..4dba38fe0ff --- /dev/null +++ b/packages/main/src/security-restrictions.ts @@ -0,0 +1,145 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import {app, shell} from 'electron'; +import {URL} from 'url'; + +/** + * List of origins that you allow open INSIDE the application and permissions for each of them. + * + * In development mode you need allow open `VITE_DEV_SERVER_URL` + */ +const ALLOWED_ORIGINS_AND_PERMISSIONS = new Map>( + import.meta.env.DEV && import.meta.env.VITE_DEV_SERVER_URL + ? [[new URL(import.meta.env.VITE_DEV_SERVER_URL).origin, new Set]] + : [], +); + +/** + * List of origins that you allow open IN BROWSER. + * Navigation to origins below is possible only if the link opens in a new window + * + * @example + * + */ +const ALLOWED_EXTERNAL_ORIGINS = new Set<`https://${string}`>([ + 'https://github.com', +]); + + +app.on('web-contents-created', (_, contents) => { + + /** + * Block navigation to origins not on the allowlist. + * + * Navigation is a common attack vector. If an attacker can convince the app to navigate away + * from its current page, they can possibly force the app to open web sites on the Internet. + * + * @see https://www.electronjs.org/docs/latest/tutorial/security#13-disable-or-limit-navigation + */ + contents.on('will-navigate', (event, url) => { + const {origin} = new URL(url); + if (ALLOWED_ORIGINS_AND_PERMISSIONS.has(origin)) { + return; + } + + // Prevent navigation + event.preventDefault(); + + if (import.meta.env.DEV) { + console.warn('Blocked navigating to an unallowed origin:', origin); + } + }); + + + /** + * Block requested unallowed permissions. + * By default, Electron will automatically approve all permission requests. + * + * @see https://www.electronjs.org/docs/latest/tutorial/security#5-handle-session-permission-requests-from-remote-content + */ + contents.session.setPermissionRequestHandler((webContents, permission, callback) => { + const {origin} = new URL(webContents.getURL()); + + const permissionGranted = !!ALLOWED_ORIGINS_AND_PERMISSIONS.get(origin)?.has(permission); + callback(permissionGranted); + + if (!permissionGranted && import.meta.env.DEV) { + console.warn(`${origin} requested permission for '${permission}', but was blocked.`); + } + }); + + + /** + * Hyperlinks to allowed sites open in the default browser. + * + * The creation of new `webContents` is a common attack vector. Attackers attempt to convince the app to create new windows, + * frames, or other renderer processes with more privileges than they had before; or with pages opened that they couldn't open before. + * You should deny any unexpected window creation. + * + * @see https://www.electronjs.org/docs/latest/tutorial/security#14-disable-or-limit-creation-of-new-windows + * @see https://www.electronjs.org/docs/latest/tutorial/security#15-do-not-use-openexternal-with-untrusted-content + */ + contents.setWindowOpenHandler(({url}) => { + const {origin} = new URL(url); + + // @ts-expect-error Type checking is performed in runtime + if (ALLOWED_EXTERNAL_ORIGINS.has(origin)) { + // Open default browser + shell.openExternal(url).catch(console.error); + + } else if (import.meta.env.DEV) { + console.warn('Blocked the opening of an unallowed origin:', origin); + } + + // Prevent creating new window in application + return {action: 'deny'}; + }); + + + /** + * Verify webview options before creation + * + * Strip away preload scripts, disable Node.js integration, and ensure origins are on the allowlist. + * + * @see https://www.electronjs.org/docs/latest/tutorial/security#12-verify-webview-options-before-creation + */ + contents.on('will-attach-webview', (event, webPreferences, params) => { + const {origin} = new URL(params.src); + if (!ALLOWED_ORIGINS_AND_PERMISSIONS.has(origin)) { + + if (import.meta.env.DEV) { + console.warn(`A webview tried to attach ${params.src}, but was blocked.`); + } + + event.preventDefault(); + return; + } + + // Strip away preload scripts if unused or verify their location is legitimate + delete webPreferences.preload; + // @ts-expect-error `preloadURL` exists - see https://www.electronjs.org/docs/latest/api/web-contents#event-will-attach-webview + delete webPreferences.preloadURL; + + // Disable Node.js integration + webPreferences.nodeIntegration = false; + }); +}); diff --git a/packages/main/src/tray-icon.png b/packages/main/src/tray-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..464bd24564fdde2af8053856ebbbc1360b0cd48b GIT binary patch literal 407 zcmV;I0cie-P)7GkCQxW$oRWq@O&np^ z6!%QHnGd7GPEK+5S^u4rwO5#_%-ll{6Wo<{U=72FxR_<8U^g=dnb}_`Xf*wzsTaYg znYq3UZfVzxwr)4y{|nsGZ)D~PL}u>dX?d%#gYS5UPq-~_H~1P6<1%C)zbcJkAJD~X zJi}+a!9ITC8k;!G%uyM3hNBAkm*4(DjcvTb7M|lJ&XFAtt6HV9^9UGp%2~Cd(xhxz z)%cAojPU~B@KIxIOxO6N0Mj*&@D{@|AT@@5iHIA>%me&TE`t? + diff --git a/packages/main/tests/unit.spec.ts b/packages/main/tests/unit.spec.ts new file mode 100644 index 00000000000..ce592acbd18 --- /dev/null +++ b/packages/main/tests/unit.spec.ts @@ -0,0 +1,69 @@ +import type {MaybeMocked} from 'vitest'; +import {beforeEach, expect, test, vi} from 'vitest'; +import {restoreOrCreateWindow} from '../src/mainWindow'; + +import {BrowserWindow} from 'electron'; + +/** + * Mock real electron BrowserWindow API + */ +vi.mock('electron', () => { + + const bw = vi.fn() as MaybeMocked; + // @ts-expect-error It's work in runtime, but I Haven't idea how to fix this type error + bw.getAllWindows = vi.fn(() => bw.mock.instances); + bw.prototype.loadURL = vi.fn(); + bw.prototype.on = vi.fn(); + bw.prototype.destroy = vi.fn(); + bw.prototype.isDestroyed = vi.fn(); + bw.prototype.isMinimized = vi.fn(); + bw.prototype.focus = vi.fn(); + bw.prototype.restore = vi.fn(); + + return {BrowserWindow: bw}; +}); + + +beforeEach(() => { + vi.clearAllMocks(); +}); + + +test('Should create new window', async () => { + const {mock} = vi.mocked(BrowserWindow); + expect(mock.instances).toHaveLength(0); + + await restoreOrCreateWindow(); + expect(mock.instances).toHaveLength(1); + expect(mock.instances[0].loadURL).toHaveBeenCalledOnce(); + expect(mock.instances[0].loadURL).toHaveBeenCalledWith(expect.stringMatching(/index\.html$/)); +}); + + +test('Should restore existing window', async () => { + const {mock} = vi.mocked(BrowserWindow); + + // Create Window and minimize it + await restoreOrCreateWindow(); + expect(mock.instances).toHaveLength(1); + const appWindow = vi.mocked(mock.instances[0]); + appWindow.isMinimized.mockReturnValueOnce(true); + + await restoreOrCreateWindow(); + expect(mock.instances).toHaveLength(1); + expect(appWindow.restore).toHaveBeenCalledOnce(); +}); + + +test('Should create new window if previous was destroyed', async () => { + const {mock} = vi.mocked(BrowserWindow); + + // Create Window and destroy it + await restoreOrCreateWindow(); + expect(mock.instances).toHaveLength(1); + const appWindow = vi.mocked(mock.instances[0]); + appWindow.isDestroyed.mockReturnValueOnce(true); + + await restoreOrCreateWindow(); + expect(mock.instances).toHaveLength(2); +}); diff --git a/packages/main/tsconfig.json b/packages/main/tsconfig.json new file mode 100644 index 00000000000..30ee34a7e27 --- /dev/null +++ b/packages/main/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "sourceMap": false, + "moduleResolution": "Node", + "skipLibCheck": true, + "strict": true, + "isolatedModules": true, + + "types" : ["node"], + + "baseUrl": ".", + "paths": { + "/@/*": [ + "./src/*" + ] + }, + }, + "include": [ + "src/**/*.ts", + "../../types/**/*.d.ts" + ], + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts" + ] +} diff --git a/packages/main/vite.config.js b/packages/main/vite.config.js new file mode 100644 index 00000000000..76c779cce67 --- /dev/null +++ b/packages/main/vite.config.js @@ -0,0 +1,64 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import {node} from '../../.electron-vendors.cache.json'; +import {join} from 'path'; +import {builtinModules} from 'module'; + +const PACKAGE_ROOT = __dirname; + + +/** + * @type {import('vite').UserConfig} + * @see https://vitejs.dev/config/ + */ +const config = { + mode: process.env.MODE, + root: PACKAGE_ROOT, + envDir: process.cwd(), + resolve: { + alias: { + '/@/': join(PACKAGE_ROOT, 'src') + '/', + }, + }, + build: { + sourcemap: 'inline', + target: `node${node}`, + outDir: 'dist', + assetsDir: '.', + minify: process.env.MODE !== 'development', + lib: { + entry: 'src/index.ts', + formats: ['cjs'], + }, + rollupOptions: { + external: [ + 'electron', + 'electron-devtools-installer', + ...builtinModules.flatMap(p => [p, `node:${p}`]), + ], + output: { + entryFileNames: '[name].cjs', + }, + }, + emptyOutDir: true, + brotliSize: false, + }, +}; + +export default config; diff --git a/packages/preload/exposedInMainWorld.d.ts b/packages/preload/exposedInMainWorld.d.ts new file mode 100644 index 00000000000..fba0f7aec79 --- /dev/null +++ b/packages/preload/exposedInMainWorld.d.ts @@ -0,0 +1,17 @@ +interface Window { + readonly events: { send: (channel: string, data: string) => void; receive: (channel: string, func: any) => void; }; + readonly listContainers: () => Promise; + readonly listImages: () => Promise; + readonly startContainer: (engine: string, containerId: string) => Promise; + readonly createAndStartContainer: (engine: string, options: import("/Users/benoitf/git/benoitf/container-desktop/packages/preload/src/api/container-info").ContainerCreateOptions) => Promise; + readonly stopContainer: (engine: string, containerId: string) => Promise; + readonly startProviderLifecycle: (providerName: string) => Promise; + readonly stopProviderLifecycle: (providerName: string) => Promise; + readonly buildImage: (buildDirectory: string, imageName: string, eventCollect: (eventName: string, data: string) => void) => Promise; + readonly getImageInspect: (engine: string, imageId: string) => Promise; + readonly getProviderInfos: () => Promise; + readonly listExtensions: () => Promise; + readonly stopExtension: (extensionId: string) => Promise; + readonly startExtension: (extensionId: string) => Promise; + readonly openExternal: (link: string) => void; +} diff --git a/packages/preload/src/api.ts b/packages/preload/src/api.ts new file mode 100644 index 00000000000..53fff1df816 --- /dev/null +++ b/packages/preload/src/api.ts @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type { ContainerInfo } from "./api/container-info"; + +export interface RemoteAPI { + // eslint-disable-next-line @typescript-eslint/ban-types + listContainers(options?: {}): Promise; +} diff --git a/packages/preload/src/api/container-info.ts b/packages/preload/src/api/container-info.ts new file mode 100644 index 00000000000..d2d651d67a8 --- /dev/null +++ b/packages/preload/src/api/container-info.ts @@ -0,0 +1,35 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type Dockerode from 'dockerode'; + +export interface ContainerInfo extends Dockerode.ContainerInfo { + engine: string; +} + +export interface HostConfig { + PortBindings?: any; +} + +export interface ContainerCreateOptions { + name?: string | undefined; + // eslint-disable-next-line @typescript-eslint/ban-types + ExposedPorts?: { [port: string]: {} } | undefined; + HostConfig?: HostConfig | undefined; + Image?: string | undefined; +} diff --git a/packages/preload/src/api/extension-info.ts b/packages/preload/src/api/extension-info.ts new file mode 100644 index 00000000000..9537a3a3431 --- /dev/null +++ b/packages/preload/src/api/extension-info.ts @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +export interface ExtensionInfo { + id: string; + name: string; + publisher: string; + version: string; + state: string; +} \ No newline at end of file diff --git a/packages/preload/src/api/image-info.ts b/packages/preload/src/api/image-info.ts new file mode 100644 index 00000000000..7d427a7de34 --- /dev/null +++ b/packages/preload/src/api/image-info.ts @@ -0,0 +1,23 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type Dockerode from 'dockerode'; + +export interface ImageInfo extends Dockerode.ImageInfo { + engine: string; +} \ No newline at end of file diff --git a/packages/preload/src/api/image-inspect-info.ts b/packages/preload/src/api/image-inspect-info.ts new file mode 100644 index 00000000000..177483de234 --- /dev/null +++ b/packages/preload/src/api/image-inspect-info.ts @@ -0,0 +1,23 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type Dockerode from 'dockerode'; + +export interface ImageInspectInfo extends Dockerode.ImageInspectInfo { + engine: string; +} \ No newline at end of file diff --git a/packages/preload/src/api/provider-info.ts b/packages/preload/src/api/provider-info.ts new file mode 100644 index 00000000000..b428d12bfe4 --- /dev/null +++ b/packages/preload/src/api/provider-info.ts @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +export interface ProviderInfoLifecycle { + status: string; + +} + +export interface ProviderInfo { + name: string; + connection?: string; + lifecycle?: ProviderInfoLifecycle; +} \ No newline at end of file diff --git a/packages/preload/src/command-registry.ts b/packages/preload/src/command-registry.ts new file mode 100644 index 00000000000..b8524336bc1 --- /dev/null +++ b/packages/preload/src/command-registry.ts @@ -0,0 +1,58 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import { Disposable } from "./types/disposable"; + +export interface CommandHandler { + callback: any; + thisArg: any; +} + +export class CommandRegistry { + + private commands = new Map(); + + registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any): Disposable { + + if (this.commands.has(command)) { + throw new Error(`command '${command}' already exists`); + } + // keep command + this.commands.set(command, { + callback, + thisArg, + }); + return Disposable.create(() => { + this.commands.delete(command); + }); + } + + async executeCommand(commandId: string, ...args: any[]): Promise { + // command is on node world, just execute it + if (this.commands.has(commandId)) { + const command = this.commands.get(commandId); + if (command) { + return command.callback.apply(command.thisArg, args); + } + } + + // should try to execute on client side + throw new Error('Unknown command: ' + commandId); + } +} + diff --git a/packages/preload/src/container-registry.ts b/packages/preload/src/container-registry.ts new file mode 100644 index 00000000000..cae78b36ba1 --- /dev/null +++ b/packages/preload/src/container-registry.ts @@ -0,0 +1,279 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type * as containerDesktopAPI from '@tmpwip/extension-api'; +import { Disposable } from './types/disposable'; +import Dockerode from 'dockerode'; +import { ContainerCreateOptions, ContainerInfo } from './api/container-info'; +import { ImageInfo } from './api/image-info'; +import { ImageInspectInfo } from './api/image-inspect-info'; +import { ProviderInfo } from './api/provider-info'; + +const tar: {pack: (dir: string) => NodeJS.ReadableStream} = require('tar-fs'); + +export interface InternalContainerProvider { + name: string; + connection: string; + api: Dockerode; +} + +export interface InternalContainerProviderLifecycle { + internal: containerDesktopAPI.ContainerProviderLifecycle; + status: string; + +} + + +export class ContainerProviderRegistry { + + constructor(private apiSender: any) { + + } + + private providers: Map = new Map(); + private providerLifecycles: Map = new Map(); + private internalProviders: Map = new Map(); + + async registerContainerProviderLifecycle(providerLifecycle: containerDesktopAPI.ContainerProviderLifecycle): Promise { + + const providerName = providerLifecycle.provideName(); + const internalProviderLifecycle = { + internal: providerLifecycle, + status: providerLifecycle.status(), + }; + this.providerLifecycles.set(providerName, internalProviderLifecycle); + return Disposable.create(() => { + this.internalProviders.delete(providerName); + this.providers.delete(providerName); + this.apiSender.send('provider-lifecycle-change', {}); + }); + + } + + + async registerContainerProvider(provider: containerDesktopAPI.ContainerProvider): Promise { + + const providerName = provider.provideName(); + const connection = await provider.provideConnection(); + + this.providers.set(providerName, provider); + + const internalProvider: InternalContainerProvider = { + name: providerName, + connection, + api: new Dockerode({socketPath: connection}), + }; + + this.internalProviders.set(providerName, internalProvider); + this.apiSender.send('provider-change', {}); + + // listen to events + internalProvider.api.getEvents((err, stream) => { + console.log('error is', err); + stream?.on('data', (data) => { + const evt = JSON.parse(data.toString()); + console.log('event is', evt); + if (evt.status === 'stop') { + // need to notify that a container has been stopped + this.apiSender.send('container-stopped-event', evt.id); + } else if (evt.status === 'start') { + // need to notify that a container has been started + this.apiSender.send('container-started-event', evt.id); + } else if (evt.status === 'destroy') { + // need to notify that a container has been destroyed + this.apiSender.send('container-stopped-event', evt.id); + } + }); + }); + + return Disposable.create(() => { + this.internalProviders.delete(providerName); + this.providers.delete(providerName); + this.apiSender.send('provider-change', {}); + }); + } + + async listContainers(): Promise { + const containers = await Promise.all(Array.from(this.internalProviders.values()).map(async (provider) => { + try { + const containers = await provider.api.listContainers({all:true}); + return containers.map((container) => { + const containerInfo: ContainerInfo = {...container, + engine: provider.name, + }; + return containerInfo; + });} catch (error) { + console.log('error in engine', provider.name, error); + return []; + } + })); + const flatttenedContainers = containers.flat(); + return flatttenedContainers; + } + + async listImages(): Promise { + const images = await Promise.all(Array.from(this.internalProviders.values()).map(async (provider) => { + try { + const images = await provider.api.listImages({all:true}); + return images.map((image) => { + const imageInfo: ImageInfo = {...image, + engine: provider.name, + }; + return imageInfo; + });} catch (error) { + console.log('error in engine', provider.name, error); + return []; + } + })); + const flatttenedImages = images.flat(); + return flatttenedImages; + } + + async startProviderLifecycle(providerName: string): Promise { + // need to find the container engine of the container + const providerLifecycle = this.providerLifecycles.get(providerName); + if (!providerLifecycle) { + throw new Error('no provider matching this providerName'); + } + await providerLifecycle.internal.start(); + this.apiSender.send('provider-lifecycle-change', {}); + } + + async stopProviderLifecycle(providerName: string): Promise { + // need to find the container engine of the container + const providerLifecycle = this.providerLifecycles.get(providerName); + if (!providerLifecycle) { + throw new Error('no provider matching this providerName'); + } + await providerLifecycle.internal.stop(); + this.apiSender.send('provider-lifecycle-change', {}); + } + + async stopContainer(engineName: string, id: string): Promise { + // need to find the container engine of the container + const engine = this.internalProviders.get(engineName); + if (!engine) { + throw new Error('no engine matching this container'); + } + return engine.api.getContainer(id).stop(); + } + + async startContainer(engineName: string, id: string): Promise { + // need to find the container engine of the container + const engine = this.internalProviders.get(engineName); + if (!engine) { + throw new Error('no engine matching this container'); + } + return engine.api.getContainer(id).start(); + } + + async createAndStartContainer(engineName: string, options: ContainerCreateOptions): Promise { + // need to find the container engine of the container + const engine = this.internalProviders.get(engineName); + if (!engine) { + throw new Error('no engine matching this container'); + } + const container = await engine.api.createContainer(options); + return container.start(); + } + + async getImageInspect(engineName: string, id: string): Promise { + // need to find the container engine of the container + const engine = this.internalProviders.get(engineName); + if (!engine) { + throw new Error('no engine matching this container'); + } + const imageObject = engine.api.getImage(id); + const imageInspect = await imageObject.inspect(); + return { + engine: engineName, + ...imageInspect, + }; + } + + async buildImage(rootDirectory: string, imageName: string, eventCollect: (eventName: string, data: string) => void): Promise { + console.log('building image', imageName, 'from rootDirectory', rootDirectory); + const firstProvider = Array.from(this.internalProviders.values())[0]; + + // const firstProvider = this.internalProviders.get('Lima')!; + + console.log('building using provider', firstProvider.name); + + const tarStream = tar.pack(rootDirectory); + const streamingPromise = await firstProvider.api.buildImage(tarStream, {t: imageName}); + // eslint-disable-next-line @typescript-eslint/ban-types + let resolve: (output: {}) => void; + let reject: (err: Error) => void; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + + // eslint-disable-next-line @typescript-eslint/ban-types + function onFinished(err: Error| null, output: {}) { + if (err) { + return reject(err); + } + resolve(output); + } + + function onProgress( + event: {stream?: string; status?: string; progress?: string;}) { + if (event.stream) { + eventCollect('stream', event.stream); + } + // console.log('status=>',event.status); + // console.log('progress=>',event.progress); + } + + firstProvider.api.modem.followProgress(streamingPromise, onFinished, onProgress); + return promise; + } + + async getProviderInfos(): Promise { + + // get unique keys + const lifecycleKeys = Array.from(this.providerLifecycles.keys()); + const providerKeys = Array.from(this.providers.keys()); + + // get unique set + const uniqueKeys = Array.from(new Set([...lifecycleKeys, ...providerKeys])); + + return uniqueKeys.map((key) => { + + // matching provider ? + const internalProvider = this.internalProviders.get(key); + const internalProviderLifecycle = this.providerLifecycles.get(key); + + let lifecycle; + if (internalProviderLifecycle) { + lifecycle = { + status: internalProviderLifecycle.status, + }; + } + + return { + name: key, + connection: internalProvider?.connection, + lifecycle, + }; + }); + } + + +} \ No newline at end of file diff --git a/packages/preload/src/extension-loader.ts b/packages/preload/src/extension-loader.ts new file mode 100644 index 00000000000..a2e89db1ac4 --- /dev/null +++ b/packages/preload/src/extension-loader.ts @@ -0,0 +1,331 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import type * as containerDesktopAPI from '@tmpwip/extension-api'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs'; +import type { CommandRegistry } from './command-registry'; +import type { ContainerProviderRegistry } from './container-registry'; +import type { ExtensionInfo } from './api/extension-info'; +import * as zipper from 'zip-local'; + +/** + * Handle the loading of an extension + */ + +export interface AnalyzedExtension { + id: string, + // root folder (where is package.json) + path: string, + manifest: any, + // main entry + mainPath: string, + api: typeof containerDesktopAPI, +} + +export interface ActivatedExtension { + id: string; + deactivateFunction: any; + extensionContext: containerDesktopAPI.ExtensionContext +} + +export class ExtensionLoader { + + private overrideRequireDone = false; + + private activatedExtensions = new Map(); + private analyzedExtensions = new Map(); + + constructor( + private commandRegistry: CommandRegistry, + private containerProviderRegistry: ContainerProviderRegistry, + private apiSender: any, + ) { + + } + + async listExtensions(): Promise { + return Array.from(this.analyzedExtensions.values()).map(extension => ({ + name: extension.manifest.name, + version: extension.manifest.version, + publisher: extension.manifest.publisher, + state: this.activatedExtensions.get(extension.id) ? 'active' : 'inactive', + id: extension.id, + + })); + } + + protected overrideRequire() { + if (!this.overrideRequireDone) { + this.overrideRequireDone = true; + const module = require('module'); + // save original load method + const internalLoad = module._load; + const analyzedExtensions = this.analyzedExtensions; + + // if we try to resolve theia module, return the filename entry to use cache. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + module._load = function (request: string, parent: any): any { + if (request !== '@tmpwip/extension-api') { + console.log('loading...', request, parent); + // eslint-disable-next-line prefer-rest-params + return internalLoad.apply(this, arguments); + } + console.log('in require function, loading with parent', parent.filename); + + const extension = Array.from(analyzedExtensions.values()).find(extension => path.normalize(parent.filename).startsWith(path.normalize((extension.path)))); + if (extension && extension.api) { + return extension.api; + } + throw new Error('Unable to find extension API'); + }; + } + } + + async loadPackagedFile(filePath: string): Promise { + // need to unpack the file before load it + console.log('loadPackagedFile', filePath); + + const filename = path.basename(filePath); + const dirname = path.dirname(filePath); + + const unpackedDirectory = path.resolve(dirname, `../unpacked/${filename}`); + console.log('unpackedDirectory', unpackedDirectory); + fs.mkdirSync(unpackedDirectory, {recursive: true}); + // extract to an existing directory + zipper.sync.unzip(filePath).save(unpackedDirectory); + + await this.loadExtension(unpackedDirectory); + this.apiSender.send('extension-started', {}); + } + + + async start() { + + // add watcher to the $HOME/container-desktop + const pluginsDirectory = path.resolve(os.homedir(), '.local/share/container-desktop/plugins'); + if (fs.existsSync(pluginsDirectory)) { + // add watcher + fs.watch(pluginsDirectory, (_, filename) => { + // need to load the file + const packagedFile = path.resolve(pluginsDirectory, filename); + setTimeout(() => this.loadPackagedFile(packagedFile), 1000); + }); + } + + let folders; + // scan all extensions that we can find from the extensions folder + if (import.meta.env.PROD) { + console.log('IN PRODUCTION MODE'); + // in production mode, use the extensions locally + console.log('dirname is', __dirname); + folders = await this.readProductionFolders(path.join(__dirname, '../../../extensions')); + } else { + // in development mode, use the extensions locally + folders = await this.readDevelopmentFolders(path.join(__dirname, '../../../extensions')); + } + console.log('found folders', folders); + + // ok now load all extensions from these folders + await Promise.all(folders.map(folder => this.loadExtension(folder))); + + } + + async readDevelopmentFolders(path: string): Promise { + const entries = await fs.promises.readdir(path, {withFileTypes: true}); + return entries.filter(entry => entry.isDirectory).map(directory => path + '/' + directory.name).filter(item => !item.includes('docker')).filter(item => !item.includes('lima')); + } + + + async readProductionFolders(path: string): Promise { + const entries = await fs.promises.readdir(path, {withFileTypes: true}); + return entries.filter(entry => entry.isDirectory).map(directory => path + '/' + directory.name + `/builtin/${directory.name}.cdix`); + } + + + + async loadExtension(extensionPath: string): Promise { + // load manifest + const manifest = await this.loadManifest(extensionPath); + console.log('manifest is', manifest); + + console.log('overriding require'); + this.overrideRequire(); + + // create api object + console.log('create API object'); + const api = this.createApi(); + + const extension: AnalyzedExtension = { + id: manifest.name, + manifest, + path: extensionPath, + mainPath: path.resolve(extensionPath, manifest.main), + api, + }; + + this.analyzedExtensions.set(extension.id, extension); + + console.log('load runtime...' + extension.mainPath); + const runtime = this.loadRuntime(extension.mainPath); + + console.log('Activate extension...'); + return this.activateExtension(extension, runtime); + } + + createApi(): typeof containerDesktopAPI { + const commandRegistry = this.commandRegistry; + const commands: typeof containerDesktopAPI.commands = { + registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any): containerDesktopAPI.Disposable { + return commandRegistry.registerCommand(command, callback, thisArg); + }, + executeCommand(commandId: string, ...args: any[]): PromiseLike { + return commandRegistry.executeCommand(commandId, ...args); + }, + }; + + //export function executeCommand(command: string, ...rest: any[]): PromiseLike; + + const containerProviderRegistry = this.containerProviderRegistry; + const container: typeof containerDesktopAPI.container = { + async registerContainerProvider(provider: containerDesktopAPI.ContainerProvider): Promise { + return containerProviderRegistry.registerContainerProvider(provider); + }, + async registerContainerProviderLifecycle(providerLifecycle: containerDesktopAPI.ContainerProviderLifecycle): Promise { + return containerProviderRegistry.registerContainerProviderLifecycle(providerLifecycle); + }, + }; + /* + export namespace container { + export function registerContainerProvider(provider: ContainerProvider): Disposable; + }*/ + + return { + commands, + container, + }; + } + + + loadRuntime(extensionPathFolder: string): NodeRequire { + // cleaning the cache for all files of that plug-in. + Object.keys(require.cache).forEach(function (key): void { + const mod: NodeJS.Module | undefined = require.cache[key]; + + // attempting to reload a native module will throw an error, so skip them + if (mod?.id.endsWith('.node')) { + return; + } + + // remove children that are part of the plug-in + let i = mod?.children.length || 0; + while (i--) { + const childMod: NodeJS.Module | undefined = mod?.children[i]; + // ensure the child module is not null, is in the plug-in folder, and is not a native module (see above) + if (childMod && childMod.id.startsWith(extensionPathFolder) && !childMod.id.endsWith('.node')) { + // cleanup exports - note that some modules (e.g. ansi-styles) define their + // exports in an immutable manner, so overwriting the exports throws an error + delete childMod.exports; + mod?.children.splice(i, 1); + for (let j = 0; j < childMod.children.length; j++) { + delete childMod.children[j]; + } + } + } + + if (key.startsWith(extensionPathFolder)) { + // delete entry + delete require.cache[key]; + const ix = mod?.parent?.children.indexOf(mod) || 0; + if (ix >= 0) { + mod?.parent?.children.splice(ix, 1); + } + } + + }); + return require(extensionPathFolder); + } + + + async loadManifest(extensionPath: string): Promise { + const manifestPath = path.join(extensionPath, 'package.json'); + return new Promise((resolve, reject) => { + fs.readFile(manifestPath, 'utf8', (err, data) => { + if (err) { + reject(err); + } else { + resolve(JSON.parse(data)); + } + }); + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async activateExtension(extension: AnalyzedExtension, extensionMain: any): Promise { + const subscriptions: containerDesktopAPI.Disposable[] = []; + + const extensionContext: containerDesktopAPI.ExtensionContext = { + subscriptions, + }; + let deactivateFunction = undefined; + if (typeof extensionMain['deactivate'] === 'function') { + deactivateFunction = extensionMain['deactivate']; + } + if (typeof extensionMain['activate'] === 'function') { + // return exports + await extensionMain['activate'].apply(undefined, [extensionContext]); + } + const id = extension.id; + const activatedExtension: ActivatedExtension = { + id, + deactivateFunction, + extensionContext, + }; + this.activatedExtensions.set(extension.id, activatedExtension); + } + + async deactivateExtension(extensionId: string): Promise { + const extension = this.activatedExtensions.get(extensionId); + if (extension) { + if (extension.deactivateFunction) { + await extension.deactivateFunction(); + } + + // dispose subscriptions + extension.extensionContext.subscriptions.forEach((subscription) => { + subscription.dispose(); + }); + + this.activatedExtensions.delete(extensionId); + } + } + + + async stopAllExtensions(): Promise { + await Promise.all(Array.from(this.activatedExtensions.keys()).map((extensionId) => this.deactivateExtension(extensionId))); + } + + async startExtension(extensionId: string): Promise { + const extension = this.analyzedExtensions.get(extensionId); + if (extension) { + await this.loadExtension(extension?.path); + } + } + +} \ No newline at end of file diff --git a/packages/preload/src/index.ts b/packages/preload/src/index.ts new file mode 100644 index 00000000000..e3878aa513e --- /dev/null +++ b/packages/preload/src/index.ts @@ -0,0 +1,120 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +/** + * @module preload + */ + +import {contextBridge} from 'electron'; +import type { ContainerCreateOptions, ContainerInfo } from './api/container-info'; +import type { ExtensionInfo } from './api/extension-info'; +import { CommandRegistry } from './command-registry'; +import { ContainerProviderRegistry } from './container-registry'; +import { ExtensionLoader } from './extension-loader'; +import EventEmitter from 'events'; +import type { ImageInfo } from './api/image-info'; +import { ImageInspectInfo } from './api/image-inspect-info'; +import { ProviderInfo } from './api/provider-info'; +const shell = require('electron').shell; + +// initialize extension loader mechanism +function initExtensions(): void { + + const eventEmitter = new EventEmitter(); + const apiSender = { + send: (channel: string, data: string) => { + eventEmitter.emit(channel, data); + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + receive: (channel: string, func: any) => { + eventEmitter.on(channel, (data) => { + func(data); + }); + }, + }; + + contextBridge.exposeInMainWorld('events', apiSender); + + const commandRegistry = new CommandRegistry(); + const containerProviderRegistry = new ContainerProviderRegistry(apiSender); + + contextBridge.exposeInMainWorld('listContainers', async (): Promise => { + return containerProviderRegistry.listContainers(); + }); + + contextBridge.exposeInMainWorld('listImages', async (): Promise => { + return containerProviderRegistry.listImages(); + }); + + contextBridge.exposeInMainWorld('startContainer', async (engine: string, containerId: string): Promise => { + return containerProviderRegistry.startContainer(engine, containerId); + }); + + contextBridge.exposeInMainWorld('createAndStartContainer', async (engine: string, options: ContainerCreateOptions): Promise => { + return containerProviderRegistry.createAndStartContainer(engine, options); + }); + + contextBridge.exposeInMainWorld('stopContainer', async (engine: string, containerId: string): Promise => { + return containerProviderRegistry.stopContainer(engine, containerId); + }); + + contextBridge.exposeInMainWorld('startProviderLifecycle', async (providerName: string): Promise => { + return containerProviderRegistry.startProviderLifecycle(providerName); + }); + + contextBridge.exposeInMainWorld('stopProviderLifecycle', async (providerName: string): Promise => { + return containerProviderRegistry.stopProviderLifecycle(providerName); + }); + + + contextBridge.exposeInMainWorld('buildImage', async (buildDirectory: string, imageName: string, eventCollect: (eventName: string, data: string) => void): Promise => { + return containerProviderRegistry.buildImage(buildDirectory, imageName, eventCollect); + }); + + contextBridge.exposeInMainWorld('getImageInspect', async (engine: string, imageId: string): Promise => { + return containerProviderRegistry.getImageInspect(engine, imageId); + }); + + contextBridge.exposeInMainWorld('getProviderInfos', (): Promise => { + return containerProviderRegistry.getProviderInfos(); + }); + + const extensionLoader = new ExtensionLoader(commandRegistry, containerProviderRegistry, apiSender); + contextBridge.exposeInMainWorld('listExtensions', async (): Promise => { + return extensionLoader.listExtensions(); + }); + + contextBridge.exposeInMainWorld('stopExtension', async (extensionId: string): Promise => { + return extensionLoader.deactivateExtension(extensionId); + }); + contextBridge.exposeInMainWorld('startExtension', async (extensionId: string): Promise => { + return extensionLoader.startExtension(extensionId); + }); + + + contextBridge.exposeInMainWorld('openExternal', (link:string): void => { + shell.openExternal(link); + }); + + extensionLoader.start(); + + +} + +// start extensions +initExtensions(); diff --git a/packages/preload/src/types/disposable.ts b/packages/preload/src/types/disposable.ts new file mode 100644 index 00000000000..379b7c10c99 --- /dev/null +++ b/packages/preload/src/types/disposable.ts @@ -0,0 +1,51 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +export class Disposable { + private disposable: undefined | (() => void); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static from(...disposables: { dispose(): any }[]): Disposable { + return new Disposable(() => { + if (disposables) { + for (const disposable of disposables) { + if (disposable && typeof disposable.dispose === 'function') { + disposable.dispose(); + } + } + } + }); + } + + constructor(func: () => void) { + this.disposable = func; + } + /** + * Dispose this object. + */ + dispose(): void { + if (this.disposable) { + this.disposable(); + this.disposable = undefined; + } + } + + static create(func: () => void): Disposable { + return new Disposable(func); + } +} \ No newline at end of file diff --git a/packages/preload/tsconfig.json b/packages/preload/tsconfig.json new file mode 100644 index 00000000000..0752b04f306 --- /dev/null +++ b/packages/preload/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "sourceMap": false, + "moduleResolution": "Node", + "skipLibCheck": true, + "strict": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + + "types" : ["node"], + + "baseUrl": ".", + "paths": { + "/@/*": [ + "./src/*" + ] + } + }, + "include": [ + "src/**/*.ts", + "exposedInMainWorld.d.ts", + "../../types/**/*.d.ts" + ], + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts" + ] +} diff --git a/packages/preload/vite.config.js b/packages/preload/vite.config.js new file mode 100644 index 00000000000..413fe154bfc --- /dev/null +++ b/packages/preload/vite.config.js @@ -0,0 +1,70 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import {chrome} from '../../.electron-vendors.cache.json'; +import {join} from 'path'; +import {builtinModules} from 'module'; +import commonjs from '@rollup/plugin-commonjs'; +const PACKAGE_ROOT = __dirname; + +/** + * @type {import('vite').UserConfig} + * @see https://vitejs.dev/config/ + */ +const config = { + mode: process.env.MODE, + root: PACKAGE_ROOT, + envDir: process.cwd(), + resolve: { + alias: { + '/@/': join(PACKAGE_ROOT, 'src') + '/', + }, + }, + /*plugins: [ + commonjs({ + dynamicRequireTargets: [ + // include using a glob pattern (either a string or an array of strings) + 'node_modules/ssh2/lib/protocol/crypto/poly1305.js', + ] + }), + ],*/ + build: { + sourcemap: 'inline', + target: `chrome${chrome}`, + outDir: 'dist', + assetsDir: '.', + minify: process.env.MODE !== 'development', + lib: { + entry: 'src/index.ts', + formats: ['cjs'], + }, + rollupOptions: { + external: [ + 'electron', + ...builtinModules.flatMap(p => [p, `node:${p}`]), + ], + output: { + entryFileNames: '[name].cjs', + }, + }, + emptyOutDir: true, + brotliSize: false, + }, +}; + +export default config; diff --git a/packages/renderer/.eslintrc.json b/packages/renderer/.eslintrc.json new file mode 100644 index 00000000000..7d8ca5cb240 --- /dev/null +++ b/packages/renderer/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "env": { + "browser": true, + "node": false + }, + "extends": [ + ], + "parserOptions": { + "parser": "@typescript-eslint/parser", + "ecmaVersion": 12, + "sourceType": "module" + } +} diff --git a/packages/renderer/assets/logo.svg b/packages/renderer/assets/logo.svg new file mode 100644 index 00000000000..7ffa1169368 --- /dev/null +++ b/packages/renderer/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/renderer/index.html b/packages/renderer/index.html new file mode 100644 index 00000000000..ecd1ba0ab2a --- /dev/null +++ b/packages/renderer/index.html @@ -0,0 +1,13 @@ + + + + + + + Container Desktop + + +
+ + + diff --git a/packages/renderer/package.json b/packages/renderer/package.json new file mode 100644 index 00000000000..317b94cff3f --- /dev/null +++ b/packages/renderer/package.json @@ -0,0 +1,36 @@ +{ + "name": "renderer", + "version": "0.0.0", + "type": "module", + "license": "apache-2.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "serve": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@fortawesome/free-brands-svg-icons": "^5.15.4", + "@fortawesome/free-solid-svg-icons": "^5.15.4", + "@patternfly/patternfly": "^4.179.1", + "@rollup/plugin-dynamic-import-vars": "^1.4.2", + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.11", + "@tsconfig/svelte": "^2.0.1", + "@typescript-eslint/eslint-plugin": "5.11.0", + "autoprefixer": "^10.4.2", + "ninja-keys": "^1.1.12", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.1", + "svelte": "^3.37.0", + "svelte-check": "^2.1.0", + "svelte-fa": "^2.4.0", + "svelte-preprocess": "^4.7.2", + "tailwindcss": "^3.0.19", + "tslib": "^2.2.0", + "typescript": "^4.3.2", + "vite": "^2.5.1" + }, + "dependencies": { + "tinro": "^0.6.12" + } +} diff --git a/packages/renderer/src/.gitignore b/packages/renderer/src/.gitignore new file mode 100644 index 00000000000..126fe84d533 --- /dev/null +++ b/packages/renderer/src/.gitignore @@ -0,0 +1,4 @@ +/node_modules/ +/dist/ +/.vscode/ +.DS_Store diff --git a/packages/renderer/src/App.svelte b/packages/renderer/src/App.svelte new file mode 100644 index 00000000000..5c0502ad9f1 --- /dev/null +++ b/packages/renderer/src/App.svelte @@ -0,0 +1,314 @@ + + + +
+ + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/packages/renderer/src/app.css b/packages/renderer/src/app.css new file mode 100644 index 00000000000..bd6213e1dfe --- /dev/null +++ b/packages/renderer/src/app.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/packages/renderer/src/assets/svelte.png b/packages/renderer/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/packages/renderer/src/lib/CommandRegistry.ts b/packages/renderer/src/lib/CommandRegistry.ts new file mode 100644 index 00000000000..93243b6ce86 --- /dev/null +++ b/packages/renderer/src/lib/CommandRegistry.ts @@ -0,0 +1,71 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +export class CommandRegistry { + + init(): void { + //eslint-disable-next-line + const ninja:any = document.getElementById('command-palette'); + ninja.data = [ + { + id: 'Projects', + title: 'Open Projects', + hotkey: 'ctrl+N', + icon: 'apps', + section: 'Projects', + handler: () => { + // it's auto register above hotkey with this handler + alert('Your logic to handle'); + }, + }, + { + id: 'Theme', + title: 'Change theme...', + icon: 'desktop_windows', + children: ['Light Theme', 'Dark Theme', 'System Theme'], + hotkey: 'ctrl+T', + handler: () => { + // open menu if closed. Because you can open directly that menu from it's hotkey + ninja.open({ parent: 'Theme' }); + // if menu opened that prevent it from closing on select that action, no need if you don't have child actions + return {keepOpen: true}; + }, + }, + { + id: 'Light Theme', + title: 'Change theme to Light', + icon: 'light_mode', + parent: 'Theme', + handler: () => { + // simple handler + document.documentElement.classList.remove('dark'); + }, + }, + { + id: 'Dark Theme', + title: 'Change theme to Dark', + icon: 'dark_mode', + parent: 'Theme', + handler: () => { + // simple handler + document.documentElement.classList.add('dark'); + }, + }, + ]; + } +} \ No newline at end of file diff --git a/packages/renderer/src/lib/ContainerIcon.svelte b/packages/renderer/src/lib/ContainerIcon.svelte new file mode 100644 index 00000000000..8da99031dce --- /dev/null +++ b/packages/renderer/src/lib/ContainerIcon.svelte @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/renderer/src/lib/ContainerList.svelte b/packages/renderer/src/lib/ContainerList.svelte new file mode 100644 index 00000000000..0fffa160def --- /dev/null +++ b/packages/renderer/src/lib/ContainerList.svelte @@ -0,0 +1,419 @@ + + + +
+ +
+
+
+
+ + + + +
+
+
+
+ +
+
+
+ + + + + {#each containers as container} + + + + + {/each} + +
+
+
+ + +
+
+
+
{getName(container)}
+
{getImage(container)}
+
+
+
{getState(container)}
+
{getEngine(container)}
+
{getPort(container)}
+
+
+
+
+
+ + + + +
+
+
+
+
+ +
+
+ + +

No container

+
No container
+ +
+
+ +
+ + + + +{#if openChoiceModal} + +{/if} + + + + +{#if fromDockerfileModal} + +{/if} \ No newline at end of file diff --git a/packages/renderer/src/lib/ExtensionList.svelte b/packages/renderer/src/lib/ExtensionList.svelte new file mode 100644 index 00000000000..c9458725e83 --- /dev/null +++ b/packages/renderer/src/lib/ExtensionList.svelte @@ -0,0 +1,74 @@ + + + +
+
+ + + {#each extensions as extension} + + + + + {/each} + +
+
+
+ +
+
+
+
{extension.name}
+
{extension.publisher}
+
+
+
{extension.version}
+
+
+
+
+
+ + + +
+
+
+
\ No newline at end of file diff --git a/packages/renderer/src/lib/ImagesList.svelte b/packages/renderer/src/lib/ImagesList.svelte new file mode 100644 index 00000000000..dd955436ea9 --- /dev/null +++ b/packages/renderer/src/lib/ImagesList.svelte @@ -0,0 +1,264 @@ + + + +
+ +
+
+
+
+ + + + +
+
+ +
+ + + + {#each $filtered as image} + + + + + {/each} + +
+
+
+
+
{getName(image)}
+
{getId(image)}
+
+
+
{getTag(image)}
+
{getEngine(image)}
+
+ +
+
+ +
+ +
+
+
+ + +
+
+
+
+
+ +
+
+ + +

No image

+
No image
+ +
+
+ +
+ + + + {#if runContainerFromImageModal} + + {/if} \ No newline at end of file diff --git a/packages/renderer/src/lib/ProviderList.svelte b/packages/renderer/src/lib/ProviderList.svelte new file mode 100644 index 00000000000..83186a1ee61 --- /dev/null +++ b/packages/renderer/src/lib/ProviderList.svelte @@ -0,0 +1,80 @@ + +
+ + + {#each $providerInfos as provider} +
+
+
{provider.name}
+
+ {#if provider.lifecycle} + Status: {provider.lifecycle.status} + {/if} +
+
+
+
+ {#if provider.lifecycle} + + + + {/if} +
+
+ +
+ {#if provider.connection} + Connection: + {provider.connection} + {/if} +
+
+ {/each} + +
\ No newline at end of file diff --git a/packages/renderer/src/main.ts b/packages/renderer/src/main.ts new file mode 100644 index 00000000000..7b4044196ac --- /dev/null +++ b/packages/renderer/src/main.ts @@ -0,0 +1,8 @@ +import App from './App.svelte' + + +const app = new App({ + target: document.getElementById('app') +}) + +export default app diff --git a/packages/renderer/src/override.css b/packages/renderer/src/override.css new file mode 100644 index 00000000000..c396196c70d --- /dev/null +++ b/packages/renderer/src/override.css @@ -0,0 +1,16 @@ + +:root { + --pf-global--primary-color--100: #6d28d9; + --pf-global--primary-color--light-100: #6d28d9; + --pf-global--primary-color--dark-100: #6d28d9; + + --pf-global--primary-color--200: #5b21b6; + --pf-global--primary-color--light-200: #5b21b6; + --pf-global--primary-color--dark-200: #5b21b6; + + --pf-global--primary-color--300: #6d28d9; + --pf-global--primary-color--light-300: #6d28d9; + --pf-global--primary-color--dark-300: #6d28d9; + + +} \ No newline at end of file diff --git a/packages/renderer/src/stores/containers.ts b/packages/renderer/src/stores/containers.ts new file mode 100644 index 00000000000..75a3f5c5dc5 --- /dev/null +++ b/packages/renderer/src/stores/containers.ts @@ -0,0 +1,59 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import { writable, derived } from 'svelte/store'; +import type { ContainerInfo } from '../../../preload/src/api/container-info'; + +export async function fetchContainers() { + const result = await window.listContainers(); + containersInfos.set(result); +} + +fetchContainers(); +export const containersInfos = writable([]); + +export const searchPattern = writable(''); + +function getName(containerInfo: ContainerInfo) { + return JSON.stringify(containerInfo).toLowerCase(); + } + +export const filtered = derived( + [searchPattern, containersInfos], + ([$searchPattern, $containersInfos]) => $containersInfos.filter(containerInfo => getName(containerInfo).includes($searchPattern.toLowerCase())), + ); + +// need to refresh when extension is started or stopped +window.addEventListener('extension-started', () => { + fetchContainers(); +}); +window.addEventListener('extension-stopped', () => { + fetchContainers(); +}); + +window.events?.receive('container-stopped-event', () => { + fetchContainers(); +}); + +window.events?.receive('container-started-event', () => { + fetchContainers(); +}); + +window.events?.receive('provider-change', () => { + fetchContainers(); +}); diff --git a/packages/renderer/src/stores/extensions.ts b/packages/renderer/src/stores/extensions.ts new file mode 100644 index 00000000000..bf25c7ddf29 --- /dev/null +++ b/packages/renderer/src/stores/extensions.ts @@ -0,0 +1,39 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import { writable } from 'svelte/store'; + +export async function fetchExtensions() { + const result = await window.listExtensions(); + extensionInfos.set(result); +} + +fetchExtensions(); +export const extensionInfos = writable([]); + +// need to refresh when extension is started or stopped +window.addEventListener('extension-started', () => { + fetchExtensions(); +}); +window.addEventListener('extension-stopped', () => { + fetchExtensions(); +}); + +window?.events.receive('extension-started', () => { + fetchExtensions(); +}); diff --git a/packages/renderer/src/stores/images.ts b/packages/renderer/src/stores/images.ts new file mode 100644 index 00000000000..bacf92ddf1d --- /dev/null +++ b/packages/renderer/src/stores/images.ts @@ -0,0 +1,55 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import { writable, derived } from 'svelte/store'; +import type { ImageInfo } from '../../../preload/src/api/image-info'; +export async function fetchImages() { + const result = await window.listImages(); + imagesInfos.set(result); +} + +fetchImages(); +export const imagesInfos = writable([]); + +export const searchPattern = writable(''); + +function getName(imageInfo: ImageInfo) { + return JSON.stringify(imageInfo).toLowerCase(); + } + +export const filtered = derived( + [searchPattern, imagesInfos], + ([$searchPattern, $imagesInfos]) => $imagesInfos.filter(imageInfo => getName(imageInfo).includes($searchPattern.toLowerCase())), + ); + +// need to refresh when extension is started or stopped +window.addEventListener('extension-started', () => { + fetchImages(); +}); +window.addEventListener('extension-stopped', () => { + fetchImages(); +}); + +window.addEventListener('image-build', () => { + fetchImages(); +}); + +window?.events.receive('provider-change', () => { + console.log('receive provider change event, fetchImages...'); + fetchImages(); +}); diff --git a/packages/renderer/src/stores/providers.ts b/packages/renderer/src/stores/providers.ts new file mode 100644 index 00000000000..96b9f795452 --- /dev/null +++ b/packages/renderer/src/stores/providers.ts @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import { writable } from 'svelte/store'; +export async function fetchProviders() { + const result = await window.getProviderInfos(); + console.log('providers result', result); + providerInfos.set(result); +} + +fetchProviders(); +export const providerInfos = writable([]); + +// need to refresh when extension is started or stopped +window.addEventListener('extension-started', () => { + fetchProviders(); +}); +window.addEventListener('extension-stopped', () => { + fetchProviders(); +}); + +window.addEventListener('provider-lifecycle-change', () => { + fetchProviders(); +}); + +window?.events.receive('provider-lifecycle-change', () => { + fetchProviders(); +}); + +window?.events.receive('provider-change', () => { + fetchProviders(); +}); diff --git a/packages/renderer/src/vite-env.d.ts b/packages/renderer/src/vite-env.d.ts new file mode 100644 index 00000000000..4078e7476a2 --- /dev/null +++ b/packages/renderer/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/packages/renderer/svelte.config.js b/packages/renderer/svelte.config.js new file mode 100644 index 00000000000..a3c0de8f71f --- /dev/null +++ b/packages/renderer/svelte.config.js @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +import sveltePreprocess from 'svelte-preprocess'; + +export default { + // Consult https://github.com/sveltejs/svelte-preprocess + // for more information about preprocessors + preprocess: sveltePreprocess(), +}; diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json new file mode 100644 index 00000000000..f2e7d3560de --- /dev/null +++ b/packages/renderer/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "esnext", + "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", + "types/**/*.d.ts", + "../../types/**/*.d.ts", + "../preload/exposedInMainWorld.d.ts" + ] +} diff --git a/packages/renderer/vite.config.js b/packages/renderer/vite.config.js new file mode 100644 index 00000000000..157d52baaf3 --- /dev/null +++ b/packages/renderer/vite.config.js @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +/* eslint-env node */ +import {join} from 'path'; +import { svelte } from "@sveltejs/vite-plugin-svelte" +import { defineConfig } from "vite" + +const PACKAGE_ROOT = __dirname; + + +// https://vitejs.dev/config/ +export default defineConfig({ + mode: process.env.MODE, + root: PACKAGE_ROOT, + resolve: { + alias: { + '/@/': join(PACKAGE_ROOT, 'src') + '/', + }, + }, + plugins: [svelte()], + optimizeDeps: { + exclude: ['tinro'] + }, + base: '', + server: { + fs: { + strict: true, + }, + }, + build: { + sourcemap: true, + outDir: 'dist', + assetsDir: '.', + + emptyOutDir: true, + brotliSize: false, + }, +}) diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000000..0e04caedf7f --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +module.exports = { + plugins: { + tailwindcss: {}, + 'postcss-import': {}, + autoprefixer: {}, + }, +}; diff --git a/scripts/update-electron-vendors.js b/scripts/update-electron-vendors.js new file mode 100644 index 00000000000..aaa4ddb3203 --- /dev/null +++ b/scripts/update-electron-vendors.js @@ -0,0 +1,45 @@ +const {writeFile} = require('fs/promises'); +const {execSync} = require('child_process'); +const electron = require('electron'); +const path = require('path'); + +/** + * Returns versions of electron vendors + * The performance of this feature is very poor and can be improved + * @see https://github.com/electron/electron/issues/28006 + * + * @returns {NodeJS.ProcessVersions} + */ +function getVendors() { + const output = execSync(`${electron} -p "JSON.stringify(process.versions)"`, { + env: {'ELECTRON_RUN_AS_NODE': '1'}, + encoding: 'utf-8', + }); + + return JSON.parse(output); +} + +function updateVendors() { + const electronRelease = getVendors(); + + const nodeMajorVersion = electronRelease.node.split('.')[0]; + const chromeMajorVersion = electronRelease.v8.split('.')[0] + electronRelease.v8.split('.')[1]; + + const browserslistrcPath = path.resolve(process.cwd(), '.browserslistrc'); + + return Promise.all([ + writeFile('./.electron-vendors.cache.json', + JSON.stringify({ + chrome: chromeMajorVersion, + node: nodeMajorVersion, + }, null, 2) + '\n', + ), + + writeFile(browserslistrcPath, `Chrome ${chromeMajorVersion}\n`, 'utf8'), + ]); +} + +updateVendors().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/watch.js b/scripts/watch.js new file mode 100644 index 00000000000..019a1cd30c1 --- /dev/null +++ b/scripts/watch.js @@ -0,0 +1,158 @@ +#!/usr/bin/env node + +const {createServer, build, createLogger} = require('vite'); +const electronPath = require('electron'); +const {spawn} = require('child_process'); +const {generateAsync} = require('dts-for-context-bridge'); +const path = require('path'); + +/** @type 'production' | 'development'' */ +const mode = process.env.MODE = process.env.MODE || 'development'; + + +/** @type {import('vite').LogLevel} */ +const LOG_LEVEL = 'info'; + + +/** @type {import('vite').InlineConfig} */ +const sharedConfig = { + mode, + build: { + watch: {}, + }, + logLevel: LOG_LEVEL, +}; + +/** Messages on stderr that match any of the contained patterns will be stripped from output */ +const stderrFilterPatterns = [ + // warning about devtools extension + // https://github.com/cawa-93/vite-electron-builder/issues/492 + // https://github.com/MarshallOfSound/electron-devtools-installer/issues/143 + /ExtensionLoadWarning/, +]; + +/** + * @param {{name: string; configFile: string; writeBundle: import('rollup').OutputPlugin['writeBundle'] }} param0 + */ +const getWatcher = ({name, configFile, writeBundle}) => { + return build({ + ...sharedConfig, + configFile, + plugins: [{name, writeBundle}], + }); +}; + + +/** + * Start or restart App when source files are changed + * @param {{config: {server: import('vite').ResolvedServerOptions}}} ResolvedServerOptions + */ +const setupMainPackageWatcher = ({config: {server}}) => { + // Create VITE_DEV_SERVER_URL environment variable to pass it to the main process. + { + const protocol = server.https ? 'https:' : 'http:'; + const host = server.host || 'localhost'; + const port = server.port; // Vite searches for and occupies the first free port: 3000, 3001, 3002 and so on + const path = '/'; + process.env.VITE_DEV_SERVER_URL = `${protocol}//${host}:${port}${path}`; + } + + const logger = createLogger(LOG_LEVEL, { + prefix: '[main]', + }); + + /** @type {ChildProcessWithoutNullStreams | null} */ + let spawnProcess = null; + + return getWatcher({ + name: 'reload-app-on-main-package-change', + configFile: 'packages/main/vite.config.js', + writeBundle() { + if (spawnProcess !== null) { + spawnProcess.off('exit', process.exit); + spawnProcess.kill('SIGINT'); + spawnProcess = null; + } + + spawnProcess = spawn(String(electronPath), ['.']); + + spawnProcess.stdout.on('data', d => d.toString().trim() && logger.warn(d.toString(), {timestamp: true})); + spawnProcess.stderr.on('data', d => { + const data = d.toString().trim(); + if (!data) return; + const mayIgnore = stderrFilterPatterns.some((r) => r.test(data)); + if (mayIgnore) return; + logger.error(data, { timestamp: true }); + }); + + // Stops the watch script when the application has been quit + spawnProcess.on('exit', process.exit); + }, + }); +}; + + +/** + * Start or restart App when source files are changed + * @param {{ws: import('vite').WebSocketServer}} WebSocketServer + */ +const setupPreloadPackageWatcher = ({ws}) => + getWatcher({ + name: 'reload-page-on-preload-package-change', + configFile: 'packages/preload/vite.config.js', + writeBundle() { + // Generating exposedInMainWorld.d.ts when preload package is changed. + generateAsync({ + input: 'packages/preload/tsconfig.json', + output: 'packages/preload/exposedInMainWorld.d.ts', + }); + + ws.send({ + type: 'full-reload', + }); + }, + }); + + +/** + * Start or restart App when source files are changed + * @param {{ws: import('vite').WebSocketServer}} WebSocketServer + */ + const setupExtensionApiWatcher = (name) =>{ + let spawnProcess; + const folderName = path.resolve(__dirname, '../extensions/' + name); + + console.log('dirname is', folderName); + spawnProcess = spawn('yarn', ['--cwd', folderName, 'watch'] ); + + spawnProcess.stdout.on('data', d => d.toString().trim() && console.warn(d.toString(), {timestamp: true})); + spawnProcess.stderr.on('data', d => { + const data = d.toString().trim(); + if (!data) return; + console.error(data, { timestamp: true }); + }); + + // Stops the watch script when the application has been quit + spawnProcess.on('exit', process.exit); + + }; + +(async () => { + try { + const viteDevServer = await createServer({ + ...sharedConfig, + configFile: 'packages/renderer/vite.config.js', + }); + + await viteDevServer.listen(); + await setupExtensionApiWatcher('crc'); + await setupExtensionApiWatcher('docker'); + await setupExtensionApiWatcher('lima'); + await setupExtensionApiWatcher('podman'); + await setupPreloadPackageWatcher(viteDevServer); + await setupMainPackageWatcher(viteDevServer); + } catch (e) { + console.error(e); + process.exit(1); + } +})(); diff --git a/tailwind.config.cjs b/tailwind.config.cjs new file mode 100644 index 00000000000..342fbd9807a --- /dev/null +++ b/tailwind.config.cjs @@ -0,0 +1,32 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +module.exports = { + content: [ + 'packages/renderer/index.html', + 'packages/renderer/src/**/*.{svelte,css}', + ], + theme: { + extend: { + transitionProperty: { + width: 'width', + }, + }, + }, + plugins: [], +}; diff --git a/tests/e2e.spec.ts b/tests/e2e.spec.ts new file mode 100644 index 00000000000..e9e418eaa4f --- /dev/null +++ b/tests/e2e.spec.ts @@ -0,0 +1,70 @@ +import type {ElectronApplication} from 'playwright'; +import {_electron as electron} from 'playwright'; +import {afterAll, beforeAll, expect, test} from 'vitest'; +import {createHash} from 'crypto'; +import '../packages/preload/exposedInMainWorld.d.ts'; + +let electronApp: ElectronApplication; + +beforeAll(async () => { + electronApp = await electron.launch({args: ['.']}); +}); + +afterAll(async () => { + await electronApp.close(); +}); + +test('Main window state', async () => { + const windowState: { isVisible: boolean; isDevToolsOpened: boolean; isCrashed: boolean } + = await electronApp.evaluate(({BrowserWindow}) => { + const mainWindow = BrowserWindow.getAllWindows()[0]; + + const getState = () => ({ + isVisible: mainWindow.isVisible(), + isDevToolsOpened: mainWindow.webContents.isDevToolsOpened(), + isCrashed: mainWindow.webContents.isCrashed(), + }); + + return new Promise((resolve) => { + if (mainWindow.isVisible()) { + resolve(getState()); + } else + mainWindow.once('ready-to-show', () => setTimeout(() => resolve(getState()), 0)); + }); + }); + + expect(windowState.isCrashed, 'App was crashed').toBeFalsy(); + expect(windowState.isVisible, 'Main window was not visible').toBeTruthy(); + expect(windowState.isDevToolsOpened, 'DevTools was opened').toBeFalsy(); +}); + +test('Main window web content', async () => { + const page = await electronApp.firstWindow(); + const element = await page.$('#app', {strict: true}); + expect(element, 'Can\'t find root element').toBeDefined(); + expect((await element.innerHTML()).trim(), 'Window content was empty').not.equal(''); +}); + + +test('Preload versions', async () => { + const page = await electronApp.firstWindow(); + const exposedVersions = await page.evaluate(() => globalThis.versions); + const expectedVersions = await electronApp.evaluate(() => process.versions); + expect(exposedVersions).toBeDefined(); + expect(exposedVersions).to.deep.equal(expectedVersions); +}); + +test('Preload nodeCrypto', async () => { + const page = await electronApp.firstWindow(); + + const exposedNodeCrypto = await page.evaluate(() => globalThis.nodeCrypto); + expect(exposedNodeCrypto).toHaveProperty('sha256sum'); + + const sha256sumType = await page.evaluate(() => typeof globalThis.nodeCrypto.sha256sum); + expect(sha256sumType).toEqual('function'); + + const rawTestData = 'raw data'; + const hash = await page.evaluate((d: string) => globalThis.nodeCrypto.sha256sum(d), rawTestData); + const expectedHash = createHash('sha256').update(rawTestData).digest('hex'); + expect(hash).toEqual(expectedHash); +}); diff --git a/types/env.d.ts b/types/env.d.ts new file mode 100644 index 00000000000..a1ffc3315a8 --- /dev/null +++ b/types/env.d.ts @@ -0,0 +1,22 @@ +/// + +/** + * Describes all existing environment variables and their types. + * Required for Code completion and type checking + * + * Note: To prevent accidentally leaking env variables to the client, only variables prefixed with `VITE_` are exposed to your Vite-processed code + * + * @see https://github.com/vitejs/vite/blob/cab55b32de62e0de7d7789e8c2a1f04a8eae3a3f/packages/vite/types/importMeta.d.ts#L62-L69 Base Interface + * @see https://vitejs.dev/guide/env-and-mode.html#env-files Vite Env Variables Doc + */ +interface ImportMetaEnv { + + /** + * The value of the variable is set in scripts/watch.js and depend on packages/main/vite.config.js + */ + readonly VITE_DEV_SERVER_URL: undefined | string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 00000000000..4dbc99c5d6d --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (C) 2022 Red Hat, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ***********************************************************************/ + +/** + * Config for global end-to-end tests + * placed in project root tests folder + * @type {import('vite').UserConfig} + * @see https://vitest.dev/config/ + */ +const config = { + test: { + /** + * By default, vitest search test files in all packages. + * For e2e tests have sense search only is project root tests folder + */ + include: ['./tests/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + + /** + * A default timeout of 5000ms is sometimes not enough for playwright. + */ + testTimeout: 30_000, + hookTimeout: 30_000, + }, +}; + +export default config; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..05787e5e8a8 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4251 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@^5.1.1", "7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"7zip-min@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/7zip-min/-/7zip-min-1.4.1.tgz" + integrity sha512-xiK95rSNr6cXB7UXVLJdrxtNrlXBqZrMhcKlq0S5Rsg6vVhh+9OSUyQIba8bSAGgHjpETlWXAYEuVfxYGEfCWA== + dependencies: + "7zip-bin" "^5.1.1" + +"@babel/code-frame@^7.0.0": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz" + 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.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz" + 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.npmjs.org/@electron/get/-/get-1.13.1.tgz" + 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.npmjs.org/@electron/universal/-/universal-1.0.5.tgz" + 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" + +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.2.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@fortawesome/fontawesome-common-types@^0.2.36": + version "0.2.36" + resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz" + integrity sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg== + +"@fortawesome/free-brands-svg-icons@^5.15.4": + version "5.15.4" + resolved "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz" + integrity sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.36" + +"@fortawesome/free-solid-svg-icons@^5.15.4": + version "5.15.4" + resolved "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz" + integrity sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.36" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.3" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz" + integrity sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@lit/reactive-element@^1.0.0", "@lit/reactive-element@^1.1.0": + version "1.2.2" + resolved "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.2.2.tgz" + integrity sha512-HkhTTO2rT8jlf4izz7ME/+YUjqz+ZHgmnOKorA+7tkDmQDg6QzDpWSFz//1YyiL193W4bc7rlQCiYyFiZa9pkQ== + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz" + 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.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz" + 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" + +"@material/mwc-icon@0.25.3": + version "0.25.3" + resolved "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.25.3.tgz" + integrity sha512-36076AWZIRSr8qYOLjuDDkxej/HA0XAosrj7TS1ZeLlUBnLUtbDtvc1S7KSa0hqez7ouzOqGaWK24yoNnTa2OA== + dependencies: + lit "^2.0.0" + tslib "^2.0.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + 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.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@patternfly/patternfly@^4.179.1": + version "4.179.1" + resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-4.179.1.tgz#c9cfb65ee0fc71ee2eaa909c101a5eaf4234d85f" + integrity sha512-fmTrk7FLtlWC1mstp+RvFt4nsLCxgsS/vDlQaYoCH5KDaM8zu+yUimnlqZBufmG2+ZbnnIysWiSmlpv7/nmmqQ== + +"@rollup/plugin-commonjs@^21.0.1": + version "21.0.1" + resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz" + integrity sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-dynamic-import-vars@^1.4.2": + version "1.4.2" + resolved "https://registry.npmjs.org/@rollup/plugin-dynamic-import-vars/-/plugin-dynamic-import-vars-1.4.2.tgz" + integrity sha512-SEaS9Pf0RyaZ/oJ1knLZT+Fu0X6DlyTfUcoE7XKkiKJjNaB+8SLoHmDVRhomo5RpWHPyd+B00G/bE5R5+Q+HEg== + dependencies: + "@rollup/pluginutils" "^4.1.2" + estree-walker "^2.0.1" + fast-glob "^3.2.7" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^4.1.2": + version "4.1.2" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.2.tgz" + integrity sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sveltejs/vite-plugin-svelte@^1.0.0-next.11": + version "1.0.0-next.37" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz" + 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" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@ts-morph/common@~0.12.2": + version "0.12.3" + resolved "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.3.tgz" + integrity sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w== + dependencies: + fast-glob "^3.2.7" + minimatch "^3.0.4" + mkdirp "^1.0.4" + path-browserify "^1.0.1" + +"@tsconfig/svelte@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-2.0.1.tgz" + integrity sha512-aqkICXbM1oX5FfgZd2qSSAGdyo/NRxjWCamxoyi3T8iVQnzGge19HhDYzZ6NrVOW7bhcWNSq9XexWFtMzbB24A== + +"@types/chai-subset@^1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz" + integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.0": + version "4.3.0" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz" + integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== + +"@types/concat-stream@^1.6.0": + version "1.6.1" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== + dependencies: + "@types/node" "*" + +"@types/debug@^4.1.6": + version "4.1.7" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/docker-modem@*": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.2.tgz" + integrity sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ== + dependencies: + "@types/node" "*" + "@types/ssh2" "*" + +"@types/dockerode@^3.3.3": + version "3.3.3" + resolved "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.3.tgz" + integrity sha512-DBFTE/wiZKodQhDrdkzLVT3K0X1JO/1fTxPaTQN0jiPNdTOFoPt8LYnuYEzalPgVpZbGEeuJTls7qn6jMvuydg== + dependencies: + "@types/docker-modem" "*" + "@types/node" "*" + +"@types/estree@*": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" + integrity sha1-yayFsqX9GENbjIXZ7LUObWyJP/g= + dependencies: + "@types/node" "*" + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "17.0.16" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.16.tgz" + integrity sha512-ydLaGVfQOQ6hI1xK2A5nVh8bl0OGoIfYMxPWHqqYe9bTkWCfqiVvZoh2I/QF2sNSkZzZyROBoTefIEI+PB6iIA== + +"@types/node@^10.0.3": + version "10.17.60" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/node@^14.6.2": + version "14.18.10" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz" + integrity sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ== + +"@types/node@^8.0.0": + version "8.10.66" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/pug@^2.0.4": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz" + integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@^6.2.31": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/sass@^1.16.0": + version "1.43.1" + resolved "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz" + integrity sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g== + dependencies: + "@types/node" "*" + +"@types/semver@^7.3.6": + version "7.3.9" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz" + integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + +"@types/ssh2-streams@*": + version "0.1.9" + resolved "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.9.tgz" + integrity sha512-I2J9jKqfmvXLR5GomDiCoHrEJ58hAOmFrekfFqmCFd+A6gaEStvWnPykoWUwld1PNg4G5ag1LwdA+Lz1doRJqg== + dependencies: + "@types/node" "*" + +"@types/ssh2@*": + version "0.5.51" + resolved "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.51.tgz" + integrity sha512-aIq7ownezauW/+VWYaeXwd5J1Evnn4EXyeKi7bT3H6ZLBLoqsmhdvkHYPLpnZPM6unKKKsxTHIyQAVOZnPiJBw== + dependencies: + "@types/node" "*" + "@types/ssh2-streams" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + +"@types/verror@^1.10.3": + version "1.10.5" + resolved "https://registry.npmjs.org/@types/verror/-/verror-1.10.5.tgz" + integrity sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw== + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^17.0.1": + version "17.0.8" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.8.tgz" + integrity sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.9.2" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz" + integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.11.0.tgz" + integrity sha512-HJh33bgzXe6jGRocOj4FmefD7hRY4itgjzOrSs3JPrTNXsX7j5+nQPciAUj/1nZtwo2kAc3C75jZO+T23gzSGw== + dependencies: + "@typescript-eslint/scope-manager" "5.11.0" + "@typescript-eslint/type-utils" "5.11.0" + "@typescript-eslint/utils" "5.11.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.11.0.tgz" + integrity sha512-x0DCjetHZYBRovJdr3U0zG9OOdNXUaFLJ82ehr1AlkArljJuwEsgnud+Q7umlGDFLFrs8tU8ybQDFocp/eX8mQ== + dependencies: + "@typescript-eslint/scope-manager" "5.11.0" + "@typescript-eslint/types" "5.11.0" + "@typescript-eslint/typescript-estree" "5.11.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.11.0.tgz" + integrity sha512-z+K4LlahDFVMww20t/0zcA7gq/NgOawaLuxgqGRVKS0PiZlCTIUtX0EJbC0BK1JtR4CelmkPK67zuCgpdlF4EA== + dependencies: + "@typescript-eslint/types" "5.11.0" + "@typescript-eslint/visitor-keys" "5.11.0" + +"@typescript-eslint/type-utils@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.11.0.tgz" + integrity sha512-wDqdsYO6ofLaD4DsGZ0jGwxp4HrzD2YKulpEZXmgN3xo4BHJwf7kq49JTRpV0Gx6bxkSUmc9s0EIK1xPbFFpIA== + dependencies: + "@typescript-eslint/utils" "5.11.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.11.0.tgz" + integrity sha512-cxgBFGSRCoBEhvSVLkKw39+kMzUKHlJGVwwMbPcTZX3qEhuXhrjwaZXWMxVfxDgyMm+b5Q5b29Llo2yow8Y7xQ== + +"@typescript-eslint/typescript-estree@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.11.0.tgz" + integrity sha512-yVH9hKIv3ZN3lw8m/Jy5I4oXO4ZBMqijcXCdA4mY8ull6TPTAoQnKKrcZ0HDXg7Bsl0Unwwx7jcXMuNZc0m4lg== + dependencies: + "@typescript-eslint/types" "5.11.0" + "@typescript-eslint/visitor-keys" "5.11.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.11.0.tgz" + integrity sha512-g2I480tFE1iYRDyMhxPAtLQ9HAn0jjBtipgTCZmd9I9s11OV8CTsG+YfFciuNDcHqm4csbAgC2aVZCHzLxMSUw== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.11.0" + "@typescript-eslint/types" "5.11.0" + "@typescript-eslint/typescript-estree" "5.11.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.11.0": + version "5.11.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.11.0.tgz" + integrity sha512-E8w/vJReMGuloGxJDkpPlGwhxocxOpSVgSvjiLO5IxZPmxZF30weOeJYyPSEACwM+X4NziYS9q+WkN/2DHYQwA== + dependencies: + "@typescript-eslint/types" "5.11.0" + eslint-visitor-keys "^3.0.0" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.4.1: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + 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.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + 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.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + 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.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz" + integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw== + +app-builder-lib@22.14.13: + version "22.14.13" + resolved "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.14.13.tgz" + 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" + +arg@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asar@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/asar/-/asar-3.1.0.tgz" + 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" + +asn1@~0.2.0: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +async@0.9.x: + version "0.9.2" + resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.2: + version "10.4.2" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz" + integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ== + dependencies: + browserslist "^4.19.1" + caniuse-lite "^1.0.30001297" + fraction.js "^4.1.2" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +boolean@^3.0.1: + version "3.1.4" + resolved "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz" + integrity sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" + 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.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + 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.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@^0.2.5, buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.1.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + 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.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz" + 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.npmjs.org/builder-util/-/builder-util-22.14.13.tgz" + 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" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" + 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" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297: + version "1.0.30001310" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz" + integrity sha512-cb9xTV8k9HTIUA3GnPUJCk0meUnrHL5gy5QePfDjxHyNBcnzPzrHFv5GqfP7ue5b1ZyzZL0RJboD6hQlPXjhjg== + +caseless@^0.12.0, caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chai@^4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + 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.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@^3.4.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + 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" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + 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.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +coa@2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-block-writer@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.0.tgz" + integrity sha512-GEqWvEWWsOvER+g9keO4ohFoD3ymwyCnqY3hoTr7GZipYFwEhMHJw+TtV0rfgRhNImM6QWZGO2XYjlJVyYT62w== + dependencies: + tslib "2.3.1" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + 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.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + 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.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +combined-stream@^1.0.6, combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + 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.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" + 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.npmjs.org/configstore/-/configstore-5.0.1.tgz" + 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.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +cross-env@7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + 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.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: + version "4.3.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" + 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.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz" + 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.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dmg-builder@22.14.13: + version "22.14.13" + resolved "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.14.13.tgz" + 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.npmjs.org/dmg-license/-/dmg-license-1.0.10.tgz" + 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" + +docker-modem@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.3.tgz" + integrity sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw== + dependencies: + debug "^4.1.1" + readable-stream "^3.5.0" + split-ca "^1.0.1" + ssh2 "^1.4.0" + +dockerode@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/dockerode/-/dockerode-3.3.1.tgz" + integrity sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ== + dependencies: + docker-modem "^3.0.0" + tar-fs "~2.0.1" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +dts-for-context-bridge@0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/dts-for-context-bridge/-/dts-for-context-bridge-0.7.1.tgz" + integrity sha512-Tm5kJlCtOmNcbc0N/bvGREhrhjFoACJqDUTxW+X2JL114+8CGiAWn80lDE/3S6P1OcrfuI8+Bzd3/iNCxx2ciA== + dependencies: + coa "2.0.2" + ts-morph "13.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ejs@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +electron-builder@22.14.13: + version "22.14.13" + resolved "https://registry.npmjs.org/electron-builder/-/electron-builder-22.14.13.tgz" + 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-devtools-installer@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz" + integrity sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ== + dependencies: + rimraf "^3.0.2" + semver "^7.2.1" + tslib "^2.1.0" + unzip-crx-3 "^0.2.0" + +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz" + 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.npmjs.org/electron-publish/-/electron-publish-22.14.13.tgz" + 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-to-chromium@^1.4.17: + version "1.4.67" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz" + integrity sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg== + +electron-updater@4.6.5: + version "4.6.5" + resolved "https://registry.npmjs.org/electron-updater/-/electron-updater-4.6.5.tgz" + 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@17.0.0: + version "17.0.0" + resolved "https://registry.npmjs.org/electron/-/electron-17.0.0.tgz" + integrity sha512-3UXcBQMwbMWdPvGHaSdPMluHrd+/bc+K143MyvE5zVZ+S1XCHt4sau7dj6svJHns5llN0YG/c6h/vRfadIp8Zg== + dependencies: + "@electron/get" "^1.13.0" + "@types/node" "^14.6.2" + extract-zip "^1.0.3" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + 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.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +esbuild-android-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz#3fc3ff0bab76fe35dd237476b5d2b32bb20a3d44" + integrity sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg== + +esbuild-android-arm64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz#8842d0c3b7c81fbe2dc46ddb416ffd6eb822184b" + integrity sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ== + +esbuild-darwin-64@0.13.15: + version "0.13.15" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz" + integrity sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ== + +esbuild-darwin-64@0.14.21: + version "0.14.21" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz" + integrity sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ== + +esbuild-darwin-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz#1b07f893b632114f805e188ddfca41b2b778229a" + integrity sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ== + +esbuild-darwin-arm64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz#0c2a977edec1ef54097ee56a911518c820d4e5e4" + integrity sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ== + +esbuild-freebsd-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz#0b8b7eca1690c8ec94c75680c38c07269c1f4a85" + integrity sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA== + +esbuild-freebsd-64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz#f5b5fc1d031286c3a0949d1bda7db774b7d0404e" + integrity sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g== + +esbuild-freebsd-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz#2e1a6c696bfdcd20a99578b76350b41db1934e52" + integrity sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ== + +esbuild-freebsd-arm64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz#a05cab908013e4992b31a675850b8c44eb468c0c" + integrity sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA== + +esbuild-linux-32@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz#6fd39f36fc66dd45b6b5f515728c7bbebc342a69" + integrity sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g== + +esbuild-linux-32@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz#638d244cc58b951f447addb4bade628d126ef84b" + integrity sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg== + +esbuild-linux-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz#9cb8e4bcd7574e67946e4ee5f1f1e12386bb6dd3" + integrity sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA== + +esbuild-linux-64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz#8eb634abee928be7e35b985fafbfef2f2e31397f" + integrity sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA== + +esbuild-linux-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz#3891aa3704ec579a1b92d2a586122e5b6a2bfba1" + integrity sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA== + +esbuild-linux-arm64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz#e05599ea6253b58394157da162d856f3ead62f9e" + integrity sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g== + +esbuild-linux-arm@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz#8a00e99e6a0c6c9a6b7f334841364d8a2b4aecfe" + integrity sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA== + +esbuild-linux-arm@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz#1ae1078231cf689d3ba894a32d3723c0be9b91fd" + integrity sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w== + +esbuild-linux-mips64le@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz#36b07cc47c3d21e48db3bb1f4d9ef8f46aead4f7" + integrity sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg== + +esbuild-linux-mips64le@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz#f05be62d126764e99b37edcac5bb49b78c7a8890" + integrity sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A== + +esbuild-linux-ppc64le@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz#f7e6bba40b9a11eb9dcae5b01550ea04670edad2" + integrity sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ== + +esbuild-linux-ppc64le@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz#592c98d82dad7982268ef8deed858c4566f07ab1" + integrity sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ== + +esbuild-linux-riscv64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz#0db7bd6f10d8f9afea973a7d6bf87b449b864b7b" + integrity sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q== + +esbuild-linux-s390x@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz#254a9354d34c9d1b41a3e21d2ec9269cbbb2c5df" + integrity sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA== + +esbuild-netbsd-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz#a2fedc549c2b629d580a732d840712b08d440038" + integrity sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w== + +esbuild-netbsd-64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz#4cb783d060b02bf3b897a9a12cce2b3b547726f8" + integrity sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g== + +esbuild-openbsd-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz#b22c0e5806d3a1fbf0325872037f885306b05cd7" + integrity sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g== + +esbuild-openbsd-64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz#f886b93feefddbe573528fa4b421c9c6e2bc969b" + integrity sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA== + +esbuild-sunos-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz#d0b6454a88375ee8d3964daeff55c85c91c7cef4" + integrity sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw== + +esbuild-sunos-64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz#3829e4d57d4cb6950837fe90b0b67cdfb37cf13a" + integrity sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA== + +esbuild-windows-32@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz#c96d0b9bbb52f3303322582ef8e4847c5ad375a7" + integrity sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw== + +esbuild-windows-32@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz#b858a22d1a82e53cdc59310cd56294133f7a95e7" + integrity sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A== + +esbuild-windows-64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz#1f79cb9b1e1bb02fb25cd414cb90d4ea2892c294" + integrity sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ== + +esbuild-windows-64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz#7bb5a027d5720cf9caf18a4bedd11327208f1f12" + integrity sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA== + +esbuild-windows-arm64@0.13.15: + version "0.13.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz#482173070810df22a752c686509c370c3be3b3c3" + integrity sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA== + +esbuild-windows-arm64@0.14.21: + version "0.14.21" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz#25df54521ad602c826b262ea2e7cc1fe80f5c2f5" + integrity sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw== + +esbuild@^0.13.12: + version "0.13.15" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz" + integrity sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw== + optionalDependencies: + esbuild-android-arm64 "0.13.15" + esbuild-darwin-64 "0.13.15" + esbuild-darwin-arm64 "0.13.15" + esbuild-freebsd-64 "0.13.15" + esbuild-freebsd-arm64 "0.13.15" + esbuild-linux-32 "0.13.15" + esbuild-linux-64 "0.13.15" + esbuild-linux-arm "0.13.15" + esbuild-linux-arm64 "0.13.15" + esbuild-linux-mips64le "0.13.15" + esbuild-linux-ppc64le "0.13.15" + esbuild-netbsd-64 "0.13.15" + esbuild-openbsd-64 "0.13.15" + esbuild-sunos-64 "0.13.15" + esbuild-windows-32 "0.13.15" + esbuild-windows-64 "0.13.15" + esbuild-windows-arm64 "0.13.15" + +esbuild@^0.14.14: + version "0.14.21" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz" + integrity sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A== + optionalDependencies: + esbuild-android-arm64 "0.14.21" + esbuild-darwin-64 "0.14.21" + esbuild-darwin-arm64 "0.14.21" + esbuild-freebsd-64 "0.14.21" + esbuild-freebsd-arm64 "0.14.21" + esbuild-linux-32 "0.14.21" + esbuild-linux-64 "0.14.21" + esbuild-linux-arm "0.14.21" + esbuild-linux-arm64 "0.14.21" + esbuild-linux-mips64le "0.14.21" + esbuild-linux-ppc64le "0.14.21" + esbuild-linux-riscv64 "0.14.21" + esbuild-linux-s390x "0.14.21" + esbuild-netbsd-64 "0.14.21" + esbuild-openbsd-64 "0.14.21" + esbuild-sunos-64 "0.14.21" + esbuild-windows-32 "0.14.21" + esbuild-windows-64 "0.14.21" + esbuild-windows-arm64 "0.14.21" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz" + integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== + +eslint@8.8.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz" + integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ== + dependencies: + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.2.0" + espree "^9.3.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.2.0, espree@^9.3.0: + version "9.3.0" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz" + integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.1.0" + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +extract-zip@^1.0.3: + version "1.7.0" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" + 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" + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + 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.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +form-data@^2.2.0: + version "2.5.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fraction.js@^4.1.2: + version "4.1.3" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz" + integrity sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz" + 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.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + 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.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + 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.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-port@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + 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.npmjs.org/global-agent/-/global-agent-3.0.0.tgz" + 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.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz" + 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@^13.6.0, globals@^13.9.0: + version "13.12.1" + resolved "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz" + integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + 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.npmjs.org/got/-/got-9.6.0.tgz" + 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.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.9" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +happy-dom@2.31.1: + version "2.31.1" + resolved "https://registry.npmjs.org/happy-dom/-/happy-dom-2.31.1.tgz" + integrity sha512-hbTLxMqyluLT06nRN4TDGLjjKni73tZlvLdF6qGfdv5U4EnrSYSwcZK3ESmv0LEEa5St7NY7e62rhISotH8O3Q== + dependencies: + he "^1.1.1" + node-fetch "^2.6.1" + sync-request "^6.1.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hosted-git-info@^4.0.2: + version "4.1.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hotkeys-js@3.8.7: + version "3.8.7" + resolved "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.8.7.tgz" + integrity sha512-ckAx3EkUr5XjDwjEHDorHxRO2Kb7z6Z2Sxul4MbBkN8Nho7XDslQsgMJT+CiJ5Z4TgRxxvKHEpuLE3imzqy4Lg== + +http-basic@^8.1.1: + version "8.1.3" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" + integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== + dependencies: + "@types/node" "^10.0.3" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz" + 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.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + 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.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + 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.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" + 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.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + 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.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jpeg-js@^0.4.2: + version "0.4.3" + resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz" + integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" + 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.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jszip@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-2.6.1.tgz" + integrity sha1-uI86ey5noqBIFSmCx6N1bZxIKPA= + dependencies: + pako "~1.0.2" + +jszip@^3.1.0: + version "3.7.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz" + integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kleur@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz" + integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" + 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.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lilconfig@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lit-element@^3.0.0, lit-element@^3.1.0: + version "3.1.2" + resolved "https://registry.npmjs.org/lit-element/-/lit-element-3.1.2.tgz" + integrity sha512-5VLn5a7anAFH7oz6d7TRG3KiTZQ5GEFsAgOKB8Yc+HDyuDUGOT2cL1CYTz/U4b/xlJxO+euP14pyji+z3Z3kOg== + dependencies: + "@lit/reactive-element" "^1.1.0" + lit-html "^2.1.0" + +lit-html@^2.0.0, lit-html@^2.1.0: + version "2.1.3" + resolved "https://registry.npmjs.org/lit-html/-/lit-html-2.1.3.tgz" + integrity sha512-WgvdwiNeuoT0mYEEJI+AAV2DEtlqzVM4lyDSaeQSg5ZwhS/CkGJBO/4n66alApEuSS9WXw9+ADBp8SPvtDEKSg== + dependencies: + "@types/trusted-types" "^2.0.2" + +lit@2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lit/-/lit-2.0.2.tgz" + integrity sha512-hKA/1YaSB+P+DvKWuR2q1Xzy/iayhNrJ3aveD0OQ9CKn6wUjsdnF/7LavDOJsKP/K5jzW/kXsuduPgRvTFrFJw== + dependencies: + "@lit/reactive-element" "^1.0.0" + lit-element "^3.0.0" + lit-html "^2.0.0" + +lit@^2.0.0: + version "2.1.3" + resolved "https://registry.npmjs.org/lit/-/lit-2.1.3.tgz" + integrity sha512-46KtKy7iDoY3wZ5VSqBlXll6J/tli5gRMPFRWi5qQ01lvIqcO+dYQwb1l1NYZjbzcHnGnCKrMb8nDv7/ZE4Y4g== + dependencies: + "@lit/reactive-element" "^1.1.0" + lit-element "^3.1.0" + lit-html "^2.1.0" + +local-pkg@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.1.tgz" + integrity sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw== + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.10, lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loupe@^2.3.1: + version "2.3.3" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.3.tgz" + integrity sha512-krIV4Cf1BIGIx2t1e6tucThhrBemUnIUjMtD2vN4mrMxnxpBvrcosBSpooqunBqP/hOEEV1w/Cr1YskGtqw5Jg== + dependencies: + get-func-name "^2.0.0" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + 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.npmjs.org/matcher/-/matcher-3.0.0.tgz" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" + 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.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12: + version "2.1.34" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@^2.4.6, mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: + version "3.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^0.5.1, mkdirp@^0.5.4: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nano-staged@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/nano-staged/-/nano-staged-0.5.0.tgz" + integrity sha512-5jkhLvyZM974RmCyI8vt7zo0QK6GIAOCBe6e7L36awXIlG+40/5zJiDvESFrFmO4PhBCRm9lUlnH0SsWAFLDLg== + dependencies: + picocolors "^1.0.0" + +nanoid@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +ninja-keys@^1.1.12: + version "1.1.12" + resolved "https://registry.npmjs.org/ninja-keys/-/ninja-keys-1.1.12.tgz" + integrity sha512-YE5Ls0xENFUxhk32pQUTix/UjbdK/n8tBHGEV2pWkckS7hljz1c+3jl/28agkBQKLx7vgM/bKI7MK//at2nmZQ== + dependencies: + "@material/mwc-icon" "0.25.3" + hotkeys-js "3.8.7" + lit "2.0.2" + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-cache-control@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" + integrity sha1-juqz5U+laSD+Fro493+iGqzC104= + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + 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.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +playwright-core@=1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.18.1.tgz" + integrity sha512-NALGl8R1GHzGLlhUApmpmfh6M1rrrPcDTygWvhTbprxwGB9qd/j9DRwyn4HTQcUB6o0/VOpo46fH9ez3+D/Rog== + dependencies: + commander "^8.2.0" + debug "^4.1.1" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + jpeg-js "^0.4.2" + mime "^2.4.6" + pngjs "^5.0.0" + progress "^2.0.3" + proper-lockfile "^4.1.1" + proxy-from-env "^1.1.0" + rimraf "^3.0.2" + socks-proxy-agent "^6.1.0" + stack-utils "^2.0.3" + ws "^7.4.6" + yauzl "^2.10.0" + yazl "^2.5.1" + +playwright@1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.18.1.tgz" + integrity sha512-8EaX9EtbtAoMq5tnzIsoA3b/V86V/6Mq2skuOU4qEw+5OVxs1lwesDwmjy/RVU1Qfx5UuwSQzhp45wyH22oa+A== + dependencies: + playwright-core "=1.18.1" + +plist@^3.0.1, plist@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz" + integrity sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +postcss-import@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1" + integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.0, postcss-load-config@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz" + integrity sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg== + dependencies: + lilconfig "^2.0.4" + yaml "^1.10.2" + +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== + dependencies: + postcss-selector-parser "^6.0.6" + +postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: + version "6.0.9" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.5: + version "8.4.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz" + integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA== + dependencies: + nanoid "^3.2.0" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise@^8.0.0: + version "8.1.0" + resolved "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + 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.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +q@^1.1.2, q@^1.4.1: + version "1.5.1" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@^6.4.0: + version "6.10.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + 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-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz" + 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, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + 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" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.5.2: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz" + 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.59.0: + version "2.67.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.67.1.tgz" + integrity sha512-1Sbcs4OuW+aD+hhqpIRl+RqooIpF6uQcfzU/QSI7vGkwADY6cM4iLsBGRM2CGLXDTDN5y/yShohFmnKegSPWzg== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +sade@^1.7.4: + version "1.8.1" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz" + integrity sha1-dB4kXiMfB8r7b98PEzrfohalAq0= + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz" + 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.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-git-hooks@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.7.0.tgz" + integrity sha512-nQe6ASMO9zn5/htIrU37xEIHGr9E6wikXelLbOeTcfsX2O++DHaVug7RSQoq+kO7DvZTH37WA5gW49hN9HTDmQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + 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, smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.1.0: + version "6.1.1" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz" + integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew== + dependencies: + agent-base "^6.0.2" + debug "^4.3.1" + socks "^2.6.1" + +socks@^2.6.1: + version "2.6.2" + resolved "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz" + integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.2.0" + +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz" + 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.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@^0.5.19: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + 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.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +split-ca@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz" + integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +ssh2-streams@~0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.10.tgz#48ef7e8a0e39d8f2921c30521d56dacb31d23a34" + integrity sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ== + dependencies: + asn1 "~0.2.0" + bcrypt-pbkdf "^1.0.2" + streamsearch "~0.1.2" + +ssh2@0.8.9, ssh2@^1.4.0: + version "0.8.9" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.8.9.tgz#54da3a6c4ba3daf0d8477a538a481326091815f3" + integrity sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw== + dependencies: + ssh2-streams "~0.4.10" + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +streamsearch@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +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.npmjs.org/string-width/-/string-width-4.2.3.tgz" + 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.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svelte-check@^2.1.0: + version "2.4.3" + resolved "https://registry.npmjs.org/svelte-check/-/svelte-check-2.4.3.tgz" + integrity sha512-0zJMMgqYHoP7QEG3tfc5DekpHAOqoy4QOL8scWMSdHIpVVDVC0MuYK57nFyj3XVTW8Zfm85FlgnAdQYsVmST2Q== + 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-fa@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/svelte-fa/-/svelte-fa-2.4.0.tgz" + integrity sha512-0bnbMGbsE1LUnlioDcf27tl2O8kjuXlTXMXzIxC7LoIOWmqn0D+zd539HfLiQbdLuOHGTaynwN9V+4ehhEu1Jw== + +svelte-hmr@^0.14.9: + version "0.14.9" + resolved "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.9.tgz" + integrity sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg== + +svelte-preprocess@^4.0.0, svelte-preprocess@^4.7.2: + version "4.10.2" + resolved "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.2.tgz" + integrity sha512-aPpkCreSo8EL/y8kJSa1trhiX0oyAtTjlNNM7BNjRAsMJ8Yy2LtqHt0zyd4pQPXt+D4PzbO3qTjjio3kwOxDlA== + 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" + +svelte@^3.37.0: + version "3.46.4" + resolved "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz" + integrity sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg== + +sync-request@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" + integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== + dependencies: + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" + +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== + dependencies: + get-port "^3.1.0" + +tailwindcss@^3.0.19: + version "3.0.19" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.19.tgz" + integrity sha512-rjsdfz/qZya5xQ0OVynEMETgWq1CacmftgMYeXXh6bRM5vxsNwRSbMJsCCIjq/w67om9VP/AFMolOwiE+5VKig== + dependencies: + arg "^5.0.1" + chalk "^4.1.2" + chokidar "^3.5.3" + color-name "^1.1.4" + cosmiconfig "^7.0.1" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.11" + glob-parent "^6.0.2" + is-glob "^4.0.3" + normalize-path "^3.0.0" + object-hash "^2.2.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.0" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.0" + +tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-fs@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz" + integrity sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^2.0.0, tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz" + 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.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== + dependencies: + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/node" "^8.0.0" + "@types/qs" "^6.2.31" + caseless "~0.12.0" + concat-stream "^1.6.0" + form-data "^2.2.0" + http-basic "^8.1.1" + http-response-object "^3.0.1" + promise "^8.0.0" + qs "^6.4.0" + +tinro@^0.6.12: + version "0.6.12" + resolved "https://registry.npmjs.org/tinro/-/tinro-0.6.12.tgz" + integrity sha512-YYLh0a21GXXpS66ilZbywfXcPTKQQ+bv3tihoqKqSFQP6/F11N7ZmtRbFWcyZXXPFRSzNxmPJBB8ZhP0GkoS0Q== + +tinypool@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.1.2.tgz" + integrity sha512-fvtYGXoui2RpeMILfkvGIgOVkzJEGediv8UJt7TxdAOY8pnvUkFg/fkvqTfXG9Acc9S17Cnn1S4osDc2164guA== + +tinyspy@^0.2.10: + version "0.2.10" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-0.2.10.tgz" + integrity sha512-Qij6rGWCDjWIejxCXXVi6bNgvrYBp3PbqC4cBP/0fD6WHDOHCw09Zd13CsxrDqSR5PFq01WeqDws8t5lz5sH0A== + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + +ts-morph@13.0.2: + version "13.0.2" + resolved "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.2.tgz" + integrity sha512-SjeeHaRf/mFsNeR3KTJnx39JyEOzT4e+DX28gQx5zjzEOuFs2eGrqeN2PLKs/+AibSxPmzV7RD8nJVKmFJqtLA== + dependencies: + "@ts-morph/common" "~0.12.2" + code-block-writer "^11.0.0" + +tslib@2.3.1, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +tweetnacl@^0.14.3: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@*, typescript@4.5.5, typescript@^4.3.2: + version "4.5.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unzip-crx-3@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz" + integrity sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ== + dependencies: + jszip "^3.1.0" + mkdirp "^0.5.1" + yaku "^0.16.6" + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" + 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.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vite@2.7.13: + version "2.7.13" + resolved "https://registry.npmjs.org/vite/-/vite-2.7.13.tgz" + integrity sha512-Mq8et7f3aK0SgSxjDNfOAimZGW9XryfHRa/uV0jseQSilg+KhYDSoNb9h1rknOy6SuMkvNDLKCYAYYUMCE+IgQ== + dependencies: + esbuild "^0.13.12" + postcss "^8.4.5" + resolve "^1.20.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +vite@>=2.7.13, vite@^2.5.1: + version "2.8.0" + resolved "https://registry.npmjs.org/vite/-/vite-2.8.0.tgz" + integrity sha512-ed5rjyeysttuPJX/aKSA0gTB/8ZKLM5xF6FtEuKy1B9DiQbDNFMVMQxnb9JesgBPUMMIJxC8w5KZ/KNWLKFXoA== + dependencies: + esbuild "^0.14.14" + postcss "^8.4.5" + resolve "^1.22.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +vitest@0.2.8: + version "0.2.8" + resolved "https://registry.npmjs.org/vitest/-/vitest-0.2.8.tgz" + integrity sha512-shzN00EkvUNzP8cSykhrOCwB7MlGxcwJNjOtHhbayvexGnqX6oLOfEp3OQixWdDJpEaqNiE3Lcie0WsOnoQ3Og== + dependencies: + "@types/chai" "^4.3.0" + "@types/chai-subset" "^1.3.3" + chai "^4.3.6" + local-pkg "^0.4.1" + tinypool "^0.1.1" + tinyspy "^0.2.10" + vite ">=2.7.13" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + 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.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + 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" + +ws@^7.4.6: + version "7.5.7" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xmlbuilder@>=11.0.1: + version "15.1.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaku@^0.16.6: + version "0.16.7" + resolved "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz" + integrity sha1-HRlceKqbW/hHnIlblQT9TwhHmE4= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@^17.0.1: + version "17.3.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz" + 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.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yazl@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz" + integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== + dependencies: + buffer-crc32 "~0.2.3" + +zip-local@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/zip-local/-/zip-local-0.3.5.tgz" + integrity sha512-GRV3D5TJY+/PqyeRm5CYBs7xVrKTKzljBoEXvocZu0HJ7tPEcgpSOYa2zFIsCZWgKWMuc4U3yMFgFkERGFIB9w== + dependencies: + async "^1.4.2" + graceful-fs "^4.1.3" + jszip "^2.6.1" + q "^1.4.1"