diff --git a/extensions/package-manager/.editorconfig b/extensions/package-manager/.editorconfig new file mode 100755 index 000000000..a61a3ab36 --- /dev/null +++ b/extensions/package-manager/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.{diff,md}] +trim_trailing_whitespace = false + +[*.{php,xml,json}] +indent_size = 4 diff --git a/extensions/package-manager/.gitattributes b/extensions/package-manager/.gitattributes new file mode 100644 index 000000000..b9a08e27d --- /dev/null +++ b/extensions/package-manager/.gitattributes @@ -0,0 +1,19 @@ +.gitattributes export-ignore +.gitignore export-ignore +.gitmodules export-ignore +.github export-ignore +.travis export-ignore +.travis.yml export-ignore +.editorconfig export-ignore +.styleci.yml export-ignore + +phpunit.xml export-ignore +tests export-ignore + +js/dist/* -diff +js/dist/* linguist-generated +js/dist-typings/* linguist-generated +js/yarn.lock -diff +js/package-lock.json -diff + +* text=auto eol=lf diff --git a/extensions/package-manager/.github/workflows/backend.yml b/extensions/package-manager/.github/workflows/backend.yml new file mode 100644 index 000000000..dfca968ac --- /dev/null +++ b/extensions/package-manager/.github/workflows/backend.yml @@ -0,0 +1,17 @@ +name: Package Manager PHP + +on: [workflow_dispatch, push, pull_request] + +# The reusable workflow definitions will be moved to the `flarum/framework` repo soon. +# This will break your current script. +# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure. + +jobs: + run: + uses: flarum/.github/.github/workflows/REUSABLE_backend.yml@as/support-npm-yarn + with: + enable_backend_testing: true + + backend_directory: . + + php_versions: '["7.4", "8.0"]' diff --git a/extensions/package-manager/.github/workflows/frontend.yml b/extensions/package-manager/.github/workflows/frontend.yml new file mode 100755 index 000000000..6683d6271 --- /dev/null +++ b/extensions/package-manager/.github/workflows/frontend.yml @@ -0,0 +1,23 @@ +name: Package Manager JS + +on: [workflow_dispatch, push, pull_request] + +# The reusable workflow definitions will be moved to the `flarum/framework` repo soon. +# This will break your current script. +# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure. + +jobs: + run: + uses: flarum/.github/.github/workflows/REUSABLE_frontend.yml@as/support-npm-yarn + with: + enable_bundlewatch: false + enable_prettier: true + enable_typescript: true + + frontend_directory: ./js + backend_directory: . + package_manager: yarn + main_git_branch: main + + secrets: + bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }} diff --git a/extensions/package-manager/.gitignore b/extensions/package-manager/.gitignore new file mode 100755 index 000000000..4ebb168a0 --- /dev/null +++ b/extensions/package-manager/.gitignore @@ -0,0 +1,12 @@ +/vendor +composer.lock +composer.phar + +.DS_Store +Thumbs.db +tests/.phpunit.result.cache +/tests/integration/tmp +.vagrant +.idea/* +.vscode +js/coverage-ts diff --git a/extensions/package-manager/.styleci.yml b/extensions/package-manager/.styleci.yml new file mode 100644 index 000000000..8806a5402 --- /dev/null +++ b/extensions/package-manager/.styleci.yml @@ -0,0 +1,14 @@ +preset: recommended + +enabled: + - logical_not_operators_with_successor_space + +disabled: + - align_double_arrow + - blank_line_after_opening_tag + - multiline_array_trailing_comma + - new_with_braces + - phpdoc_align + - phpdoc_order + - phpdoc_separation + - phpdoc_types diff --git a/extensions/package-manager/LICENSE.md b/extensions/package-manager/LICENSE.md new file mode 100755 index 000000000..71a61da57 --- /dev/null +++ b/extensions/package-manager/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sami Mazouz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/extensions/package-manager/README.md b/extensions/package-manager/README.md new file mode 100755 index 000000000..036b90a83 --- /dev/null +++ b/extensions/package-manager/README.md @@ -0,0 +1,5 @@ +# Package Manager + +*An Experiment.* + +Read: https://github.com/flarum/package-manager/wiki diff --git a/extensions/package-manager/assets/flarum.svg b/extensions/package-manager/assets/flarum.svg new file mode 100755 index 000000000..afc34acdb --- /dev/null +++ b/extensions/package-manager/assets/flarum.svg @@ -0,0 +1,20 @@ + + + only symbol + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/package-manager/composer.json b/extensions/package-manager/composer.json new file mode 100755 index 000000000..3386766ca --- /dev/null +++ b/extensions/package-manager/composer.json @@ -0,0 +1,100 @@ +{ + "name": "flarum/package-manager", + "description": "A Flarum Package Manager.", + "keywords": [ + "extensions", + "composer", + "packages", + "manager", + "updater" + ], + "type": "flarum-extension", + "license": "MIT", + "authors": [ + { + "name": "Flarum", + "email": "info@flarum.org", + "homepage": "https://flarum.org/team" + } + ], + "support": { + "issues": "https://github.com/flarum/package-manager/issues", + "source": "https://github.com/flarum/package-manager" + }, + "require": { + "flarum/core": "^1.0.0", + "composer/composer": "^2.0" + }, + "require-dev": { + "flarum/testing": "^1.0.0", + "flarum/tags": "*" + }, + "extra": { + "flarum-extension": { + "title": "Package Manager", + "icon": { + "name": "fas fa-box-open", + "backgroundColor": "#117187", + "color": "#fff" + } + }, + "flarum-cli": { + "excludeScaffolding": [ + ".github/workflows/backend.yml", + "js/src/admin/index.ts", + "tests/phpunit.integration.xml", + "tests/integration/setup.php" + ], + "excludeScaffoldingConfigKeys": { + "composer.json": [ + "scripts.test:setup" + ] + }, + "modules": { + "admin": true, + "forum": false, + "js": true, + "jsCommon": false, + "css": true, + "gitConf": true, + "githubActions": true, + "prettier": true, + "typescript": true, + "bundlewatch": false, + "backendTesting": true, + "editorConfig": true, + "styleci": true + } + } + }, + "autoload": { + "psr-4": { + "Flarum\\PackageManager\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Flarum\\PackageManager\\Tests\\": "tests/" + } + }, + "scripts": { + "test": [ + "@test:unit", + "@test:integration" + ], + "test:unit": "phpunit -c tests/phpunit.unit.xml", + "test:integration": "phpunit -c tests/phpunit.integration.xml", + "test:setup": [ + "@php tests/integration/setup.php", + "cd $FLARUM_TEST_TMP_DIR_LOCAL && composer install" + ] + }, + "scripts-descriptions": { + "test": "Runs all tests.", + "test:unit": "Runs all unit tests.", + "test:integration": "Runs all integration tests.", + "test:setup": "Sets up a database for use with integration tests. Execute this only once." + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/extensions/package-manager/extend.php b/extensions/package-manager/extend.php new file mode 100755 index 000000000..38c49fc0b --- /dev/null +++ b/extensions/package-manager/extend.php @@ -0,0 +1,63 @@ +post('/package-manager/extensions', 'package-manager.extensions.require', Api\Controller\RequireExtensionController::class) + ->patch('/package-manager/extensions/{id}', 'package-manager.extensions.update', Api\Controller\UpdateExtensionController::class) + ->delete('/package-manager/extensions/{id}', 'package-manager.extensions.remove', Api\Controller\RemoveExtensionController::class) + ->post('/package-manager/check-for-updates', 'package-manager.check-for-updates', Api\Controller\CheckForUpdatesController::class) + ->post('/package-manager/why-not', 'package-manager.why-not', Api\Controller\WhyNotController::class) + ->post('/package-manager/minor-update', 'package-manager.minor-update', Api\Controller\MinorUpdateController::class) + ->post('/package-manager/major-update', 'package-manager.major-update', Api\Controller\MajorUpdateController::class) + ->post('/package-manager/global-update', 'package-manager.global-update', Api\Controller\GlobalUpdateController::class), + + (new Extend\Frontend('admin')) + ->css(__DIR__ . '/less/admin.less') + ->js(__DIR__ . '/js/dist/admin.js') + ->content(function (Document $document) { + $paths = resolve(Paths::class); + + $document->payload['isRequiredDirectoriesWritable'] = is_writable($paths->vendor) + && is_writable($paths->storage.'/.composer') + && is_writable($paths->base.'/composer.json') + && is_writable($paths->base.'/composer.lock'); + }), + + new Extend\Locales(__DIR__ . '/locale'), + + (new Extend\Settings()) + ->default(LastUpdateCheck::key(), json_encode(LastUpdateCheck::default())) + ->default(LastUpdateRun::key(), json_encode(LastUpdateRun::default())), + + (new Extend\ServiceProvider) + ->register(PackageManagerServiceProvider::class), + + (new Extend\ErrorHandling) + ->handler(ComposerCommandFailedException::class, ExceptionHandler::class) + ->handler(ComposerRequireFailedException::class, ExceptionHandler::class) + ->handler(ComposerUpdateFailedException::class, ExceptionHandler::class) + ->handler(MajorUpdateFailedException::class, ExceptionHandler::class) + ->status('extension_already_installed', 409) + ->status('extension_not_installed', 409) + ->status('no_new_major_version', 409), +]; diff --git a/extensions/package-manager/js/.gitignore b/extensions/package-manager/js/.gitignore new file mode 100644 index 000000000..adc90f312 --- /dev/null +++ b/extensions/package-manager/js/.gitignore @@ -0,0 +1,9 @@ +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +node_modules diff --git a/extensions/package-manager/js/admin.ts b/extensions/package-manager/js/admin.ts new file mode 100644 index 000000000..3e69ff3b9 --- /dev/null +++ b/extensions/package-manager/js/admin.ts @@ -0,0 +1 @@ +export * from './src/admin'; diff --git a/extensions/package-manager/js/dist-typings/components/ExtensionItem.d.ts b/extensions/package-manager/js/dist-typings/components/ExtensionItem.d.ts new file mode 100644 index 000000000..c9297c734 --- /dev/null +++ b/extensions/package-manager/js/dist-typings/components/ExtensionItem.d.ts @@ -0,0 +1,20 @@ +import Mithril from 'mithril'; +import Component, { ComponentAttrs } from 'flarum/common/Component'; +import { Extension as BaseExtension } from 'flarum/admin/AdminApplication'; +import { UpdatedPackage } from './Updater'; +export declare type Extension = BaseExtension & { + name: string; +}; +export interface ExtensionItemAttrs extends ComponentAttrs { + extension: Extension; + updates: UpdatedPackage; + onClickUpdate: CallableFunction; + whyNotWarning?: boolean; + isCore?: boolean; + updatable?: boolean; + isDanger?: boolean; +} +export default class ExtensionItem extends Component { + view(vnode: Mithril.Vnode): Mithril.Children; + private version; +} diff --git a/extensions/package-manager/js/dist-typings/components/Installer.d.ts b/extensions/package-manager/js/dist-typings/components/Installer.d.ts new file mode 100644 index 000000000..2a2bf6bc3 --- /dev/null +++ b/extensions/package-manager/js/dist-typings/components/Installer.d.ts @@ -0,0 +1,11 @@ +import type Mithril from 'mithril'; +import Component from 'flarum/common/Component'; +import Stream from 'flarum/common/utils/Stream'; +export default class Installer extends Component { + packageName: Stream; + isLoading: boolean; + oninit(vnode: Mithril.Vnode): void; + view(): Mithril.Children; + data(): any; + onsubmit(): void; +} diff --git a/extensions/package-manager/js/dist-typings/components/MajorUpdater.d.ts b/extensions/package-manager/js/dist-typings/components/MajorUpdater.d.ts new file mode 100644 index 000000000..326585b84 --- /dev/null +++ b/extensions/package-manager/js/dist-typings/components/MajorUpdater.d.ts @@ -0,0 +1,15 @@ +import Component, { ComponentAttrs } from 'flarum/common/Component'; +import Mithril from 'mithril'; +import { UpdatedPackage, UpdateState } from './Updater'; +interface MajorUpdaterAttrs extends ComponentAttrs { + coreUpdate: UpdatedPackage; + updateState: UpdateState; +} +export default class MajorUpdater extends Component { + isLoading: string | null; + updateState: UpdateState; + oninit(vnode: Mithril.Vnode): void; + view(vnode: Mithril.Vnode): Mithril.Children; + update(dryRun: boolean): void; +} +export {}; diff --git a/extensions/package-manager/js/dist-typings/components/Updater.d.ts b/extensions/package-manager/js/dist-typings/components/Updater.d.ts new file mode 100644 index 000000000..1afac3239 --- /dev/null +++ b/extensions/package-manager/js/dist-typings/components/Updater.d.ts @@ -0,0 +1,47 @@ +import Mithril from 'mithril'; +import Component from 'flarum/common/Component'; +import { Extension } from './ExtensionItem'; +export declare type UpdatedPackage = { + name: string; + version: string; + latest: string; + 'latest-minor': string | null; + 'latest-major': string | null; + 'latest-status': string; + description: string; +}; +export declare type ComposerUpdates = { + installed: UpdatedPackage[]; +}; +export declare type LastUpdateCheck = { + checkedAt: Date | null; + updates: ComposerUpdates; +}; +declare type UpdateType = 'major' | 'minor' | 'global'; +declare type UpdateStatus = 'success' | 'failure' | null; +export declare type UpdateState = { + ranAt: Date | null; + status: UpdateStatus; + limitedPackages: string[]; + incompatibleExtensions: string[]; +}; +export declare type LastUpdateRun = { + [key in UpdateType]: UpdateState; +} & { + limitedPackages: () => string[]; +}; +export default class Updater extends Component { + isLoading: string | null; + packageUpdates: Record; + lastUpdateCheck: LastUpdateCheck; + get lastUpdateRun(): LastUpdateRun; + oninit(vnode: Mithril.Vnode): void; + view(): (JSX.Element | null)[]; + getExtensionUpdates(): Extension[]; + getCoreUpdate(): UpdatedPackage | undefined; + checkForUpdates(): void; + updateCoreMinor(): void; + updateExtension(extension: any): void; + updateGlobally(): void; +} +export {}; diff --git a/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts b/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts new file mode 100644 index 000000000..817978494 --- /dev/null +++ b/extensions/package-manager/js/dist-typings/components/WhyNotModal.d.ts @@ -0,0 +1,15 @@ +/// +import Mithril from 'mithril'; +import Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal'; +export interface WhyNotModalAttrs extends IInternalModalAttrs { + package: string; +} +export default class WhyNotModal extends Modal { + loading: boolean; + whyNot: string | null; + className(): string; + title(): import("@askvortsov/rich-icu-message-formatter").NestedStringArray; + oncreate(vnode: Mithril.VnodeDOM): void; + content(): JSX.Element; + requestWhyNot(): void; +} diff --git a/extensions/package-manager/js/dist-typings/index.d.ts b/extensions/package-manager/js/dist-typings/index.d.ts new file mode 100644 index 000000000..cb0ff5c3b --- /dev/null +++ b/extensions/package-manager/js/dist-typings/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/extensions/package-manager/js/dist-typings/utils/errorHandler.d.ts b/extensions/package-manager/js/dist-typings/utils/errorHandler.d.ts new file mode 100644 index 000000000..6717892f4 --- /dev/null +++ b/extensions/package-manager/js/dist-typings/utils/errorHandler.d.ts @@ -0,0 +1 @@ +export default function (e: any): void; diff --git a/extensions/package-manager/js/dist/admin.js b/extensions/package-manager/js/dist/admin.js new file mode 100755 index 000000000..661ea373c --- /dev/null +++ b/extensions/package-manager/js/dist/admin.js @@ -0,0 +1,1211 @@ +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./admin.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./admin.js": +/*!******************!*\ + !*** ./admin.js ***! + \******************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _src_admin__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/admin */ "./src/admin/index.tsx"); +/* empty/unused harmony star reexport */ + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/createClass.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _createClass; }); +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _inheritsLoose; }); +/* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + Object(_setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(subClass, superClass); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _setPrototypeOf; }); +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +/***/ }), + +/***/ "./src/admin/components/ExtensionItem.tsx": +/*!************************************************!*\ + !*** ./src/admin/components/ExtensionItem.tsx ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ExtensionItem; }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/common/Component */ "flarum/common/Component"); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/utils/classList */ "flarum/common/utils/classList"); +/* harmony import */ var flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/helpers/icon */ "flarum/common/helpers/icon"); +/* harmony import */ var flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/components/Tooltip */ "flarum/common/components/Tooltip"); +/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _WhyNotModal__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./WhyNotModal */ "./src/admin/components/WhyNotModal.tsx"); + + + + + + + + +/* + * @todo fix in core + */ + +var ExtensionItem = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(ExtensionItem, _Component); + + function ExtensionItem() { + return _Component.apply(this, arguments) || this; + } + + var _proto = ExtensionItem.prototype; + + _proto.view = function view(vnode) { + var _this$attrs = this.attrs, + extension = _this$attrs.extension, + updates = _this$attrs.updates, + onClickUpdate = _this$attrs.onClickUpdate, + whyNotWarning = _this$attrs.whyNotWarning, + isCore = _this$attrs.isCore, + isDanger = _this$attrs.isDanger; + return m("div", { + className: flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_3___default()({ + 'PackageManager-extension': true, + 'PackageManager-extension--core': isCore, + 'PackageManager-extension--danger': isDanger + }) + }, m("div", { + className: "PackageManager-extension-icon ExtensionIcon", + style: extension.icon + }, extension.icon ? flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_4___default()(extension.icon.name) : ''), m("div", { + className: "PackageManager-extension-info" + }, m("div", { + className: "PackageManager-extension-name" + }, extension.extra['flarum-extension'].title), m("div", { + className: "PackageManager-extension-version" + }, m("span", { + className: "PackageManager-extension-version-current" + }, this.version(extension.version)), updates['latest-minor'] ? m("span", { + className: "PackageManager-extension-version-latest PackageManager-extension-version-latest--minor" + }, this.version(updates['latest-minor'])) : null, updates['latest-major'] && !isCore ? m("span", { + className: "PackageManager-extension-version-latest PackageManager-extension-version-latest--major" + }, this.version(updates['latest-major'])) : null)), m("div", { + className: "PackageManager-extension-controls" + }, onClickUpdate ? m(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_5___default.a, { + text: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.update') + }, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_6___default.a, { + icon: "fas fa-arrow-alt-circle-up", + className: "Button Button--icon Button--flat", + onclick: onClickUpdate, + "aria-label": flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.update') + })) : null, whyNotWarning ? m(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_5___default.a, { + text: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.check_why_it_failed_updating') + }, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_6___default.a, { + icon: "fas fa-exclamation-circle", + className: "Button Button--icon Button--flat Button--danger", + onclick: function onclick() { + return flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(_WhyNotModal__WEBPACK_IMPORTED_MODULE_7__["default"], { + "package": extension.name + }); + }, + "aria-label": flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.check_why_it_failed_updating') + })) : null)); + }; + + _proto.version = function version(v) { + return 'v' + v.replace('v', ''); + }; + + return ExtensionItem; +}(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default.a); + + + +/***/ }), + +/***/ "./src/admin/components/Installer.tsx": +/*!********************************************!*\ + !*** ./src/admin/components/Installer.tsx ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Installer; }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/common/Component */ "flarum/common/Component"); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_utils_Stream__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/utils/Stream */ "flarum/common/utils/Stream"); +/* harmony import */ var flarum_common_utils_Stream__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_utils_Stream__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/admin/components/LoadingModal */ "flarum/admin/components/LoadingModal"); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _utils_errorHandler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/errorHandler */ "./src/admin/utils/errorHandler.ts"); + + + + + + + + +var Installer = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(Installer, _Component); + + function Installer() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.packageName = void 0; + _this.isLoading = false; + return _this; + } + + var _proto = Installer.prototype; + + _proto.oninit = function oninit(vnode) { + _Component.prototype.oninit.call(this, vnode); + + this.packageName = flarum_common_utils_Stream__WEBPACK_IMPORTED_MODULE_4___default()(''); + }; + + _proto.view = function view() { + return m("div", { + className: "Form-group" + }, m("label", { + htmlFor: "install-extension" + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.install')), m("p", { + className: "helpText" + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.install_help', { + extiverse: m("a", { + href: "https://extiverse.com" + }, "extiverse.com") + })), m("div", { + className: "FormControl-container" + }, m("input", { + className: "FormControl", + id: "install-extension", + placeholder: "vendor/package-name", + bidi: this.packageName + }), m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, { + className: "Button", + icon: "fas fa-download", + onclick: this.onsubmit.bind(this), + loading: this.isLoading + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.proceed')))); + }; + + _proto.data = function data() { + return { + "package": this.packageName() + }; + }; + + _proto.onsubmit = function onsubmit() { + var _this2 = this; + + this.isLoading = true; + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default.a); + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({ + method: 'POST', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/extensions", + body: { + data: this.data() + }, + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_6__["default"] + }).then(function (response) { + var extensionId = response.id; + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.alerts.show({ + type: 'success' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.extensions.successful_install', { + extension: extensionId + })); + window.location.href = flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('adminUrl') + "#/extension/" + extensionId; + window.location.reload(); + })["finally"](function () { + _this2.isLoading = false; + m.redraw(); + }); + }; + + return Installer; +}(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default.a); + + + +/***/ }), + +/***/ "./src/admin/components/MajorUpdater.tsx": +/*!***********************************************!*\ + !*** ./src/admin/components/MajorUpdater.tsx ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MajorUpdater; }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/common/Component */ "flarum/common/Component"); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/components/Tooltip */ "flarum/common/components/Tooltip"); +/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/admin/components/LoadingModal */ "flarum/admin/components/LoadingModal"); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _utils_errorHandler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/errorHandler */ "./src/admin/utils/errorHandler.ts"); +/* harmony import */ var flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! flarum/common/components/Alert */ "flarum/common/components/Alert"); +/* harmony import */ var flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _WhyNotModal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./WhyNotModal */ "./src/admin/components/WhyNotModal.tsx"); +/* harmony import */ var _ExtensionItem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ExtensionItem */ "./src/admin/components/ExtensionItem.tsx"); + + + + + + + + + + + +var MajorUpdater = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(MajorUpdater, _Component); + + function MajorUpdater() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.isLoading = null; + _this.updateState = void 0; + return _this; + } + + var _proto = MajorUpdater.prototype; + + _proto.oninit = function oninit(vnode) { + _Component.prototype.oninit.call(this, vnode); + + this.updateState = this.attrs.updateState; + }; + + _proto.view = function view(vnode) { + // @todo move Form-group--danger class to core for reuse + return m("div", { + className: "Form-group Form-group--danger PackageManager-majorUpdate" + }, m("img", { + alt: "flarum logo", + src: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('baseUrl') + '/assets/extensions/flarum-package-manager/flarum.svg' + }), m("label", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.title', { + version: this.attrs.coreUpdate['latest-major'] + })), m("p", { + className: "helpText" + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.description')), m("div", { + className: "PackageManager-updaterControls" + }, m(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4___default.a, { + text: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.dry_run_help') + }, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, { + className: "Button", + icon: "fas fa-vial", + onclick: this.update.bind(this, true) + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.dry_run'))), m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, { + className: "Button Button--danger", + icon: "fas fa-play", + onclick: this.update.bind(this, false) + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.update'))), this.updateState.incompatibleExtensions.length ? m("div", { + className: "PackageManager-majorUpdate-incompatibleExtensions PackageManager-extensions-grid" + }, this.updateState.incompatibleExtensions.map(function (extension) { + return m(_ExtensionItem__WEBPACK_IMPORTED_MODULE_9__["default"], { + extension: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.extensions[extension.replace('flarum-', '').replace('flarum-ext-', '').replace('/', '-')], + updates: {}, + onClickUpdate: null, + isDanger: true + }); + })) : null, this.updateState.status === 'failure' ? m(flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_7___default.a, { + type: "error", + className: "PackageManager-majorUpdate-failure", + dismissible: false, + controls: [m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, { + className: "Button Button--text PackageManager-majorUpdate-failure-details", + icon: "fas fa-question-circle", + onclick: function onclick() { + return flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(_WhyNotModal__WEBPACK_IMPORTED_MODULE_8__["default"], { + "package": 'flarum/core' + }); + } + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.failure.why'))] + }, m("p", { + className: "PackageManager-majorUpdate-failure-desc" + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.major_updater.failure.desc'))) : null); + }; + + _proto.update = function update(dryRun) { + var _this2 = this; + + this.isLoading = "update-" + (dryRun ? 'dry-run' : 'run'); + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default.a); + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({ + method: 'POST', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/major-update", + body: { + data: { + dryRun: dryRun + } + }, + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_6__["default"] + }).then(function () { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.alerts.show({ + type: 'success' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.update_successful')); + window.location.reload(); + })["catch"](function (e) { + var _e$response, _e$response$errors, _e$response$errors$po; + + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.close(); + _this2.updateState.status = 'failure'; + _this2.updateState.incompatibleExtensions = (_e$response = e.response) == null ? void 0 : (_e$response$errors = _e$response.errors) == null ? void 0 : (_e$response$errors$po = _e$response$errors.pop()) == null ? void 0 : _e$response$errors$po.incompatible_extensions; + })["finally"](function () { + _this2.isLoading = null; + m.redraw(); + }); + }; + + return MajorUpdater; +}(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default.a); + + + +/***/ }), + +/***/ "./src/admin/components/Updater.tsx": +/*!******************************************!*\ + !*** ./src/admin/components/Updater.tsx ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Updater; }); +/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/Component */ "flarum/common/Component"); +/* harmony import */ var flarum_common_Component__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_Component__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/helpers/humanTime */ "flarum/common/helpers/humanTime"); +/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! flarum/admin/components/LoadingModal */ "flarum/admin/components/LoadingModal"); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _utils_errorHandler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/errorHandler */ "./src/admin/utils/errorHandler.ts"); +/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! flarum/common/components/LoadingIndicator */ "flarum/common/components/LoadingIndicator"); +/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _MajorUpdater__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./MajorUpdater */ "./src/admin/components/MajorUpdater.tsx"); +/* harmony import */ var _ExtensionItem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ExtensionItem */ "./src/admin/components/ExtensionItem.tsx"); + + + + + + + + + + + + +var Updater = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Updater, _Component); + + function Updater() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.isLoading = null; + _this.packageUpdates = {}; + _this.lastUpdateCheck = JSON.parse(flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.data.settings['flarum-package-manager.last_update_check']); + return _this; + } + + var _proto = Updater.prototype; + + _proto.oninit = function oninit(vnode) { + _Component.prototype.oninit.call(this, vnode); + }; + + _proto.view = function view() { + var _this$lastUpdateCheck, + _this2 = this; + + var extensions = this.getExtensionUpdates(); + var coreUpdate = this.getCoreUpdate(); + var core; + + if (coreUpdate) { + core = { + id: 'flarum-core', + name: 'flarum/core', + version: flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.data.settings.version, + icon: { + backgroundImage: "url(" + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.forum.attribute('baseUrl') + "/assets/extensions/flarum-package-manager/flarum.svg" + }, + extra: { + 'flarum-extension': { + title: flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.flarum') + } + } + }; + } + + return [m("div", { + className: "Form-group" + }, m("label", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.updater_title')), m("p", { + className: "helpText" + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.updater_help')), ((_this$lastUpdateCheck = this.lastUpdateCheck) == null ? void 0 : _this$lastUpdateCheck.checkedAt) && m("p", { + className: "PackageManager-lastUpdatedAt" + }, m("span", { + className: "PackageManager-lastUpdatedAt-label" + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.last_update_checked_at')), m("span", { + className: "PackageManager-lastUpdatedAt-value" + }, flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5___default()(this.lastUpdateCheck.checkedAt))), m("div", { + className: "PackageManager-updaterControls" + }, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, { + className: "Button", + icon: "fas fa-sync-alt", + onclick: this.checkForUpdates.bind(this), + loading: this.isLoading === 'check', + disabled: this.isLoading !== null && this.isLoading !== 'check' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.check_for_updates')), m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, { + className: "Button", + icon: "fas fa-play", + onclick: this.updateGlobally.bind(this), + loading: this.isLoading === 'global-update', + disabled: this.isLoading !== null && this.isLoading !== 'global-update' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.run_global_update'))), this.isLoading !== null ? m("div", { + className: "PackageManager-extensions" + }, m(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_8___default.a, null)) : extensions.length || core ? m("div", { + className: "PackageManager-extensions" + }, m("div", { + className: "PackageManager-extensions-grid" + }, core ? m(_ExtensionItem__WEBPACK_IMPORTED_MODULE_10__["default"], { + extension: core, + updates: coreUpdate, + isCore: true, + onClickUpdate: this.updateCoreMinor.bind(this), + whyNotWarning: this.lastUpdateRun.limitedPackages().includes('flarum/core') + }) : null, extensions.map(function (extension) { + return m(_ExtensionItem__WEBPACK_IMPORTED_MODULE_10__["default"], { + extension: extension, + updates: _this2.packageUpdates[extension.id], + onClickUpdate: _this2.updateExtension.bind(_this2, extension), + whyNotWarning: _this2.lastUpdateRun.limitedPackages().includes(extension.name) + }); + }))) : null), coreUpdate && coreUpdate['latest-major'] ? m(_MajorUpdater__WEBPACK_IMPORTED_MODULE_9__["default"], { + coreUpdate: coreUpdate, + updateState: this.lastUpdateRun.major + }) : null]; + }; + + _proto.getExtensionUpdates = function getExtensionUpdates() { + var _this$lastUpdateCheck2, + _this$lastUpdateCheck3, + _this$lastUpdateCheck4, + _this3 = this; + + (_this$lastUpdateCheck2 = this.lastUpdateCheck) == null ? void 0 : (_this$lastUpdateCheck3 = _this$lastUpdateCheck2.updates) == null ? void 0 : (_this$lastUpdateCheck4 = _this$lastUpdateCheck3.installed) == null ? void 0 : _this$lastUpdateCheck4.filter(function (composerPackage) { + var id = composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, ''); + var extension = flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.data.extensions[id]; + var safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']); + + if (extension && safeToUpdate) { + _this3.packageUpdates[extension.id] = composerPackage; + } + + return extension && safeToUpdate; + }); + return Object.values(flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.data.extensions).filter(function (extension) { + return _this3.packageUpdates[extension.id]; + }); + }; + + _proto.getCoreUpdate = function getCoreUpdate() { + var _this$lastUpdateCheck5, _this$lastUpdateCheck6, _this$lastUpdateCheck7; + + return (_this$lastUpdateCheck5 = this.lastUpdateCheck) == null ? void 0 : (_this$lastUpdateCheck6 = _this$lastUpdateCheck5.updates) == null ? void 0 : (_this$lastUpdateCheck7 = _this$lastUpdateCheck6.installed) == null ? void 0 : _this$lastUpdateCheck7.filter(function (composerPackage) { + return composerPackage.name === 'flarum/core'; + }).pop(); + }; + + _proto.checkForUpdates = function checkForUpdates() { + var _this4 = this; + + this.isLoading = 'check'; + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.request({ + method: 'POST', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.forum.attribute('apiUrl') + "/package-manager/check-for-updates", + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_7__["default"] + }).then(function (response) { + _this4.lastUpdateCheck = response; + })["finally"](function () { + _this4.isLoading = null; + m.redraw(); + }); + }; + + _proto.updateCoreMinor = function updateCoreMinor() { + var _this5 = this; + + if (confirm(flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.minor_update_confirmation.content'))) { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a); + this.isLoading = 'minor-update'; + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.request({ + method: 'POST', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.forum.attribute('apiUrl') + "/package-manager/minor-update", + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_7__["default"] + }).then(function () { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.alerts.show({ + type: 'success' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.update_successful')); + window.location.reload(); + })["finally"](function () { + _this5.isLoading = null; + m.redraw(); + }); + } + }; + + _proto.updateExtension = function updateExtension(extension) { + var _this6 = this; + + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a); + this.isLoading = 'extension-update'; + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.request({ + method: 'PATCH', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.forum.attribute('apiUrl') + "/package-manager/extensions/" + extension.id, + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_7__["default"] + }).then(function () { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.alerts.show({ + type: 'success' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.extensions.successful_update', { + extension: extension.extra['flarum-extension'].title + })); + window.location.reload(); + })["finally"](function () { + _this6.isLoading = null; + m.redraw(); + }); + }; + + _proto.updateGlobally = function updateGlobally() { + var _this7 = this; + + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a); + this.isLoading = 'global-update'; + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.request({ + method: 'POST', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.forum.attribute('apiUrl') + "/package-manager/global-update", + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_7__["default"] + }).then(function () { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.alerts.show({ + type: 'success' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.translator.trans('flarum-package-manager.admin.updater.global_update_successful')); + window.location.reload(); + })["finally"](function () { + _this7.isLoading = null; + m.redraw(); + }); + }; + + Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_0__["default"])(Updater, [{ + key: "lastUpdateRun", + get: function get() { + var lastUpdateRun = JSON.parse(flarum_admin_app__WEBPACK_IMPORTED_MODULE_2___default.a.data.settings['flarum-package-manager.last_update_run']); + + lastUpdateRun.limitedPackages = function () { + return [].concat(lastUpdateRun.major.limitedPackages, lastUpdateRun.minor.limitedPackages, lastUpdateRun.global.limitedPackages); + }; + + return lastUpdateRun; + } + }]); + + return Updater; +}(flarum_common_Component__WEBPACK_IMPORTED_MODULE_3___default.a); + + + +/***/ }), + +/***/ "./src/admin/components/WhyNotModal.tsx": +/*!**********************************************!*\ + !*** ./src/admin/components/WhyNotModal.tsx ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WhyNotModal; }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/common/components/Modal */ "flarum/common/components/Modal"); +/* harmony import */ var flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/components/LoadingIndicator */ "flarum/common/components/LoadingIndicator"); +/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _utils_errorHandler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/errorHandler */ "./src/admin/utils/errorHandler.ts"); + + + + + + +var WhyNotModal = /*#__PURE__*/function (_Modal) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(WhyNotModal, _Modal); + + function WhyNotModal() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Modal.call.apply(_Modal, [this].concat(args)) || this; + _this.loading = true; + _this.whyNot = null; + return _this; + } + + var _proto = WhyNotModal.prototype; + + _proto.className = function className() { + return 'Modal--large WhyNotModal'; + }; + + _proto.title = function title() { + return flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('flarum-package-manager.admin.why_not_modal.title'); + }; + + _proto.oncreate = function oncreate(vnode) { + _Modal.prototype.oncreate.call(this, vnode); + + this.requestWhyNot(); + }; + + _proto.content = function content() { + return m("div", { + className: "Modal-body" + }, this.loading ? m(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_3___default.a, null) : m("pre", { + className: "WhyNotModal-contents" + }, this.whyNot)); + }; + + _proto.requestWhyNot = function requestWhyNot() { + var _this2 = this; + + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({ + method: 'POST', + url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/why-not", + body: { + data: { + "package": this.attrs["package"] + } + }, + errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_4__["default"] + }).then(function (response) { + _this2.loading = false; + _this2.whyNot = response.data.whyNot; + m.redraw(); + }); + }; + + return WhyNotModal; +}(flarum_common_components_Modal__WEBPACK_IMPORTED_MODULE_2___default.a); + + + +/***/ }), + +/***/ "./src/admin/index.tsx": +/*!*****************************!*\ + !*** ./src/admin/index.tsx ***! + \*****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var flarum_common_extend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/common/extend */ "flarum/common/extend"); +/* harmony import */ var flarum_common_extend__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_common_extend__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! flarum/common/components/Alert */ "flarum/common/components/Alert"); +/* harmony import */ var flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var flarum_admin_components_ExtensionPage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/admin/components/ExtensionPage */ "flarum/admin/components/ExtensionPage"); +/* harmony import */ var flarum_admin_components_ExtensionPage__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_ExtensionPage__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/components/Button */ "flarum/common/components/Button"); +/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/admin/components/LoadingModal */ "flarum/admin/components/LoadingModal"); +/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _components_Installer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/Installer */ "./src/admin/components/Installer.tsx"); +/* harmony import */ var _components_Updater__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/Updater */ "./src/admin/components/Updater.tsx"); +/* harmony import */ var flarum_admin_utils_isExtensionEnabled__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! flarum/admin/utils/isExtensionEnabled */ "flarum/admin/utils/isExtensionEnabled"); +/* harmony import */ var flarum_admin_utils_isExtensionEnabled__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_utils_isExtensionEnabled__WEBPACK_IMPORTED_MODULE_8__); + + + + + + + + + +flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.initializers.add('flarum-package-manager', function (app) { + app.extensionData["for"]('flarum-package-manager').registerSetting(function () { + if (!app.data.isRequiredDirectoriesWritable) { + return m("div", { + className: "Form-group" + }, m(flarum_common_components_Alert__WEBPACK_IMPORTED_MODULE_2___default.a, { + type: "warning", + dismissible: false + }, app.translator.trans('flarum-package-manager.admin.file_permissions'))); + } + + return null; + }).registerSetting(function () { + if (app.data.isRequiredDirectoriesWritable) { + return m(_components_Installer__WEBPACK_IMPORTED_MODULE_6__["default"], null); + } + + return null; + }).registerSetting(function () { + if (app.data.isRequiredDirectoriesWritable) { + return m(_components_Updater__WEBPACK_IMPORTED_MODULE_7__["default"], null); + } + + return null; + }); + Object(flarum_common_extend__WEBPACK_IMPORTED_MODULE_0__["extend"])(flarum_admin_components_ExtensionPage__WEBPACK_IMPORTED_MODULE_3___default.a.prototype, 'topItems', function (items) { + var _this = this; + + if (this.extension.id === 'flarum-package-manager' || flarum_admin_utils_isExtensionEnabled__WEBPACK_IMPORTED_MODULE_8___default()(this.extension.id)) { + return; + } + + items.add('remove', m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, { + className: "Button Button--danger", + icon: "fas fa-times", + onclick: function onclick() { + app.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default.a); + app.request({ + url: app.forum.attribute('apiUrl') + "/package-manager/extensions/" + _this.extension.id, + method: 'DELETE' + }).then(function () { + app.alerts.show({ + type: 'success' + }, app.translator.trans('flarum-package-manager.admin.extensions.successful_remove')); + window.location = app.forum.attribute('adminUrl'); + })["finally"](function () { + app.modal.close(); + }); + } + }, "Remove")); + }); +}); + +/***/ }), + +/***/ "./src/admin/utils/errorHandler.ts": +/*!*****************************************!*\ + !*** ./src/admin/utils/errorHandler.ts ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! flarum/admin/app */ "flarum/admin/app"); +/* harmony import */ var flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_app__WEBPACK_IMPORTED_MODULE_0__); + +/* harmony default export */ __webpack_exports__["default"] = (function (e) { + var error = e.response.errors[0]; + + if (!['composer_command_failure', 'extension_already_installed', 'extension_not_installed'].includes(error.code)) { + throw e; + } + + switch (error.code) { + case 'composer_command_failure': + if (error.guessed_cause) { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.alerts.show({ + type: 'error' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.translator.trans("flarum-package-manager.admin.exceptions.guessed_cause." + error.guessed_cause)); + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.modal.close(); + } else { + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.alerts.show({ + type: 'error' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.translator.trans('flarum-package-manager.admin.exceptions.composer_command_failure')); + } + + break; + + case 'extension_already_installed': + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.alerts.show({ + type: 'error' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.translator.trans('flarum-package-manager.admin.exceptions.extension_already_installed')); + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.modal.close(); + break; + + case 'extension_not_installed': + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.alerts.show({ + type: 'error' + }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.translator.trans('flarum-package-manager.admin.exceptions.extension_not_installed')); + flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.modal.close(); + } +}); + +/***/ }), + +/***/ "flarum/admin/app": +/*!**************************************************!*\ + !*** external "flarum.core.compat['admin/app']" ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['admin/app']; + +/***/ }), + +/***/ "flarum/admin/components/ExtensionPage": +/*!***********************************************************************!*\ + !*** external "flarum.core.compat['admin/components/ExtensionPage']" ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['admin/components/ExtensionPage']; + +/***/ }), + +/***/ "flarum/admin/components/LoadingModal": +/*!**********************************************************************!*\ + !*** external "flarum.core.compat['admin/components/LoadingModal']" ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['admin/components/LoadingModal']; + +/***/ }), + +/***/ "flarum/admin/utils/isExtensionEnabled": +/*!***********************************************************************!*\ + !*** external "flarum.core.compat['admin/utils/isExtensionEnabled']" ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['admin/utils/isExtensionEnabled']; + +/***/ }), + +/***/ "flarum/common/Component": +/*!*********************************************************!*\ + !*** external "flarum.core.compat['common/Component']" ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/Component']; + +/***/ }), + +/***/ "flarum/common/components/Alert": +/*!****************************************************************!*\ + !*** external "flarum.core.compat['common/components/Alert']" ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/components/Alert']; + +/***/ }), + +/***/ "flarum/common/components/Button": +/*!*****************************************************************!*\ + !*** external "flarum.core.compat['common/components/Button']" ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/components/Button']; + +/***/ }), + +/***/ "flarum/common/components/LoadingIndicator": +/*!***************************************************************************!*\ + !*** external "flarum.core.compat['common/components/LoadingIndicator']" ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/components/LoadingIndicator']; + +/***/ }), + +/***/ "flarum/common/components/Modal": +/*!****************************************************************!*\ + !*** external "flarum.core.compat['common/components/Modal']" ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/components/Modal']; + +/***/ }), + +/***/ "flarum/common/components/Tooltip": +/*!******************************************************************!*\ + !*** external "flarum.core.compat['common/components/Tooltip']" ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/components/Tooltip']; + +/***/ }), + +/***/ "flarum/common/extend": +/*!******************************************************!*\ + !*** external "flarum.core.compat['common/extend']" ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/extend']; + +/***/ }), + +/***/ "flarum/common/helpers/humanTime": +/*!*****************************************************************!*\ + !*** external "flarum.core.compat['common/helpers/humanTime']" ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/helpers/humanTime']; + +/***/ }), + +/***/ "flarum/common/helpers/icon": +/*!************************************************************!*\ + !*** external "flarum.core.compat['common/helpers/icon']" ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/helpers/icon']; + +/***/ }), + +/***/ "flarum/common/utils/Stream": +/*!************************************************************!*\ + !*** external "flarum.core.compat['common/utils/Stream']" ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/utils/Stream']; + +/***/ }), + +/***/ "flarum/common/utils/classList": +/*!***************************************************************!*\ + !*** external "flarum.core.compat['common/utils/classList']" ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = flarum.core.compat['common/utils/classList']; + +/***/ }) + +/******/ }); +//# sourceMappingURL=admin.js.map \ No newline at end of file diff --git a/extensions/package-manager/js/dist/admin.js.map b/extensions/package-manager/js/dist/admin.js.map new file mode 100755 index 000000000..ea1ce0866 --- /dev/null +++ b/extensions/package-manager/js/dist/admin.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://@flarum/package-manager/webpack/bootstrap","webpack://@flarum/package-manager/./admin.js","webpack://@flarum/package-manager/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://@flarum/package-manager/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/package-manager/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@flarum/package-manager/./src/admin/components/ExtensionItem.tsx","webpack://@flarum/package-manager/./src/admin/components/Installer.tsx","webpack://@flarum/package-manager/./src/admin/components/MajorUpdater.tsx","webpack://@flarum/package-manager/./src/admin/components/Updater.tsx","webpack://@flarum/package-manager/./src/admin/components/WhyNotModal.tsx","webpack://@flarum/package-manager/./src/admin/index.tsx","webpack://@flarum/package-manager/./src/admin/utils/errorHandler.ts","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/app']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/components/LoadingModal']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/utils/isExtensionEnabled']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/Component']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/Alert']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/Button']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/Modal']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/Tooltip']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/extend']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/helpers/humanTime']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/helpers/icon']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/utils/Stream']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/utils/classList']\""],"names":["_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","Constructor","protoProps","staticProps","prototype","_inheritsLoose","subClass","superClass","create","constructor","setPrototypeOf","_setPrototypeOf","o","p","__proto__","ExtensionItem","view","vnode","attrs","extension","updates","onClickUpdate","whyNotWarning","isCore","isDanger","classList","icon","name","extra","title","version","app","translator","trans","modal","show","WhyNotModal","v","replace","Component","Installer","packageName","isLoading","oninit","Stream","extiverse","onsubmit","bind","data","LoadingModal","request","method","url","forum","attribute","body","errorHandler","then","response","extensionId","id","alerts","type","window","location","href","reload","m","redraw","MajorUpdater","updateState","coreUpdate","update","incompatibleExtensions","map","extensions","status","dryRun","e","close","errors","pop","incompatible_extensions","Updater","packageUpdates","lastUpdateCheck","JSON","parse","settings","getExtensionUpdates","getCoreUpdate","core","backgroundImage","checkedAt","humanTime","checkForUpdates","updateGlobally","updateCoreMinor","lastUpdateRun","limitedPackages","includes","updateExtension","major","installed","filter","composerPackage","safeToUpdate","values","confirm","minor","global","loading","whyNot","className","oncreate","requestWhyNot","content","Modal","initializers","add","extensionData","registerSetting","isRequiredDirectoriesWritable","extend","ExtensionPage","items","isExtensionEnabled","error","code","guessed_cause"],"mappings":"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","file":"admin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./admin.js\");\n","export * from './src/admin';","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import Mithril from 'mithril';\nimport app from 'flarum/admin/app';\nimport Component, { ComponentAttrs } from 'flarum/common/Component';\nimport classList from 'flarum/common/utils/classList';\nimport icon from 'flarum/common/helpers/icon';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport Button from 'flarum/common/components/Button';\nimport { Extension as BaseExtension } from 'flarum/admin/AdminApplication';\nimport { UpdatedPackage } from './Updater';\nimport WhyNotModal from './WhyNotModal';\n\n/*\n * @todo fix in core\n */\nexport type Extension = BaseExtension & {\n name: string;\n};\n\nexport interface ExtensionItemAttrs extends ComponentAttrs {\n extension: Extension;\n updates: UpdatedPackage;\n onClickUpdate: CallableFunction;\n whyNotWarning?: boolean;\n isCore?: boolean;\n updatable?: boolean;\n isDanger?: boolean;\n}\n\nexport default class ExtensionItem extends Component {\n view(vnode: Mithril.Vnode): Mithril.Children {\n const { extension, updates, onClickUpdate, whyNotWarning, isCore, isDanger } = this.attrs;\n\n return (\n \n
\n {extension.icon ? icon(extension.icon.name) : ''}\n
\n
\n
{extension.extra['flarum-extension'].title}
\n
\n {this.version(extension.version)}\n {updates['latest-minor'] ? (\n \n {this.version(updates['latest-minor']!)}\n \n ) : null}\n {updates['latest-major'] && !isCore ? (\n \n {this.version(updates['latest-major']!)}\n \n ) : null}\n
\n
\n
\n {onClickUpdate ? (\n \n \n \n ) : null}\n {whyNotWarning ? (\n \n app.modal.show(WhyNotModal, { package: extension.name })}\n aria-label={app.translator.trans('flarum-package-manager.admin.extensions.check_why_it_failed_updating')}\n />\n \n ) : null}\n
\n \n );\n }\n\n private version(v: string): string {\n return 'v' + v.replace('v', '');\n }\n}\n","import type Mithril from 'mithril';\nimport app from 'flarum/admin/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport Stream from 'flarum/common/utils/Stream';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport errorHandler from '../utils/errorHandler';\n\nexport default class Installer extends Component {\n packageName!: Stream;\n isLoading: boolean = false;\n\n oninit(vnode: Mithril.Vnode): void {\n super.oninit(vnode);\n\n this.packageName = Stream('');\n }\n\n view(): Mithril.Children {\n return (\n
\n \n

\n {app.translator.trans('flarum-package-manager.admin.extensions.install_help', {\n extiverse: extiverse.com,\n })}\n

\n
\n \n \n
\n
\n );\n }\n\n data(): any {\n return {\n package: this.packageName(),\n };\n }\n\n onsubmit(): void {\n this.isLoading = true;\n app.modal.show(LoadingModal);\n\n app\n .request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/package-manager/extensions`,\n body: {\n data: this.data(),\n },\n errorHandler,\n })\n .then((response) => {\n const extensionId = response.id;\n app.alerts.show(\n { type: 'success' },\n app.translator.trans('flarum-package-manager.admin.extensions.successful_install', { extension: extensionId })\n );\n window.location.href = `${app.forum.attribute('adminUrl')}#/extension/${extensionId}`;\n window.location.reload();\n })\n .finally(() => {\n this.isLoading = false;\n m.redraw();\n });\n }\n}\n","import app from 'flarum/admin/app';\nimport Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Mithril from 'mithril';\nimport Button from 'flarum/common/components/Button';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport { UpdatedPackage, UpdateState } from './Updater';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport errorHandler from '../utils/errorHandler';\nimport Alert from 'flarum/common/components/Alert';\nimport WhyNotModal from './WhyNotModal';\nimport RequestError from 'flarum/common/utils/RequestError';\nimport ExtensionItem, { Extension } from './ExtensionItem';\n\ninterface MajorUpdaterAttrs extends ComponentAttrs {\n coreUpdate: UpdatedPackage;\n updateState: UpdateState;\n}\n\nexport default class MajorUpdater extends Component {\n isLoading: string | null = null;\n updateState!: UpdateState;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.updateState = this.attrs.updateState;\n }\n\n view(vnode: Mithril.Vnode): Mithril.Children {\n // @todo move Form-group--danger class to core for reuse\n return (\n
\n \"flarum\n \n

{app.translator.trans('flarum-package-manager.admin.major_updater.description')}

\n
\n \n \n \n \n
\n {this.updateState.incompatibleExtensions.length ? (\n
\n {this.updateState.incompatibleExtensions.map((extension: string) => (\n \n ))}\n
\n ) : null}\n {this.updateState.status === 'failure' ? (\n app.modal.show(WhyNotModal, { package: 'flarum/core' })}\n >\n {app.translator.trans('flarum-package-manager.admin.major_updater.failure.why')}\n ,\n ]}\n >\n

\n {app.translator.trans('flarum-package-manager.admin.major_updater.failure.desc')}\n

\n \n ) : null}\n
\n );\n }\n\n update(dryRun: boolean) {\n this.isLoading = `update-${dryRun ? 'dry-run' : 'run'}`;\n app.modal.show(LoadingModal);\n\n app\n .request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/package-manager/major-update`,\n body: {\n data: { dryRun },\n },\n errorHandler,\n })\n .then(() => {\n app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.update_successful'));\n window.location.reload();\n })\n .catch((e: RequestError) => {\n app.modal.close();\n this.updateState.status = 'failure';\n this.updateState.incompatibleExtensions = e.response?.errors?.pop()?.incompatible_extensions as string[];\n })\n .finally(() => {\n this.isLoading = null;\n m.redraw();\n });\n }\n}\n","import Mithril from 'mithril';\nimport app from 'flarum/admin/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport errorHandler from '../utils/errorHandler';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport MajorUpdater from './MajorUpdater';\nimport ExtensionItem, { Extension } from './ExtensionItem';\n\nexport type UpdatedPackage = {\n name: string;\n version: string;\n latest: string;\n 'latest-minor': string | null;\n 'latest-major': string | null;\n 'latest-status': string;\n description: string;\n};\n\nexport type ComposerUpdates = {\n installed: UpdatedPackage[];\n};\n\nexport type LastUpdateCheck = {\n checkedAt: Date | null;\n updates: ComposerUpdates;\n};\n\ntype UpdateType = 'major' | 'minor' | 'global';\ntype UpdateStatus = 'success' | 'failure' | null;\nexport type UpdateState = {\n ranAt: Date | null;\n status: UpdateStatus;\n limitedPackages: string[];\n incompatibleExtensions: string[];\n};\n\nexport type LastUpdateRun = {\n [key in UpdateType]: UpdateState;\n} & {\n limitedPackages: () => string[];\n};\n\nexport default class Updater extends Component {\n isLoading: string | null = null;\n packageUpdates: Record = {};\n lastUpdateCheck: LastUpdateCheck = JSON.parse(app.data.settings['flarum-package-manager.last_update_check']) as LastUpdateCheck;\n get lastUpdateRun(): LastUpdateRun {\n const lastUpdateRun = JSON.parse(app.data.settings['flarum-package-manager.last_update_run']) as LastUpdateRun;\n\n lastUpdateRun.limitedPackages = () => [\n ...lastUpdateRun.major.limitedPackages,\n ...lastUpdateRun.minor.limitedPackages,\n ...lastUpdateRun.global.limitedPackages,\n ];\n\n return lastUpdateRun;\n }\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n }\n\n view() {\n const extensions = this.getExtensionUpdates();\n let coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate();\n let core: any;\n\n if (coreUpdate) {\n core = {\n id: 'flarum-core',\n name: 'flarum/core',\n version: app.data.settings.version,\n icon: {\n backgroundImage: `url(${app.forum.attribute('baseUrl')}/assets/extensions/flarum-package-manager/flarum.svg`,\n },\n extra: {\n 'flarum-extension': {\n title: app.translator.trans('flarum-package-manager.admin.updater.flarum'),\n },\n },\n };\n }\n\n return [\n
\n \n

{app.translator.trans('flarum-package-manager.admin.updater.updater_help')}

\n {this.lastUpdateCheck?.checkedAt && (\n

\n \n {app.translator.trans('flarum-package-manager.admin.updater.last_update_checked_at')}\n \n {humanTime(this.lastUpdateCheck.checkedAt)}\n

\n )}\n
\n \n {app.translator.trans('flarum-package-manager.admin.updater.check_for_updates')}\n \n \n {app.translator.trans('flarum-package-manager.admin.updater.run_global_update')}\n \n
\n {this.isLoading !== null ? (\n
\n \n
\n ) : extensions.length || core ? (\n
\n
\n {core ? (\n \n ) : null}\n {extensions.map((extension: Extension) => (\n \n ))}\n
\n
\n ) : null}\n
,\n coreUpdate && coreUpdate['latest-major'] ? : null,\n ];\n }\n\n getExtensionUpdates(): Extension[] {\n this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => {\n const id = composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '');\n\n const extension = app.data.extensions[id];\n const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']);\n\n if (extension && safeToUpdate) {\n this.packageUpdates[extension.id] = composerPackage;\n }\n\n return extension && safeToUpdate;\n });\n\n return (Object.values(app.data.extensions) as Extension[]).filter((extension: Extension) => this.packageUpdates[extension.id]);\n }\n\n getCoreUpdate(): UpdatedPackage | undefined {\n return this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => composerPackage.name === 'flarum/core').pop();\n }\n\n checkForUpdates() {\n this.isLoading = 'check';\n\n app\n .request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/package-manager/check-for-updates`,\n errorHandler,\n })\n .then((response) => {\n this.lastUpdateCheck = response as LastUpdateCheck;\n })\n .finally(() => {\n this.isLoading = null;\n m.redraw();\n });\n }\n\n updateCoreMinor() {\n if (confirm(app.translator.trans('flarum-package-manager.admin.minor_update_confirmation.content'))) {\n app.modal.show(LoadingModal);\n this.isLoading = 'minor-update';\n\n app\n .request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/package-manager/minor-update`,\n errorHandler,\n })\n .then(() => {\n app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.update_successful'));\n window.location.reload();\n })\n .finally(() => {\n this.isLoading = null;\n m.redraw();\n });\n }\n }\n\n updateExtension(extension: any) {\n app.modal.show(LoadingModal);\n this.isLoading = 'extension-update';\n\n app\n .request({\n method: 'PATCH',\n url: `${app.forum.attribute('apiUrl')}/package-manager/extensions/${extension.id}`,\n errorHandler,\n })\n .then(() => {\n app.alerts.show(\n { type: 'success' },\n app.translator.trans('flarum-package-manager.admin.extensions.successful_update', { extension: extension.extra['flarum-extension'].title })\n );\n window.location.reload();\n })\n .finally(() => {\n this.isLoading = null;\n m.redraw();\n });\n }\n\n updateGlobally() {\n app.modal.show(LoadingModal);\n this.isLoading = 'global-update';\n\n app\n .request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/package-manager/global-update`,\n errorHandler,\n })\n .then(() => {\n app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.updater.global_update_successful'));\n window.location.reload();\n })\n .finally(() => {\n this.isLoading = null;\n m.redraw();\n });\n }\n}\n","import app from 'flarum/admin/app';\nimport Mithril from 'mithril';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport errorHandler from '../utils/errorHandler';\n\nexport interface WhyNotModalAttrs extends IInternalModalAttrs {\n package: string;\n}\n\nexport default class WhyNotModal extends Modal {\n loading: boolean = true;\n whyNot: string | null = null;\n\n className() {\n return 'Modal--large WhyNotModal';\n }\n\n title() {\n return app.translator.trans('flarum-package-manager.admin.why_not_modal.title');\n }\n\n oncreate(vnode: Mithril.VnodeDOM) {\n super.oncreate(vnode);\n\n this.requestWhyNot();\n }\n\n content() {\n return
{this.loading ? :
{this.whyNot}
}
;\n }\n\n requestWhyNot(): void {\n app\n .request({\n method: 'POST',\n url: `${app.forum.attribute('apiUrl')}/package-manager/why-not`,\n body: {\n data: {\n package: this.attrs.package,\n },\n },\n errorHandler,\n })\n .then((response: any) => {\n this.loading = false;\n this.whyNot = response.data.whyNot;\n m.redraw();\n });\n }\n}\n","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/admin/app';\nimport Alert from 'flarum/common/components/Alert';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport Button from 'flarum/common/components/Button';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport Installer from './components/Installer';\nimport Updater from './components/Updater';\nimport isExtensionEnabled from 'flarum/admin/utils/isExtensionEnabled';\n\napp.initializers.add('flarum-package-manager', (app) => {\n app.extensionData\n .for('flarum-package-manager')\n .registerSetting(() => {\n if (!app.data.isRequiredDirectoriesWritable) {\n return (\n
\n \n {app.translator.trans('flarum-package-manager.admin.file_permissions')}\n \n
\n );\n }\n\n return null;\n })\n .registerSetting(() => {\n if (app.data.isRequiredDirectoriesWritable) {\n return ;\n }\n\n return null;\n })\n .registerSetting(() => {\n if (app.data.isRequiredDirectoriesWritable) {\n return ;\n }\n\n return null;\n });\n\n extend(ExtensionPage.prototype, 'topItems', function (items) {\n if (this.extension.id === 'flarum-package-manager' || isExtensionEnabled(this.extension.id)) {\n return;\n }\n\n items.add(\n 'remove',\n {\n app.modal.show(LoadingModal);\n\n app\n .request({\n url: `${app.forum.attribute('apiUrl')}/package-manager/extensions/${this.extension.id}`,\n method: 'DELETE',\n })\n .then(() => {\n app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.extensions.successful_remove'));\n window.location = app.forum.attribute('adminUrl');\n })\n .finally(() => {\n app.modal.close();\n });\n }}\n >\n Remove\n \n );\n });\n});\n","import app from 'flarum/admin/app';\n\nexport default function (e: any) {\n const error = e.response.errors[0];\n\n if (!['composer_command_failure', 'extension_already_installed', 'extension_not_installed'].includes(error.code)) {\n throw e;\n }\n\n switch (error.code) {\n case 'composer_command_failure':\n if (error.guessed_cause) {\n app.alerts.show({ type: 'error' }, app.translator.trans(`flarum-package-manager.admin.exceptions.guessed_cause.${error.guessed_cause}`));\n app.modal.close();\n } else {\n app.alerts.show({ type: 'error' }, app.translator.trans('flarum-package-manager.admin.exceptions.composer_command_failure'));\n }\n break;\n\n case 'extension_already_installed':\n app.alerts.show({ type: 'error' }, app.translator.trans('flarum-package-manager.admin.exceptions.extension_already_installed'));\n app.modal.close();\n break;\n\n case 'extension_not_installed':\n app.alerts.show({ type: 'error' }, app.translator.trans('flarum-package-manager.admin.exceptions.extension_not_installed'));\n app.modal.close();\n }\n}\n","module.exports = flarum.core.compat['admin/app'];","module.exports = flarum.core.compat['admin/components/ExtensionPage'];","module.exports = flarum.core.compat['admin/components/LoadingModal'];","module.exports = flarum.core.compat['admin/utils/isExtensionEnabled'];","module.exports = flarum.core.compat['common/Component'];","module.exports = flarum.core.compat['common/components/Alert'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['common/components/LoadingIndicator'];","module.exports = flarum.core.compat['common/components/Modal'];","module.exports = flarum.core.compat['common/components/Tooltip'];","module.exports = flarum.core.compat['common/extend'];","module.exports = flarum.core.compat['common/helpers/humanTime'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/utils/Stream'];","module.exports = flarum.core.compat['common/utils/classList'];"],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/package-manager/js/package.json b/extensions/package-manager/js/package.json new file mode 100755 index 000000000..01ad726df --- /dev/null +++ b/extensions/package-manager/js/package.json @@ -0,0 +1,28 @@ +{ + "name": "@flarum/package-manager", + "version": "0.0.0", + "private": true, + "prettier": "@flarum/prettier-config", + "devDependencies": { + "prettier": "^2.5.1", + "flarum-webpack-config": "^2.0.0", + "webpack": "^5.65.0", + "webpack-cli": "^4.9.1", + "@flarum/prettier-config": "^1.0.0", + "flarum-tsconfig": "^1.0.2", + "typescript": "^4.5.4", + "typescript-coverage-report": "^0.6.1" + }, + "scripts": { + "dev": "webpack --mode development --watch", + "build": "webpack --mode production", + "format": "prettier --write src", + "format-check": "prettier --check src", + "ci": "yarn install --immutable --immutable-cache", + "analyze": "cross-env ANALYZER=true yarn run build", + "clean-typings": "npx rimraf dist-typings && mkdir dist-typings", + "build-typings": "yarn run clean-typings && tsc && [ -e src/@types ] && cp -r src/@types dist-typings/@types", + "check-typings": "tsc --noEmit --emitDeclarationOnly false", + "check-typings-coverage": "typescript-coverage-report" + } +} diff --git a/extensions/package-manager/js/src/admin/components/ExtensionItem.tsx b/extensions/package-manager/js/src/admin/components/ExtensionItem.tsx new file mode 100644 index 000000000..17d141296 --- /dev/null +++ b/extensions/package-manager/js/src/admin/components/ExtensionItem.tsx @@ -0,0 +1,89 @@ +import Mithril from 'mithril'; +import app from 'flarum/admin/app'; +import Component, { ComponentAttrs } from 'flarum/common/Component'; +import classList from 'flarum/common/utils/classList'; +import icon from 'flarum/common/helpers/icon'; +import Tooltip from 'flarum/common/components/Tooltip'; +import Button from 'flarum/common/components/Button'; +import { Extension as BaseExtension } from 'flarum/admin/AdminApplication'; +import { UpdatedPackage } from './Updater'; +import WhyNotModal from './WhyNotModal'; + +/* + * @todo fix in core + */ +export type Extension = BaseExtension & { + name: string; +}; + +export interface ExtensionItemAttrs extends ComponentAttrs { + extension: Extension; + updates: UpdatedPackage; + onClickUpdate: CallableFunction; + whyNotWarning?: boolean; + isCore?: boolean; + updatable?: boolean; + isDanger?: boolean; +} + +export default class ExtensionItem extends Component { + view(vnode: Mithril.Vnode): Mithril.Children { + const { extension, updates, onClickUpdate, whyNotWarning, isCore, isDanger } = this.attrs; + + return ( +
+
+ {extension.icon ? icon(extension.icon.name) : ''} +
+
+
{extension.extra['flarum-extension'].title}
+
+ {this.version(extension.version)} + {updates['latest-minor'] ? ( + + {this.version(updates['latest-minor']!)} + + ) : null} + {updates['latest-major'] && !isCore ? ( + + {this.version(updates['latest-major']!)} + + ) : null} +
+
+
+ {onClickUpdate ? ( + +
+
+ ); + } + + private version(v: string): string { + return 'v' + v.replace('v', ''); + } +} diff --git a/extensions/package-manager/js/src/admin/components/Installer.tsx b/extensions/package-manager/js/src/admin/components/Installer.tsx new file mode 100755 index 000000000..c8b67a79d --- /dev/null +++ b/extensions/package-manager/js/src/admin/components/Installer.tsx @@ -0,0 +1,71 @@ +import type Mithril from 'mithril'; +import app from 'flarum/admin/app'; +import Component from 'flarum/common/Component'; +import Button from 'flarum/common/components/Button'; +import Stream from 'flarum/common/utils/Stream'; +import LoadingModal from 'flarum/admin/components/LoadingModal'; +import errorHandler from '../utils/errorHandler'; + +export default class Installer extends Component { + packageName!: Stream; + isLoading: boolean = false; + + oninit(vnode: Mithril.Vnode): void { + super.oninit(vnode); + + this.packageName = Stream(''); + } + + view(): Mithril.Children { + return ( +
+ +

+ {app.translator.trans('flarum-package-manager.admin.extensions.install_help', { + extiverse: extiverse.com, + })} +

+
+ + +
+
+ ); + } + + data(): any { + return { + package: this.packageName(), + }; + } + + onsubmit(): void { + this.isLoading = true; + app.modal.show(LoadingModal); + + app + .request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/package-manager/extensions`, + body: { + data: this.data(), + }, + errorHandler, + }) + .then((response) => { + const extensionId = response.id; + app.alerts.show( + { type: 'success' }, + app.translator.trans('flarum-package-manager.admin.extensions.successful_install', { extension: extensionId }) + ); + window.location.href = `${app.forum.attribute('adminUrl')}#/extension/${extensionId}`; + window.location.reload(); + }) + .finally(() => { + this.isLoading = false; + m.redraw(); + }); + } +} diff --git a/extensions/package-manager/js/src/admin/components/MajorUpdater.tsx b/extensions/package-manager/js/src/admin/components/MajorUpdater.tsx new file mode 100644 index 000000000..bb1099e68 --- /dev/null +++ b/extensions/package-manager/js/src/admin/components/MajorUpdater.tsx @@ -0,0 +1,109 @@ +import app from 'flarum/admin/app'; +import Component, { ComponentAttrs } from 'flarum/common/Component'; +import Mithril from 'mithril'; +import Button from 'flarum/common/components/Button'; +import Tooltip from 'flarum/common/components/Tooltip'; +import { UpdatedPackage, UpdateState } from './Updater'; +import LoadingModal from 'flarum/admin/components/LoadingModal'; +import errorHandler from '../utils/errorHandler'; +import Alert from 'flarum/common/components/Alert'; +import WhyNotModal from './WhyNotModal'; +import RequestError from 'flarum/common/utils/RequestError'; +import ExtensionItem, { Extension } from './ExtensionItem'; + +interface MajorUpdaterAttrs extends ComponentAttrs { + coreUpdate: UpdatedPackage; + updateState: UpdateState; +} + +export default class MajorUpdater extends Component { + isLoading: string | null = null; + updateState!: UpdateState; + + oninit(vnode: Mithril.Vnode) { + super.oninit(vnode); + + this.updateState = this.attrs.updateState; + } + + view(vnode: Mithril.Vnode): Mithril.Children { + // @todo move Form-group--danger class to core for reuse + return ( +
+ flarum logo + +

{app.translator.trans('flarum-package-manager.admin.major_updater.description')}

+
+ + + + +
+ {this.updateState.incompatibleExtensions.length ? ( +
+ {this.updateState.incompatibleExtensions.map((extension: string) => ( + + ))} +
+ ) : null} + {this.updateState.status === 'failure' ? ( + app.modal.show(WhyNotModal, { package: 'flarum/core' })} + > + {app.translator.trans('flarum-package-manager.admin.major_updater.failure.why')} + , + ]} + > +

+ {app.translator.trans('flarum-package-manager.admin.major_updater.failure.desc')} +

+
+ ) : null} +
+ ); + } + + update(dryRun: boolean) { + this.isLoading = `update-${dryRun ? 'dry-run' : 'run'}`; + app.modal.show(LoadingModal); + + app + .request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/package-manager/major-update`, + body: { + data: { dryRun }, + }, + errorHandler, + }) + .then(() => { + app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.update_successful')); + window.location.reload(); + }) + .catch((e: RequestError) => { + app.modal.close(); + this.updateState.status = 'failure'; + this.updateState.incompatibleExtensions = e.response?.errors?.pop()?.incompatible_extensions as string[]; + }) + .finally(() => { + this.isLoading = null; + m.redraw(); + }); + } +} diff --git a/extensions/package-manager/js/src/admin/components/Updater.tsx b/extensions/package-manager/js/src/admin/components/Updater.tsx new file mode 100755 index 000000000..d621c360b --- /dev/null +++ b/extensions/package-manager/js/src/admin/components/Updater.tsx @@ -0,0 +1,254 @@ +import Mithril from 'mithril'; +import app from 'flarum/admin/app'; +import Component from 'flarum/common/Component'; +import Button from 'flarum/common/components/Button'; +import humanTime from 'flarum/common/helpers/humanTime'; +import LoadingModal from 'flarum/admin/components/LoadingModal'; +import errorHandler from '../utils/errorHandler'; +import LoadingIndicator from 'flarum/common/components/LoadingIndicator'; +import MajorUpdater from './MajorUpdater'; +import ExtensionItem, { Extension } from './ExtensionItem'; + +export type UpdatedPackage = { + name: string; + version: string; + latest: string; + 'latest-minor': string | null; + 'latest-major': string | null; + 'latest-status': string; + description: string; +}; + +export type ComposerUpdates = { + installed: UpdatedPackage[]; +}; + +export type LastUpdateCheck = { + checkedAt: Date | null; + updates: ComposerUpdates; +}; + +type UpdateType = 'major' | 'minor' | 'global'; +type UpdateStatus = 'success' | 'failure' | null; +export type UpdateState = { + ranAt: Date | null; + status: UpdateStatus; + limitedPackages: string[]; + incompatibleExtensions: string[]; +}; + +export type LastUpdateRun = { + [key in UpdateType]: UpdateState; +} & { + limitedPackages: () => string[]; +}; + +export default class Updater extends Component { + isLoading: string | null = null; + packageUpdates: Record = {}; + lastUpdateCheck: LastUpdateCheck = JSON.parse(app.data.settings['flarum-package-manager.last_update_check']) as LastUpdateCheck; + get lastUpdateRun(): LastUpdateRun { + const lastUpdateRun = JSON.parse(app.data.settings['flarum-package-manager.last_update_run']) as LastUpdateRun; + + lastUpdateRun.limitedPackages = () => [ + ...lastUpdateRun.major.limitedPackages, + ...lastUpdateRun.minor.limitedPackages, + ...lastUpdateRun.global.limitedPackages, + ]; + + return lastUpdateRun; + } + + oninit(vnode: Mithril.Vnode) { + super.oninit(vnode); + } + + view() { + const extensions = this.getExtensionUpdates(); + let coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate(); + let core: any; + + if (coreUpdate) { + core = { + id: 'flarum-core', + name: 'flarum/core', + version: app.data.settings.version, + icon: { + backgroundImage: `url(${app.forum.attribute('baseUrl')}/assets/extensions/flarum-package-manager/flarum.svg`, + }, + extra: { + 'flarum-extension': { + title: app.translator.trans('flarum-package-manager.admin.updater.flarum'), + }, + }, + }; + } + + return [ +
+ +

{app.translator.trans('flarum-package-manager.admin.updater.updater_help')}

+ {this.lastUpdateCheck?.checkedAt && ( +

+ + {app.translator.trans('flarum-package-manager.admin.updater.last_update_checked_at')} + + {humanTime(this.lastUpdateCheck.checkedAt)} +

+ )} +
+ + +
+ {this.isLoading !== null ? ( +
+ +
+ ) : extensions.length || core ? ( +
+
+ {core ? ( + + ) : null} + {extensions.map((extension: Extension) => ( + + ))} +
+
+ ) : null} +
, + coreUpdate && coreUpdate['latest-major'] ? : null, + ]; + } + + getExtensionUpdates(): Extension[] { + this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => { + const id = composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, ''); + + const extension = app.data.extensions[id]; + const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']); + + if (extension && safeToUpdate) { + this.packageUpdates[extension.id] = composerPackage; + } + + return extension && safeToUpdate; + }); + + return (Object.values(app.data.extensions) as Extension[]).filter((extension: Extension) => this.packageUpdates[extension.id]); + } + + getCoreUpdate(): UpdatedPackage | undefined { + return this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => composerPackage.name === 'flarum/core').pop(); + } + + checkForUpdates() { + this.isLoading = 'check'; + + app + .request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/package-manager/check-for-updates`, + errorHandler, + }) + .then((response) => { + this.lastUpdateCheck = response as LastUpdateCheck; + }) + .finally(() => { + this.isLoading = null; + m.redraw(); + }); + } + + updateCoreMinor() { + if (confirm(app.translator.trans('flarum-package-manager.admin.minor_update_confirmation.content'))) { + app.modal.show(LoadingModal); + this.isLoading = 'minor-update'; + + app + .request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/package-manager/minor-update`, + errorHandler, + }) + .then(() => { + app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.update_successful')); + window.location.reload(); + }) + .finally(() => { + this.isLoading = null; + m.redraw(); + }); + } + } + + updateExtension(extension: any) { + app.modal.show(LoadingModal); + this.isLoading = 'extension-update'; + + app + .request({ + method: 'PATCH', + url: `${app.forum.attribute('apiUrl')}/package-manager/extensions/${extension.id}`, + errorHandler, + }) + .then(() => { + app.alerts.show( + { type: 'success' }, + app.translator.trans('flarum-package-manager.admin.extensions.successful_update', { extension: extension.extra['flarum-extension'].title }) + ); + window.location.reload(); + }) + .finally(() => { + this.isLoading = null; + m.redraw(); + }); + } + + updateGlobally() { + app.modal.show(LoadingModal); + this.isLoading = 'global-update'; + + app + .request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/package-manager/global-update`, + errorHandler, + }) + .then(() => { + app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.updater.global_update_successful')); + window.location.reload(); + }) + .finally(() => { + this.isLoading = null; + m.redraw(); + }); + } +} diff --git a/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx b/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx new file mode 100644 index 000000000..352cc769a --- /dev/null +++ b/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx @@ -0,0 +1,51 @@ +import app from 'flarum/admin/app'; +import Mithril from 'mithril'; +import Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal'; +import LoadingIndicator from 'flarum/common/components/LoadingIndicator'; +import errorHandler from '../utils/errorHandler'; + +export interface WhyNotModalAttrs extends IInternalModalAttrs { + package: string; +} + +export default class WhyNotModal extends Modal { + loading: boolean = true; + whyNot: string | null = null; + + className() { + return 'Modal--large WhyNotModal'; + } + + title() { + return app.translator.trans('flarum-package-manager.admin.why_not_modal.title'); + } + + oncreate(vnode: Mithril.VnodeDOM) { + super.oncreate(vnode); + + this.requestWhyNot(); + } + + content() { + return
{this.loading ? :
{this.whyNot}
}
; + } + + requestWhyNot(): void { + app + .request({ + method: 'POST', + url: `${app.forum.attribute('apiUrl')}/package-manager/why-not`, + body: { + data: { + package: this.attrs.package, + }, + }, + errorHandler, + }) + .then((response: any) => { + this.loading = false; + this.whyNot = response.data.whyNot; + m.redraw(); + }); + } +} diff --git a/extensions/package-manager/js/src/admin/index.tsx b/extensions/package-manager/js/src/admin/index.tsx new file mode 100755 index 000000000..38c2757c0 --- /dev/null +++ b/extensions/package-manager/js/src/admin/index.tsx @@ -0,0 +1,73 @@ +import { extend } from 'flarum/common/extend'; +import app from 'flarum/admin/app'; +import Alert from 'flarum/common/components/Alert'; +import ExtensionPage from 'flarum/admin/components/ExtensionPage'; +import Button from 'flarum/common/components/Button'; +import LoadingModal from 'flarum/admin/components/LoadingModal'; +import Installer from './components/Installer'; +import Updater from './components/Updater'; +import isExtensionEnabled from 'flarum/admin/utils/isExtensionEnabled'; + +app.initializers.add('flarum-package-manager', (app) => { + app.extensionData + .for('flarum-package-manager') + .registerSetting(() => { + if (!app.data.isRequiredDirectoriesWritable) { + return ( +
+ + {app.translator.trans('flarum-package-manager.admin.file_permissions')} + +
+ ); + } + + return null; + }) + .registerSetting(() => { + if (app.data.isRequiredDirectoriesWritable) { + return ; + } + + return null; + }) + .registerSetting(() => { + if (app.data.isRequiredDirectoriesWritable) { + return ; + } + + return null; + }); + + extend(ExtensionPage.prototype, 'topItems', function (items) { + if (this.extension.id === 'flarum-package-manager' || isExtensionEnabled(this.extension.id)) { + return; + } + + items.add( + 'remove', + + ); + }); +}); diff --git a/extensions/package-manager/js/src/admin/utils/errorHandler.ts b/extensions/package-manager/js/src/admin/utils/errorHandler.ts new file mode 100755 index 000000000..bf0681620 --- /dev/null +++ b/extensions/package-manager/js/src/admin/utils/errorHandler.ts @@ -0,0 +1,29 @@ +import app from 'flarum/admin/app'; + +export default function (e: any) { + const error = e.response.errors[0]; + + if (!['composer_command_failure', 'extension_already_installed', 'extension_not_installed'].includes(error.code)) { + throw e; + } + + switch (error.code) { + case 'composer_command_failure': + if (error.guessed_cause) { + app.alerts.show({ type: 'error' }, app.translator.trans(`flarum-package-manager.admin.exceptions.guessed_cause.${error.guessed_cause}`)); + app.modal.close(); + } else { + app.alerts.show({ type: 'error' }, app.translator.trans('flarum-package-manager.admin.exceptions.composer_command_failure')); + } + break; + + case 'extension_already_installed': + app.alerts.show({ type: 'error' }, app.translator.trans('flarum-package-manager.admin.exceptions.extension_already_installed')); + app.modal.close(); + break; + + case 'extension_not_installed': + app.alerts.show({ type: 'error' }, app.translator.trans('flarum-package-manager.admin.exceptions.extension_not_installed')); + app.modal.close(); + } +} diff --git a/extensions/package-manager/js/tsconfig.json b/extensions/package-manager/js/tsconfig.json new file mode 100755 index 000000000..ee0d5ef5a --- /dev/null +++ b/extensions/package-manager/js/tsconfig.json @@ -0,0 +1,16 @@ +{ + // Use Flarum's tsconfig as a starting point + "extends": "flarum-tsconfig", + // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder + // and also tells your Typescript server to read core's global typings for + // access to `dayjs` and `$` in the global namespace. + "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*", "@types/**/*"], + "compilerOptions": { + // This will output typings to `dist-typings` + "declarationDir": "./dist-typings", + "baseUrl": ".", + "paths": { + "flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] + } + } +} diff --git a/extensions/package-manager/js/webpack.config.js b/extensions/package-manager/js/webpack.config.js new file mode 100755 index 000000000..ef35ea006 --- /dev/null +++ b/extensions/package-manager/js/webpack.config.js @@ -0,0 +1 @@ +module.exports = require('flarum-webpack-config')(); diff --git a/extensions/package-manager/js/yarn.lock b/extensions/package-manager/js/yarn.lock new file mode 100644 index 000000000..5e3a79261 --- /dev/null +++ b/extensions/package-manager/js/yarn.lock @@ -0,0 +1,2868 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.0.tgz#72becdf17ee44b2d1ac5651fb12f1952c336fe23" + integrity sha512-d5RysTlJ7hmw5Tw4UxgxcY3lkMe92n8sXCcuLPAyIAHK6j8DefDwtGnVVDgOnv+RnEosulDJ9NPKQL27bDId0g== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" + integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== + +"@babel/core@^7.14.3": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.2.tgz#2c77fc430e95139d816d39b113b31bf40fb22337" + integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw== + dependencies: + "@ampproject/remapping" "^2.0.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.0" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + +"@babel/generator@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.0.tgz#7bd890ba706cd86d3e2f727322346ffdbf98f65e" + integrity sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": + version "7.17.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz#9699f14a88833a7e055ce57dcd3ffdcd25186b21" + integrity sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.17.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" + integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.16.7", "@babel/parser@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.0.tgz#f0ac33eddbe214e4105363bb17c3341c5ffcc43c" + integrity sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.13.0", "@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-assign@^7.12.13": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.16.7.tgz#5fe08d63dccfeb6a33aa2638faf98e5c584100f8" + integrity sha512-R8mawvm3x0COTJtveuoqZIjNypn2FjfvXZr4pSQ8VhEFBuQGBz4XhHasZtHXjgXU4XptZ4HtGof3NoYc93ZH9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.14.3", "@babel/plugin-transform-react-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" + integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" + integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-runtime@^7.14.3": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" + integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typescript@^7.16.7": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.14.2": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + dependencies: + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.13.13": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" + integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.13.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.14.0", "@babel/runtime@^7.8.4": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" + integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.0.tgz#3143e5066796408ccc880a33ecd3184f3e75cd30" + integrity sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.0" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.0" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.4.4": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" + integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== + +"@flarum/prettier-config@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@flarum/prettier-config/-/prettier-config-1.0.0.tgz#3ce431fa376994e8133e313dbe7c4ee3d3fe1a39" + integrity sha512-3/AcliIi5jPt4i7COb5hsLv6hm4EeXT9yI9I2EuEvhPi2QR+O9Y/8wrqRuO5mDkRzCIhUY+mjIL/f9770Zwfqg== + +"@hypnosphi/create-react-context@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" + integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz#b876e3feefb9c8d3aa84014da28b5e52a0640d72" + integrity sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.10" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz#baf57b4e2a690d4f38560171f91783656b7f8186" + integrity sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.2.tgz#e051581782a770c30ba219634f2019241c5d3cde" + integrity sha512-9KzzH4kMjA2XmBRHfqG2/Vtl7s92l6uNDd0wW7frDE+EUvQFGqNXhWp0UGJjSkt3v2AYjzOZn1QO9XaTNJIt1Q== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@semantic-ui-react/event-stack@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz#14fac9796695aa3967962d94ea9733a85325f9c4" + integrity sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg== + dependencies: + exenv "^1.2.2" + prop-types "^15.6.2" + +"@stardust-ui/react-component-event-listener@~0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@stardust-ui/react-component-event-listener/-/react-component-event-listener-0.38.0.tgz#1787faded94b40ad41226e6289baf13e701c6e7f" + integrity sha512-sIP/e0dyOrrlb8K7KWumfMxj/gAifswTBC4o68Aa+C/GA73ccRp/6W1VlHvF/dlOR4KLsA+5SKnhjH36xzPsWg== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.7.2" + +"@stardust-ui/react-component-ref@~0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@stardust-ui/react-component-ref/-/react-component-ref-0.38.0.tgz#52d555f2d5edd213c923c93a106f7de940e427ef" + integrity sha512-xjs6WnvJVueSIXMWw0C3oWIgAPpcD03qw43oGOjUXqFktvpNkB73JoKIhS4sCrtQxBdct75qqr4ZL6JiyPcESw== + dependencies: + "@babel/runtime" "^7.1.2" + prop-types "^15.7.2" + react-is "^16.6.3" + +"@types/eslint-scope@^3.7.0": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" + integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/jquery@^3.5.5": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.13.tgz#5482d3ee325d5862f77a91c09369ae0a5b082bf3" + integrity sha512-ZxJrup8nz/ZxcU0vantG+TPdboMhB24jad2uSap50zE7Q9rUeYlCF25kFMSmHR33qoeOgqcdHEp3roaookC0Sg== + dependencies: + "@types/sizzle" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/mithril@^2.0.7": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/mithril/-/mithril-2.0.8.tgz#b7b6f58bdc7b244802f5ff919805e947d8e45b4e" + integrity sha512-QzVV70DqUhWfLFpMFDBI9rRxtzeUUpbhiFDpUJYSV92AePgl+Qfficgv2MOb1Ceb+lBOQU8+L+Hjf2UielQjEw== + +"@types/node@*": + version "17.0.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.16.tgz#e3733f46797b9df9e853ca9f719c8a6f7b84cd26" + integrity sha512-ydLaGVfQOQ6hI1xK2A5nVh8bl0OGoIfYMxPWHqqYe9bTkWCfqiVvZoh2I/QF2sNSkZzZyROBoTefIEI+PB6iIA== + +"@types/sizzle@*": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/throttle-debounce@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776" + integrity sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.4.1: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +babel-loader@^8.2.2: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + 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-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caniuse-lite@^1.0.30001286: + version "1.0.30001309" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001309.tgz#e0ee78b9bec0704f67304b00ff3c5c0c768a9f62" + integrity sha512-Pl8vfigmBXXq+/yUz1jUwULeq9xhMJznzdc/xwl4WclDAuebcTHVefpz8lE/bMI+UN7TOkSSe7B7RnZd6+dzjA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +cli-table3@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" + integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + dependencies: + string-width "^4.2.0" + optionalDependencies: + colors "1.4.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +core-js-compat@^3.20.2, core-js-compat@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.0.tgz#bcc86aa5a589cee358e7a7fa0a4979d5a76c3885" + integrity sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +dayjs@^1.10.4: + version "1.10.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== + +debug@^4.1.0, debug@^4.1.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +deep-equal@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +electron-to-chromium@^1.4.17: + version "1.4.67" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz#699e59d6959d05f87865e12b3055bbcf492bbbee" + integrity sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +enhanced-resolve@^5.8.3: + version "5.9.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz#49ac24953ac8452ed8fed2ef1340fc8e043667ee" + integrity sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exenv@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@3: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flarum-tsconfig@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flarum-tsconfig/-/flarum-tsconfig-1.0.2.tgz#1dda4d867a1dddc627c2afbc74af12d602371ecd" + integrity sha512-RUaN7D6noLK9vY1F86NIc+IlIP1YAA3bJ4jGR5pIm8UxvLBLW8qrAHzIosuQJgvnge7VgTA5c2LoNefUK/9EiQ== + dependencies: + "@types/jquery" "^3.5.5" + "@types/mithril" "^2.0.7" + "@types/throttle-debounce" "^2.1.0" + dayjs "^1.10.4" + +flarum-webpack-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flarum-webpack-config/-/flarum-webpack-config-2.0.0.tgz#a64d0563aa80773cf6de40891035ad7c0798855e" + integrity sha512-IdH8SmPzrha1RYIx0VDowKu8Wbxb1X5GwpJ6McF6tWfmIEBOn0z2C2MKh3807cxumBx4DP3YvZCcO5Il8zJGhA== + dependencies: + "@babel/core" "^7.14.3" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-transform-object-assign" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.14.3" + "@babel/plugin-transform-runtime" "^7.14.3" + "@babel/preset-env" "^7.14.2" + "@babel/preset-react" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/runtime" "^7.14.0" + babel-loader "^8.2.2" + typescript "^4.3.2" + webpack-bundle-analyzer "^4.4.2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +keyboard-key@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboard-key/-/keyboard-key-1.1.0.tgz#6f2e8e37fa11475bb1f1d65d5174f1b35653f5b7" + integrity sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.15, lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.27: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3, minimatch@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ncp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-releases@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + +normalize-path@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +popper.js@^1.14.4: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-dom@^16.13.1: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-is@^16.13.1, react-is@^16.6.3, react-is@^16.8.6: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-popper@^1.3.4: + version "1.3.11" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" + integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg== + dependencies: + "@babel/runtime" "^7.1.2" + "@hypnosphi/create-react-context" "^0.3.1" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + +react@^16.13.1: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" + integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + dependencies: + jsesc "~0.5.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semantic-ui-react@^0.88.2: + version "0.88.2" + resolved "https://registry.yarnpkg.com/semantic-ui-react/-/semantic-ui-react-0.88.2.tgz#3d4b54f8b799769b412435c8531475fd34aa4149" + integrity sha512-+02kN2z8PuA/cMdvDUsHhbJmBzxxgOXVHMFr9XK7zGb0wkW9A6OPQMFokWz7ozlVtKjN6r7zsb+Qvjk/qq1OWw== + dependencies: + "@babel/runtime" "^7.1.2" + "@semantic-ui-react/event-stack" "^3.1.0" + "@stardust-ui/react-component-event-listener" "~0.38.0" + "@stardust-ui/react-component-ref" "~0.38.0" + classnames "^2.2.6" + keyboard-key "^1.0.4" + lodash "^4.17.15" + prop-types "^15.7.2" + react-is "^16.8.6" + react-popper "^1.3.4" + shallowequal "^1.1.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== + dependencies: + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +"tslib@1 || 2": + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@3: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-coverage-core@^2.17.2: + version "2.21.0" + resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.21.0.tgz#30796802a53e212f9cc7f4c3e72053c65f690382" + integrity sha512-VNC7Ig0KAzpYjWvxQ1SaMufEqSm4GPSsdVaCWA5fRHSjSvkXbPVK+C6H0lIq2t8brkrvnXk7iDs9g4sjux6JQw== + dependencies: + fast-glob "3" + minimatch "3" + normalize-path "3" + tslib "1 || 2" + tsutils "3" + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + +typescript-coverage-report@^0.6.1: + version "0.6.4" + resolved "https://registry.yarnpkg.com/typescript-coverage-report/-/typescript-coverage-report-0.6.4.tgz#3a7a7724c0f27de50d2a0708c7b7b7088bed2055" + integrity sha512-G+0OFYxwN5oRbORlU1nKYtO00G567lcl4+nbg3MU3Y9ayFnh677dMHmAL4JGP/4Cb1IBN5h/DUQDr/z9X+9lag== + dependencies: + chalk "^4.0.0" + cli-table3 "^0.6.1" + commander "^5.0.0" + ncp "^2.0.0" + react "^16.13.1" + react-dom "^16.13.1" + rimraf "^3.0.2" + semantic-ui-react "^0.88.2" + type-coverage-core "^2.17.2" + +typescript@^4.3.2, typescript@^4.5.4: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-bundle-analyzer@^4.4.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@^4.9.1: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.65.0: + version "5.68.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.68.0.tgz#a653a58ed44280062e47257f260117e4be90d560" + integrity sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.3.1: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== diff --git a/extensions/package-manager/less/admin.less b/extensions/package-manager/less/admin.less new file mode 100755 index 000000000..7dc590e93 --- /dev/null +++ b/extensions/package-manager/less/admin.less @@ -0,0 +1,157 @@ +.FormControl-container { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 4px; +} + +.ComposerFailureModal-output { + white-space: break-spaces; +} + +.flarum-package-manager-Page .ExtensionPage-settings .Form-group:last-child { + display: none; +} + +.PackageManager-lastUpdatedAt { + color: var(--control-color); + + &-label { + font-weight: bold; + } +} + +.PackageManager-updaterControls { + display: flex; + flex-wrap: wrap; + gap: 8px; + grid-area: controls; +} + +.PackageManager-extensions { + &-grid { + --gap: 12px; + display: grid; + grid-template-columns: repeat(auto-fit, calc(~"100% / 3 - var(--gap)")); + gap: var(--gap); + margin-top: 16px; + } +} + +.PackageManager-extension { + display: flex; + align-items: center; + gap: 8px; + background-color: var(--control-bg); + padding: 8px; + border-radius: var(--border-radius); + + &-controls { + margin-left: auto; + } + + &-icon { + --size: 40px; + } + + &-name { + font-weight: bold; + } + + &-version { + display: flex; + align-items: center; + gap: 8px; + + &-latest { + border-radius: 30px; + padding: 0 6px; + font-weight: bold; + + &--minor { + background-color: var(--alert-success-bg); + color: var(--alert-success-color); + } + + &--major { + background-color: var(--alert-bg); + color: var(--alert-color); + } + } + } + + &--core { + --bg-hover: darken(#e7672e, 5); + background-color: #e7672e; + color: #fff; + --button-color: #fff; + --button-bg-hover: var(--bg-hover); + + .Button--danger { + color: #fff; + --button-bg-hover: var(--bg-hover); + } + } + + &--core &-icon { + background-size: 100%; + background-color: transparent; + filter: grayscale(1) brightness(3.5); + } + + &--danger { + background-color: var(--control-danger-bg); + } +} + +.PackageManager-majorUpdate { + --space: 16px; + padding: var(--space); + display: grid; + grid-template-areas: + "title logo" + "helpText logo" + "controls logo" + "extensions extensions" + "failure failure"; + grid-gap: 0 var(--space); + align-items: center; + + > img { + grid-area: logo; + } + + > label { + grid-area: title; + } + + > .helpText { + grid-area: helpText; + } + + &-failure { + --border-radius: 0; + grid-area: failure; + margin: calc(~"0px - var(--space)"); + margin-top: var(--space); + } + + &-incompatibleExtensions { + grid-area: extensions; + margin-top: var(--space); + padding-top: var(--space); + border-top: 1px solid var(--control-bg); + } +} + +.Form-group--danger { + border: 2px solid var(--alert-error-bg); + border-radius: var(--border-radius); + background-color: transparent; +} + +.WhyNotModal { + &-contents { + overflow-x: auto; + } +} diff --git a/extensions/package-manager/locale/en.yml b/extensions/package-manager/locale/en.yml new file mode 100755 index 000000000..972cf6027 --- /dev/null +++ b/extensions/package-manager/locale/en.yml @@ -0,0 +1,53 @@ +flarum-package-manager: + admin: + exceptions: + composer_command_failure: Failed to execute. Check the composer logs in storage/logs/composer. + extension_already_installed: Extension is already installed. + extension_not_installed: Extension not found. + + guessed_cause: + extension_incompatible_with_instance: The extension is most likely incompatible with your current Flarum instance. + extensions_incompatible_with_new_major: > + Some installed extensions are not compatible with the newest major release. + Please wait until the extensions are updated to be compatible by the authors, or remove them before proceeding. + + extensions: + check_why_it_failed_updating: Show why it did not update to the latest. + install: Install a new extension + install_help: Fill in the extension package name to proceed. Visit {extiverse} to browse extensions. + proceed: Proceed + successful_install: "{extension} was installed successfully, redirecting.." + successful_remove: Extension removed successfully. + successful_update: "{extension} was updated successfully, redirecting.." + update: Update + + file_permissions: > + The package manager requires read and write permissions on the following files and directories: composer.json, composer.lock, vendor, storage/.composer + + major_updater: + description: Major Flarum updates are not backwards compatible, meaning that some of your currently installed extensions, and manually made modifications might not work with this new version. + dry_run: Dry Run + dry_run_help: A dry run emulates the update to see if your current setup can safely update, this does not mean that your manual made custom modifications will work in the newer version. + failure: + desc: The last major update failed, some installed extensions are not compatible with the new major release. + why: Find out more + + title: Flarum {version} Major Update Available + update: Update + + minor_update_confirmation: + content: This will also update any other extensions/packages with availabe updates. + + updater: + check_for_updates: Check for updates + flarum: Flarum Core + global_update_successful: Successfully updated all packages. + last_update_checked_at: "Last Update Check: " + run_global_update: Run Global Update + updater_title: Updates + updater_help: Runs a check for new extension and Flarum updates. + + update_successful: Flarum successfully updated. + + why_not_modal: + title: Why Won't it Update diff --git a/extensions/package-manager/migrations/2017_04_09_000000_create_bazaar_tasks_table.php b/extensions/package-manager/migrations/2017_04_09_000000_create_bazaar_tasks_table.php new file mode 100755 index 000000000..31c5322c9 --- /dev/null +++ b/extensions/package-manager/migrations/2017_04_09_000000_create_bazaar_tasks_table.php @@ -0,0 +1,19 @@ +increments('id'); + $table->string('status', 50)->nullable(); + $table->string('command', 50); + $table->string('command_class')->nullable(); + $table->string('package', 100)->nullable(); + $table->mediumText('output'); + $table->dateTime('created_at'); + $table->dateTime('started_at')->nullable(); + $table->dateTime('finished_at')->nullable(); + } +); diff --git a/extensions/package-manager/src/Api/Controller/CheckForUpdatesController.php b/extensions/package-manager/src/Api/Controller/CheckForUpdatesController.php new file mode 100755 index 000000000..3f0333b85 --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/CheckForUpdatesController.php @@ -0,0 +1,43 @@ +bus = $bus; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + + $lastUpdateCheck = $this->bus->dispatch( + new CheckForUpdates($actor) + ); + + return new JsonResponse($lastUpdateCheck); + } +} diff --git a/extensions/package-manager/src/Api/Controller/GlobalUpdateController.php b/extensions/package-manager/src/Api/Controller/GlobalUpdateController.php new file mode 100755 index 000000000..5828c0c7b --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/GlobalUpdateController.php @@ -0,0 +1,45 @@ +bus = $bus; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + + $this->bus->dispatch( + new GlobalUpdate($actor) + ); + + return new EmptyResponse(200); + } +} diff --git a/extensions/package-manager/src/Api/Controller/ListTaskController.php b/extensions/package-manager/src/Api/Controller/ListTaskController.php new file mode 100755 index 000000000..462ee2886 --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/ListTaskController.php @@ -0,0 +1,32 @@ +assertAdmin(); + + return Task::query()->orderBy('created_at', 'desc')->get(); + } +} diff --git a/extensions/package-manager/src/Api/Controller/MajorUpdateController.php b/extensions/package-manager/src/Api/Controller/MajorUpdateController.php new file mode 100755 index 000000000..5e6859e99 --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/MajorUpdateController.php @@ -0,0 +1,44 @@ +bus = $bus; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + $dryRun = (bool) (int) Arr::get($request->getParsedBody(), 'data.dryRun', 0); + + $this->bus->dispatch( + new MajorUpdate($actor, $dryRun) + ); + + return new EmptyResponse(200); + } +} diff --git a/extensions/package-manager/src/Api/Controller/MinorUpdateController.php b/extensions/package-manager/src/Api/Controller/MinorUpdateController.php new file mode 100755 index 000000000..ee930405a --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/MinorUpdateController.php @@ -0,0 +1,45 @@ +bus = $bus; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + + $this->bus->dispatch( + new MinorUpdate($actor) + ); + + return new EmptyResponse(200); + } +} diff --git a/extensions/package-manager/src/Api/Controller/RemoveExtensionController.php b/extensions/package-manager/src/Api/Controller/RemoveExtensionController.php new file mode 100755 index 000000000..842d11129 --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/RemoveExtensionController.php @@ -0,0 +1,44 @@ +bus = $bus; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + $extensionId = Arr::get($request->getQueryParams(), 'id'); + + $this->bus->dispatch( + new RemoveExtension($actor, $extensionId) + ); + + return new EmptyResponse(200); + } +} diff --git a/extensions/package-manager/src/Api/Controller/RequireExtensionController.php b/extensions/package-manager/src/Api/Controller/RequireExtensionController.php new file mode 100755 index 000000000..e0eeef06c --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/RequireExtensionController.php @@ -0,0 +1,48 @@ +bus = $bus; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + $package = Arr::get($request->getParsedBody(), 'data.package'); + + $data = $this->bus->dispatch( + new RequireExtension($actor, $package) + ); + + return new JsonResponse($data); + } +} diff --git a/extensions/package-manager/src/Api/Controller/UpdateExtensionController.php b/extensions/package-manager/src/Api/Controller/UpdateExtensionController.php new file mode 100755 index 000000000..7b846c481 --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/UpdateExtensionController.php @@ -0,0 +1,44 @@ +bus = $bus; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + $extensionId = Arr::get($request->getQueryParams(), 'id'); + + $this->bus->dispatch( + new UpdateExtension($actor, $extensionId) + ); + + return new EmptyResponse(200); + } +} diff --git a/extensions/package-manager/src/Api/Controller/WhyNotController.php b/extensions/package-manager/src/Api/Controller/WhyNotController.php new file mode 100755 index 000000000..4732a0ec4 --- /dev/null +++ b/extensions/package-manager/src/Api/Controller/WhyNotController.php @@ -0,0 +1,47 @@ +bus = $bus; + } + + public function handle(ServerRequestInterface $request): ResponseInterface + { + $actor = RequestUtil::getActor($request); + $package = Arr::get($request->getParsedBody(), 'data.package', ''); + $version = Arr::get($request->getParsedBody(), 'data.version', '*'); + + $whyNot = $this->bus->dispatch( + new WhyNot($actor, $package, $version) + ); + + return new JsonResponse([ + 'data' => compact('whyNot') + ]); + } +} diff --git a/extensions/package-manager/src/Command/CheckForUpdates.php b/extensions/package-manager/src/Command/CheckForUpdates.php new file mode 100755 index 000000000..368271e1d --- /dev/null +++ b/extensions/package-manager/src/Command/CheckForUpdates.php @@ -0,0 +1,25 @@ +actor = $actor; + } +} diff --git a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php new file mode 100755 index 000000000..31ed821e2 --- /dev/null +++ b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php @@ -0,0 +1,127 @@ +composer = $composer; + $this->lastUpdateCheck = $lastUpdateCheck; + } + + /** + * We run two commands here + * + * `composer outdated -D --format json` + * This queries latest versions for all direct packages, so it can include major updates, + * that are not necessarily compatible with the current flarum version. + * That includes flarum/core itself, so for example if we are on flarum/core v1.8.0 + * and there are v1.8.1 and v2.0.0 available, the command would only let us know of v2.0.0. + * + * `composer outdated -D --minor-only --format json` + * This only lists latest minor updates, we need to run this as well not only to be able to know + * of these minor versions in addition to major ones, but especially for the flarum/core, as explained above + * we need to know of minor core updates, even if there is a major version available. + * + * The results from both commands are properly processed and merged to have new key values `latest-minor` and `latest-major`. + * + * @throws \Flarum\User\Exception\PermissionDeniedException|ComposerCommandFailedException + * @todo integration test + */ + public function handle(CheckForUpdates $command) + { + $actor = $command->actor; + + $actor->assertAdmin(); + + $firstOutput = $this->runComposerCommand(false); + $firstOutput = json_decode($firstOutput, true); + + $majorUpdates = false; + + foreach ($firstOutput['installed'] as $package) { + if ($package['latest-status'] === 'update-possible') { + $majorUpdates = true; + break; + } + } + + if ($majorUpdates) { + $secondOutput = $this->runComposerCommand(true); + $secondOutput = json_decode($secondOutput, true); + } + + if (! isset($secondOutput)) { + $secondOutput = ['installed' => []]; + } + + foreach ($firstOutput['installed'] as &$mainPackageUpdate) { + $mainPackageUpdate['latest-minor'] = $mainPackageUpdate['latest-major'] = null; + + if ($mainPackageUpdate['latest-status'] === 'update-possible') { + $mainPackageUpdate['latest-major'] = $mainPackageUpdate['latest']; + + $minorPackageUpdate = array_filter($secondOutput['installed'], function ($package) use ($mainPackageUpdate) { + return $package['name'] === $mainPackageUpdate['name']; + })[0] ?? null; + + if ($minorPackageUpdate) { + $mainPackageUpdate['latest-minor'] = $minorPackageUpdate['latest']; + } + } else { + $mainPackageUpdate['latest-minor'] = $mainPackageUpdate['latest']; + } + } + + return $this->lastUpdateCheck + ->with('installed', $firstOutput['installed']) + ->save(); + } + + /** + * @throws ComposerCommandFailedException + */ + protected function runComposerCommand(bool $minorOnly): string + { + $input = [ + 'command' => 'outdated', + '-D' => true, + '--format' => 'json', + ]; + + if ($minorOnly) { + $input['--minor-only'] = true; + } + + $output = $this->composer->run(new ArrayInput($input)); + + if ($output->getExitCode() !== 0) { + throw new ComposerCommandFailedException('', $output->getContents()); + } + + return $output->getContents(); + } +} diff --git a/extensions/package-manager/src/Command/GlobalUpdate.php b/extensions/package-manager/src/Command/GlobalUpdate.php new file mode 100644 index 000000000..1e545ca85 --- /dev/null +++ b/extensions/package-manager/src/Command/GlobalUpdate.php @@ -0,0 +1,25 @@ +actor = $actor; + } +} diff --git a/extensions/package-manager/src/Command/GlobalUpdateHandler.php b/extensions/package-manager/src/Command/GlobalUpdateHandler.php new file mode 100644 index 000000000..4b4e6e106 --- /dev/null +++ b/extensions/package-manager/src/Command/GlobalUpdateHandler.php @@ -0,0 +1,64 @@ +composer = $composer; + $this->events = $events; + $this->commandDispatcher = $commandDispatcher; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException|ComposerUpdateFailedException + */ + public function handle(GlobalUpdate $command) + { + $command->actor->assertAdmin(); + + $output = $this->composer->run( + new StringInput("update --prefer-dist --no-dev -a --with-all-dependencies") + ); + + if ($output->getExitCode() !== 0) { + throw new ComposerUpdateFailedException('*', $output->getContents()); + } + + $this->events->dispatch( + new FlarumUpdated($command->actor, FlarumUpdated::GLOBAL) + ); + + return true; + } +} diff --git a/extensions/package-manager/src/Command/MajorUpdate.php b/extensions/package-manager/src/Command/MajorUpdate.php new file mode 100644 index 000000000..5719fb5df --- /dev/null +++ b/extensions/package-manager/src/Command/MajorUpdate.php @@ -0,0 +1,31 @@ +actor = $actor; + $this->dryRun = $dryRun; + } +} diff --git a/extensions/package-manager/src/Command/MajorUpdateHandler.php b/extensions/package-manager/src/Command/MajorUpdateHandler.php new file mode 100644 index 000000000..2e20254aa --- /dev/null +++ b/extensions/package-manager/src/Command/MajorUpdateHandler.php @@ -0,0 +1,129 @@ +composer = $composer; + $this->lastUpdateCheck = $lastUpdateCheck; + $this->events = $events; + $this->composerJson = $composerJson; + } + + /** + * Set the version constraint for all directly required packages in the root composer.json to *. + * Set flarum/core version constraint to new major version. + * Run composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies. + * Clear cache. + * Run migrations. + * + * @throws \Flarum\User\Exception\PermissionDeniedException + * @throws NoNewMajorVersionException|MajorUpdateFailedException + */ + public function handle(MajorUpdate $command) + { + $command->actor->assertAdmin(); + + $majorVersion = $this->lastUpdateCheck->getNewMajorVersion(); + + if (! $majorVersion) { + throw new NoNewMajorVersionException(); + } + + $this->updateComposerJson($majorVersion); + + $this->runCommand($command->dryRun, $majorVersion); + + if ($command->dryRun) { + $this->composerJson->revert(); + + return true; + } + + $this->events->dispatch( + new FlarumUpdated($command->actor, FlarumUpdated::MAJOR) + ); + + return true; + } + + /** + * @todo change minimum stability to 'stable' and any other similar params + */ + protected function updateComposerJson(string $majorVersion): void + { + $versionNumber = str_replace('v', '', $majorVersion); + + $this->composerJson->require('*', '*'); + $this->composerJson->require('flarum/core', '^'.$versionNumber); + } + + /** + * @throws MajorUpdateFailedException + */ + protected function runCommand(bool $dryRun, string $majorVersion): void + { + $input = [ + 'command' => 'update', + '--prefer-dist' => true, + '--no-plugins' => true, + '--no-dev' => true, + '-a' => true, + '--with-all-dependencies' => true, + ]; + + if ($dryRun) { + $input['--dry-run'] = true; + } + + $output = $this->composer->run(new ArrayInput($input)); + + if ($output->getExitCode() !== 0) { + throw new MajorUpdateFailedException('*', $output->getContents(), $majorVersion); + } + } +} diff --git a/extensions/package-manager/src/Command/MinorUpdate.php b/extensions/package-manager/src/Command/MinorUpdate.php new file mode 100755 index 000000000..87b36224f --- /dev/null +++ b/extensions/package-manager/src/Command/MinorUpdate.php @@ -0,0 +1,25 @@ +actor = $actor; + } +} diff --git a/extensions/package-manager/src/Command/MinorUpdateHandler.php b/extensions/package-manager/src/Command/MinorUpdateHandler.php new file mode 100755 index 000000000..16e5b3225 --- /dev/null +++ b/extensions/package-manager/src/Command/MinorUpdateHandler.php @@ -0,0 +1,77 @@ +composer = $composer; + $this->lastUpdateCheck = $lastUpdateCheck; + $this->events = $events; + $this->composerJson = $composerJson; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + * @throws ComposerUpdateFailedException + */ + public function handle(MinorUpdate $command) + { + $command->actor->assertAdmin(); + + $coreRequirement = $this->composerJson->get()['require']['flarum/core']; + + $this->composerJson->require('*', '*'); + $this->composerJson->require('flarum/core', $coreRequirement); + + $output = $this->composer->run( + new StringInput("update --prefer-dist --no-dev -a --with-all-dependencies") + ); + + if ($output->getExitCode() !== 0) { + throw new ComposerUpdateFailedException('flarum/*', $output->getContents()); + } + + $this->events->dispatch( + new FlarumUpdated($command->actor, FlarumUpdated::MINOR) + ); + + return true; + } +} diff --git a/extensions/package-manager/src/Command/RemoveExtension.php b/extensions/package-manager/src/Command/RemoveExtension.php new file mode 100755 index 000000000..1a080a6f6 --- /dev/null +++ b/extensions/package-manager/src/Command/RemoveExtension.php @@ -0,0 +1,31 @@ +actor = $actor; + $this->extensionId = $extensionId; + } +} diff --git a/extensions/package-manager/src/Command/RemoveExtensionHandler.php b/extensions/package-manager/src/Command/RemoveExtensionHandler.php new file mode 100755 index 000000000..9b3fd229c --- /dev/null +++ b/extensions/package-manager/src/Command/RemoveExtensionHandler.php @@ -0,0 +1,70 @@ +composer = $composer; + $this->extensions = $extensions; + $this->events = $events; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + * @throws \Exception + */ + public function handle(RemoveExtension $command) + { + $command->actor->assertAdmin(); + + $extension = $this->extensions->getExtension($command->extensionId); + + if (empty($extension)) { + throw new ExtensionNotInstalledException($command->extensionId); + } + + $output = $this->composer->run( + new StringInput("remove $extension->name") + ); + + if ($output->getExitCode() !== 0) { + throw new ComposerCommandFailedException($extension->name, $output->getContents()); + } + + $this->events->dispatch( + new Removed($extension) + ); + } +} diff --git a/extensions/package-manager/src/Command/RequireExtension.php b/extensions/package-manager/src/Command/RequireExtension.php new file mode 100755 index 000000000..a073df590 --- /dev/null +++ b/extensions/package-manager/src/Command/RequireExtension.php @@ -0,0 +1,31 @@ +actor = $actor; + $this->package = $package; + } +} diff --git a/extensions/package-manager/src/Command/RequireExtensionHandler.php b/extensions/package-manager/src/Command/RequireExtensionHandler.php new file mode 100755 index 000000000..d0ed401b4 --- /dev/null +++ b/extensions/package-manager/src/Command/RequireExtensionHandler.php @@ -0,0 +1,90 @@ +composer = $composer; + $this->extensions = $extensions; + $this->validator = $validator; + $this->events = $events; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + * @throws \Exception + */ + public function handle(RequireExtension $command) + { + $command->actor->assertAdmin(); + + $this->validator->assertValid(['package' => $command->package]); + + $extensionId = ExtensionUtils::nameToId($command->package); + $extension = $this->extensions->getExtension($extensionId); + + if (! empty($extension)) { + throw new ExtensionAlreadyInstalledException($extension); + } + + $packageName = $command->package; + + // Auto append :* if not requiring a specific version. + if (strpos($packageName, ':') === false) { + $packageName .= ":*"; + } + + $output = $this->composer->run( + new StringInput("require $packageName") + ); + + if ($output->getExitCode() !== 0) { + throw new ComposerRequireFailedException($packageName, $output->getContents()); + } + + $this->events->dispatch( + new Installed($extensionId) + ); + + return ['id' => $extensionId]; + } +} diff --git a/extensions/package-manager/src/Command/UpdateExtension.php b/extensions/package-manager/src/Command/UpdateExtension.php new file mode 100755 index 000000000..6780c5fb3 --- /dev/null +++ b/extensions/package-manager/src/Command/UpdateExtension.php @@ -0,0 +1,31 @@ +actor = $actor; + $this->extensionId = $extensionId; + } +} diff --git a/extensions/package-manager/src/Command/UpdateExtensionHandler.php b/extensions/package-manager/src/Command/UpdateExtensionHandler.php new file mode 100755 index 000000000..34d143a67 --- /dev/null +++ b/extensions/package-manager/src/Command/UpdateExtensionHandler.php @@ -0,0 +1,93 @@ +composer = $composer; + $this->extensions = $extensions; + $this->validator = $validator; + $this->lastUpdateCheck = $lastUpdateCheck; + $this->events = $events; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + * @throws \Exception + */ + public function handle(UpdateExtension $command) + { + $command->actor->assertAdmin(); + + $this->validator->assertValid(['extensionId' => $command->extensionId]); + + $extension = $this->extensions->getExtension($command->extensionId); + + if (empty($extension)) { + throw new ExtensionNotInstalledException($command->extensionId); + } + + $output = $this->composer->run( + new StringInput("require $extension->name:*") + ); + + if ($output->getExitCode() !== 0) { + throw new ComposerUpdateFailedException($extension->name, $output->getContents()); + } + + $this->events->dispatch( + new Updated($command->actor, $extension) + ); + + return true; + } +} diff --git a/extensions/package-manager/src/Command/WhyNot.php b/extensions/package-manager/src/Command/WhyNot.php new file mode 100755 index 000000000..924dde4cb --- /dev/null +++ b/extensions/package-manager/src/Command/WhyNot.php @@ -0,0 +1,37 @@ +actor = $actor; + $this->package = $package; + $this->version = $version; + } +} diff --git a/extensions/package-manager/src/Command/WhyNotHandler.php b/extensions/package-manager/src/Command/WhyNotHandler.php new file mode 100755 index 000000000..a8481516a --- /dev/null +++ b/extensions/package-manager/src/Command/WhyNotHandler.php @@ -0,0 +1,65 @@ +composer = $composer; + $this->validator = $validator; + $this->events = $events; + } + + /** + * @throws \Flarum\User\Exception\PermissionDeniedException + * @throws \Exception + */ + public function handle(WhyNot $command) + { + $command->actor->assertAdmin(); + + $this->validator->assertValid([ + 'package' => $command->package, + 'version' => $command->version + ]); + + $output = $this->composer->run( + new StringInput("why-not $command->package $command->version") + ); + + if ($output->getExitCode() !== 0) { + throw new ComposerRequireFailedException($command->package, $output->getContents()); + } + + return $output->getContents(); + } +} diff --git a/extensions/package-manager/src/Composer/ComposerAdapter.php b/extensions/package-manager/src/Composer/ComposerAdapter.php new file mode 100644 index 000000000..86a116057 --- /dev/null +++ b/extensions/package-manager/src/Composer/ComposerAdapter.php @@ -0,0 +1,67 @@ +application = $application; + $this->logger = $logger; + $this->paths = $paths; + $this->output = new BufferedOutput(); + } + + public function run(InputInterface $input): ComposerOutput + { + $this->application->resetComposer(); + + // This hack is necessary so that relative path repositories are resolved properly. + $currDir = getcwd(); + chdir($this->paths->base); + $exitCode = $this->application->run($input, $this->output); + chdir($currDir); + + $outputContents = $this->output->fetch(); + + $this->logger->log($input->__toString(), $outputContents, $exitCode); + + return new ComposerOutput($exitCode, $outputContents); + } +} diff --git a/extensions/package-manager/src/Composer/ComposerJson.php b/extensions/package-manager/src/Composer/ComposerJson.php new file mode 100644 index 000000000..7e8571ff1 --- /dev/null +++ b/extensions/package-manager/src/Composer/ComposerJson.php @@ -0,0 +1,90 @@ +paths = $paths; + $this->filesystem = $filesystem; + } + + public function require(string $packageName, string $version): void + { + $composerJson = $this->get(); + + if (strpos($packageName, '*') === false) { + $composerJson['require'][$packageName] = $version; + } else { + foreach ($composerJson['require'] as $p => $v) { + if ($version === '*@dev') { + continue; + } + + $wildcardPackageName = str_replace('\*', '.*', preg_quote($packageName, '/')); + + if (Str::of($p)->test("/($wildcardPackageName)/")) { + $composerJson['require'][$p] = $version; + } + } + } + + $this->set($composerJson); + } + + public function revert(): void + { + $this->set($this->initialJson); + } + + protected function getComposerJsonPath(): string + { + return $this->paths->base . '/composer.json'; + } + + /** + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + */ + public function get(): array + { + $json = json_decode($this->filesystem->get($this->getComposerJsonPath()), true); + + if (! $this->initialJson) { + $this->initialJson = $json; + } + + return $json; + } + + protected function set(array $json): void + { + $this->filesystem->put($this->getComposerJsonPath(), json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } +} diff --git a/extensions/package-manager/src/Composer/ComposerOutput.php b/extensions/package-manager/src/Composer/ComposerOutput.php new file mode 100644 index 000000000..87719880a --- /dev/null +++ b/extensions/package-manager/src/Composer/ComposerOutput.php @@ -0,0 +1,39 @@ +exitCode = $exitCode; + $this->contents = $contents; + } + + public function getExitCode(): int + { + return $this->exitCode; + } + + public function getContents(): string + { + return $this->contents; + } +} diff --git a/extensions/package-manager/src/Event/FlarumUpdated.php b/extensions/package-manager/src/Event/FlarumUpdated.php new file mode 100644 index 000000000..108d10ab9 --- /dev/null +++ b/extensions/package-manager/src/Event/FlarumUpdated.php @@ -0,0 +1,35 @@ +actor = $actor; + $this->type = $type; + } +} diff --git a/extensions/package-manager/src/Exception/ComposerCommandFailedException.php b/extensions/package-manager/src/Exception/ComposerCommandFailedException.php new file mode 100755 index 000000000..318f1fb37 --- /dev/null +++ b/extensions/package-manager/src/Exception/ComposerCommandFailedException.php @@ -0,0 +1,42 @@ +packageName = $packageName; + + parent::__construct($output); + } + + public function guessCause(): ?string + { + return null; + } + + protected function getRawPackageName(): string + { + return preg_replace('/^([A-z0-9-_\/]+)(?::.*|)$/i', '$1', $this->packageName); + } +} diff --git a/extensions/package-manager/src/Exception/ComposerRequireFailedException.php b/extensions/package-manager/src/Exception/ComposerRequireFailedException.php new file mode 100755 index 000000000..8046ee204 --- /dev/null +++ b/extensions/package-manager/src/Exception/ComposerRequireFailedException.php @@ -0,0 +1,30 @@ +getRawPackageName(), '/'), self::INCOMPATIBLE_REGEX), + $this->getMessage(), + $matches + ); + + if ($hasMatches) { + return 'extension_incompatible_with_instance'; + } + + return null; + } +} diff --git a/extensions/package-manager/src/Exception/ComposerUpdateFailedException.php b/extensions/package-manager/src/Exception/ComposerUpdateFailedException.php new file mode 100755 index 000000000..db3bf683e --- /dev/null +++ b/extensions/package-manager/src/Exception/ComposerUpdateFailedException.php @@ -0,0 +1,15 @@ +withDetails($this->errorDetails($e)); + } + + protected function errorDetails(ComposerCommandFailedException $e): array + { + $details = []; + + if ($guessedCause = $this->guessCause($e)) { + $details['guessed_cause'] = $guessedCause; + } + + if (! empty($e->details)) { + $details = array_merge($details, $e->details); + } + + return [$details]; + } + + protected function guessCause(ComposerCommandFailedException $e): ?string + { + return $e->guessCause(); + } +} diff --git a/extensions/package-manager/src/Exception/ExtensionAlreadyInstalledException.php b/extensions/package-manager/src/Exception/ExtensionAlreadyInstalledException.php new file mode 100755 index 000000000..90ef8c881 --- /dev/null +++ b/extensions/package-manager/src/Exception/ExtensionAlreadyInstalledException.php @@ -0,0 +1,27 @@ +getTitle()} is already installed."); + } + + public function getType(): string + { + return 'extension_already_installed'; + } +} diff --git a/extensions/package-manager/src/Exception/ExtensionNotInstalledException.php b/extensions/package-manager/src/Exception/ExtensionNotInstalledException.php new file mode 100755 index 000000000..9b24a4a58 --- /dev/null +++ b/extensions/package-manager/src/Exception/ExtensionNotInstalledException.php @@ -0,0 +1,26 @@ +[A-z0-9\/-]+) [A-z0-9.-_\/]+ requires flarum\/core (?(?:[A-z0-9.><=_ -](?!->))+)/m'; + + /** + * @var string + */ + private $majorVersion; + + public function __construct(string $packageName, string $output, string $majorVersion) + { + $this->majorVersion = $majorVersion; + + parent::__construct($packageName, $output); + } + + public function guessCause(): ?string + { + if (preg_match_all(self::INCOMPATIBLE_REGEX, $this->getMessage(), $matches) !== false) { + $this->details['incompatible_extensions'] = []; + + foreach ($matches['ext'] as $k => $name) { + if (! Semver::satisfies($this->majorVersion, $matches['coreReq'][$k])) { + $this->details['incompatible_extensions'][] = $name; + } + } + + resolve(LastUpdateRun::class) + ->for(FlarumUpdated::MAJOR) + ->with('status', LastUpdateRun::FAILURE) + ->with('incompatibleExtensions', $this->details['incompatible_extensions']) + ->save(); + + return 'extensions_incompatible_with_new_major'; + } + + return null; + } +} diff --git a/extensions/package-manager/src/Exception/NoNewMajorVersionException.php b/extensions/package-manager/src/Exception/NoNewMajorVersionException.php new file mode 100755 index 000000000..b209a72d6 --- /dev/null +++ b/extensions/package-manager/src/Exception/NoNewMajorVersionException.php @@ -0,0 +1,26 @@ +extensionId = $extensionId; + } +} diff --git a/extensions/package-manager/src/Extension/Event/Removed.php b/extensions/package-manager/src/Extension/Event/Removed.php new file mode 100755 index 000000000..369453980 --- /dev/null +++ b/extensions/package-manager/src/Extension/Event/Removed.php @@ -0,0 +1,25 @@ +extension = $extension; + } +} diff --git a/extensions/package-manager/src/Extension/Event/Updated.php b/extensions/package-manager/src/Extension/Event/Updated.php new file mode 100755 index 000000000..61c9e55ec --- /dev/null +++ b/extensions/package-manager/src/Extension/Event/Updated.php @@ -0,0 +1,32 @@ +actor = $actor; + $this->extension = $extension; + } +} diff --git a/extensions/package-manager/src/Extension/ExtensionUtils.php b/extensions/package-manager/src/Extension/ExtensionUtils.php new file mode 100755 index 000000000..20be349e2 --- /dev/null +++ b/extensions/package-manager/src/Extension/ExtensionUtils.php @@ -0,0 +1,21 @@ +clearCache = $clearCache; + $this->publishAssets = $publishAssets; + $this->migrate = $migrate; + } + + /** + * @throws \Exception + */ + public function handle(FlarumUpdated $event): void + { + $this->clearCache->run(new ArrayInput([]), new NullOutput()); + $this->migrate->run(new ArrayInput([]), new NullOutput()); + $this->publishAssets->run(new ArrayInput([]), new NullOutput()); + } +} diff --git a/extensions/package-manager/src/Listener/ReCheckForUpdates.php b/extensions/package-manager/src/Listener/ReCheckForUpdates.php new file mode 100644 index 000000000..dfb60dca1 --- /dev/null +++ b/extensions/package-manager/src/Listener/ReCheckForUpdates.php @@ -0,0 +1,68 @@ +lastUpdateRun = $lastUpdateRun; + $this->lastUpdateCheck = $lastUpdateCheck; + $this->bus = $bus; + } + + /** + * @param FlarumUpdated|Updated $event + */ + public function handle($event): void + { + $previousUpdateCheck = $this->lastUpdateCheck->get(); + + $lastUpdateCheck = $this->bus->dispatch( + new CheckForUpdates($event->actor) + ); + + if ($event instanceof FlarumUpdated) { + $mapPackageName = function (array $package) { + return $package['name']; + }; + + $previousPackages = array_map($mapPackageName, $previousUpdateCheck['updates']['installed']); + $lastPackages = array_map($mapPackageName, $lastUpdateCheck['updates']['installed']); + + $this->lastUpdateRun + ->for($event->type) + ->with('status', LastUpdateRun::SUCCESS) + ->with('limitedPackages', array_intersect($previousPackages, $lastPackages)) + ->save(); + } + } +} diff --git a/extensions/package-manager/src/OutputLogger.php b/extensions/package-manager/src/OutputLogger.php new file mode 100644 index 000000000..6442d05d8 --- /dev/null +++ b/extensions/package-manager/src/OutputLogger.php @@ -0,0 +1,36 @@ +logger = $logger; + } + + public function log(string $input, string $output, int $exitCode): void + { + $content = "$input\n$output"; + + if ($exitCode === 0) { + $this->logger->info($content); + } else { + $this->logger->error($content); + } + } +} diff --git a/extensions/package-manager/src/PackageManagerServiceProvider.php b/extensions/package-manager/src/PackageManagerServiceProvider.php new file mode 100755 index 000000000..9b007a8ab --- /dev/null +++ b/extensions/package-manager/src/PackageManagerServiceProvider.php @@ -0,0 +1,97 @@ +container->singleton(ComposerAdapter::class, function (Container $container) { + // This should only ever be resolved when running composer commands, + // because we modify other environment configurations. + $composer = new Application(); + $composer->setAutoExit(false); + + /** @var Paths $paths */ + $paths = $container->make(Paths::class); + + putenv("COMPOSER_HOME={$paths->storage}/.composer"); + putenv("COMPOSER={$paths->base}/composer.json"); + putenv("COMPOSER_DISABLE_XDEBUG_WARN=1"); + Config::$defaultConfig['vendor-dir'] = $paths->vendor; + + // When running simple require, update and remove commands on packages, + // composer 2 doesn't really need this much unless the extensions are very loaded dependency wise, + // but this is necessary for running flarum updates. + @ini_set('memory_limit', '1G'); + @set_time_limit(5 * 60); + + return new ComposerAdapter($composer, $container->make(OutputLogger::class), $container->make(Paths::class)); + }); + + $this->container->alias(ComposerAdapter::class, 'flarum.composer'); + + $this->container->singleton(OutputLogger::class, function (Container $container) { + $logPath = $container->make(Paths::class)->storage.'/logs/composer/output.log'; + $handler = new RotatingFileHandler($logPath, Logger::INFO); + $handler->setFormatter(new LineFormatter(null, null, true, true)); + + $logger = new Logger('composer', [$handler]); + + return new OutputLogger($logger); + }); + } + + public function boot(Container $container) + { + /** @var Dispatcher $events */ + $events = $container->make('events'); + + $events->listen( + [Updated::class], + function (Updated $event) use ($container) { + /** @var ExtensionManager $extensions */ + $extensions = $container->make(ExtensionManager::class); + + if ($extensions->isEnabled($event->extension->getId())) { + $recompile = new RecompileFrontendAssets( + $container->make('flarum.assets.forum'), + $container->make(LocaleManager::class) + ); + $recompile->flush(); + + $extensions->migrate($event->extension); + $event->extension->copyAssetsTo($container->make('filesystem')->disk('flarum-assets')); + } + } + ); + + $events->listen(FlarumUpdated::class, ClearCacheAfterUpdate::class); + $events->listen([FlarumUpdated::class, Updated::class], ReCheckForUpdates::class); + } +} diff --git a/extensions/package-manager/src/RequirePackageValidator.php b/extensions/package-manager/src/RequirePackageValidator.php new file mode 100755 index 000000000..51fedf355 --- /dev/null +++ b/extensions/package-manager/src/RequirePackageValidator.php @@ -0,0 +1,24 @@ +=<_]+){0,1}$/i'; + + /** + * {@inheritdoc} + */ + protected $rules = [ + 'package' => ['required', 'string', 'regex:'.self::PACKAGE_NAME_REGEX] + ]; +} diff --git a/extensions/package-manager/src/Settings/JsonSetting.php b/extensions/package-manager/src/Settings/JsonSetting.php new file mode 100644 index 000000000..834ab780d --- /dev/null +++ b/extensions/package-manager/src/Settings/JsonSetting.php @@ -0,0 +1,23 @@ +settings = $settings; + } + + public function with(string $key, $value): JsonSetting + { + $this->data[$key] = $value; + + return $this; + } + + public function save(): array + { + $lastUpdateCheck = [ + 'checkedAt' => Carbon::now(), + 'updates' => $this->data, + ]; + + $this->settings->set($this->key(), json_encode($lastUpdateCheck)); + + return $lastUpdateCheck; + } + + public function get(): array + { + return json_decode($this->settings->get($this->key()), true); + } + + public static function key(): string + { + return 'flarum-package-manager.last_update_check'; + } + + public static function default(): array + { + return [ + 'checkedAt' => null, + 'updates' => [ + 'installed' => [], + ], + ]; + } + + public function getNewMajorVersion(): ?string + { + $core = Arr::first(Arr::get($this->get(), 'updates.installed', []), function ($package) { + return $package['name'] === 'flarum/core'; + }); + + return $core ? $core['latest-major'] : null; + } +} diff --git a/extensions/package-manager/src/Settings/LastUpdateRun.php b/extensions/package-manager/src/Settings/LastUpdateRun.php new file mode 100644 index 000000000..7a6750946 --- /dev/null +++ b/extensions/package-manager/src/Settings/LastUpdateRun.php @@ -0,0 +1,97 @@ +settings = $settings; + $this->data = self::default(); + } + + public function for(string $update): self + { + if (! in_array($update, [FlarumUpdated::MAJOR, FlarumUpdated::MINOR, FlarumUpdated::GLOBAL])) { + throw new \InvalidArgumentException("Last update runs can only be for one of: minor, major, global"); + } + + $this->activeUpdate = $update; + + return $this; + } + + public function with(string $key, $value): JsonSetting + { + $this->data[$this->activeUpdate][$key] = $value; + + return $this; + } + + public function save(): array + { + $this->data[$this->activeUpdate]['ranAt'] = Carbon::now(); + + $this->settings->set(self::key(), json_encode($this->data)); + + return $this->data; + } + + public function get(): array + { + $lastUpdateRun = json_decode($this->settings->get(self::key()), true); + + if ($this->activeUpdate) { + return $lastUpdateRun[$this->activeUpdate]; + } + + return $lastUpdateRun; + } + + public static function key(): string + { + return 'flarum-package-manager.last_update_run'; + } + + public static function default(): array + { + $defaultState = [ + 'ranAt' => null, + 'status' => null, + 'limitedPackages' => [], + 'incompatibleExtensions' => [], + ]; + + return [ + FlarumUpdated::GLOBAL => $defaultState, + FlarumUpdated::MINOR => $defaultState, + FlarumUpdated::MAJOR => $defaultState, + ]; + } +} diff --git a/extensions/package-manager/src/UpdateExtensionValidator.php b/extensions/package-manager/src/UpdateExtensionValidator.php new file mode 100755 index 000000000..84f817f4d --- /dev/null +++ b/extensions/package-manager/src/UpdateExtensionValidator.php @@ -0,0 +1,22 @@ + 'required|string' + ]; +} diff --git a/extensions/package-manager/src/WhyNotValidator.php b/extensions/package-manager/src/WhyNotValidator.php new file mode 100644 index 000000000..ee5b2ef0e --- /dev/null +++ b/extensions/package-manager/src/WhyNotValidator.php @@ -0,0 +1,23 @@ + ['required', 'string', 'regex:'.RequirePackageValidator::PACKAGE_NAME_REGEX], + 'version' => ['sometimes', 'string', 'regex:/(?:\*|[A-z0-9.-]+)/i'] + ]; +} diff --git a/extensions/package-manager/tests/fixtures/.gitkeep b/extensions/package-manager/tests/fixtures/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/extensions/package-manager/tests/integration/ChangeComposerConfig.php b/extensions/package-manager/tests/integration/ChangeComposerConfig.php new file mode 100644 index 000000000..d7b452380 --- /dev/null +++ b/extensions/package-manager/tests/integration/ChangeComposerConfig.php @@ -0,0 +1,14 @@ +run(); + + $this->composer('install'); + } +} diff --git a/extensions/package-manager/tests/integration/DummyExtensions.php b/extensions/package-manager/tests/integration/DummyExtensions.php new file mode 100644 index 000000000..c5c48f75b --- /dev/null +++ b/extensions/package-manager/tests/integration/DummyExtensions.php @@ -0,0 +1,32 @@ +tmpDir() . "/packages/" . str_replace('/', '-', $name); + + if (! file_exists($dirName)) { + mkdir($dirName); + } + + file_put_contents($dirName."/composer.json", json_encode([ + 'name' => $name, + 'version' => '1.0.0', + 'require' => [ + 'flarum/core' => $coreVersions + ], + ], JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); + } +} diff --git a/extensions/package-manager/tests/integration/RefreshComposerSetup.php b/extensions/package-manager/tests/integration/RefreshComposerSetup.php new file mode 100644 index 000000000..3e4262d53 --- /dev/null +++ b/extensions/package-manager/tests/integration/RefreshComposerSetup.php @@ -0,0 +1,55 @@ +tmpDir().'/composer.lock'); + + $this->deleteDummyExtensions(); + + $composerSetup->run(); + + $this->composer('install'); + + parent::tearDown(); + } + + private function deleteDummyExtensions(): void + { + $dir = $this->tmpDir().'/packages'; + + $it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); + $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); + + foreach($files as $file) { + if ($file->isDir()){ + rmdir($file->getRealPath()); + } else { + unlink($file->getRealPath()); + } + } + + rmdir($dir); + } + + protected function forgetComposerApp(): void + { + $this->app()->getContainer()->instance(ComposerAdapter::class, null); + } +} diff --git a/extensions/package-manager/tests/integration/SetupComposer.php b/extensions/package-manager/tests/integration/SetupComposer.php new file mode 100644 index 000000000..9a1080ce4 --- /dev/null +++ b/extensions/package-manager/tests/integration/SetupComposer.php @@ -0,0 +1,57 @@ + [ + 'flarum/core' => '1.0.0', + 'flarum/tags' => '1.0.3', + 'flarum/lang-english' => '*', + ], + 'config' => [ + 'preferred-install' => 'dist', + 'sort-packages' => true, + ], + 'repositories' => [ + [ + 'type' => 'path', + 'url' => __DIR__.'/tmp/packages/*', + ] + ] + ]; + + public function __construct(array $config = null) + { + $this->config = array_merge($this->config, $config ?? []); + } + + public function run() + { + $composerJson = $this->tmpDir().'/composer.json'; + $composerLock = $this->tmpDir().'/composer.lock'; + $packages = $this->tmpDir().'/packages'; + + file_put_contents($composerJson, json_encode($this->config, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); + + if (! file_exists($packages)) { + mkdir($packages); + } + + if (file_exists($composerLock)) { + unlink($composerLock); + } + } +} diff --git a/extensions/package-manager/tests/integration/TestCase.php b/extensions/package-manager/tests/integration/TestCase.php new file mode 100644 index 000000000..609f575f7 --- /dev/null +++ b/extensions/package-manager/tests/integration/TestCase.php @@ -0,0 +1,99 @@ +extension('flarum-package-manager', 'flarum-tags'); + + $tmp = realpath($this->tmpDir()); + + $this->app()->getContainer()->instance('flarum.paths', new Paths([ + 'base' => $tmp, + 'public' => "$tmp/public", + 'storage' => "$tmp/storage", + 'vendor' => "$tmp/vendor", + ])); + } + + protected function assertExtension(string $id, bool $exists) + { + $installed = json_decode(file_get_contents($this->app()->getContainer()->make(Paths::class)->vendor.'/composer/installed.json'), true); + $installedExtensions = Arr::where($installed['packages'] ?? $installed, function (array $package) { + return $package['type'] === 'flarum-extension'; + }); + $installedExtensionIds = array_map(function (string $name) { + return ExtensionUtils::nameToId($name); + }, Arr::pluck($installedExtensions, 'name')); + + if ($exists) { + $this->assertTrue(in_array($id, $installedExtensionIds), "Failed asserting that extension $id is installed"); + } else { + $this->assertFalse(in_array($id, $installedExtensionIds), "Failed asserting that extension $id is not installed"); + } + } + + protected function assertExtensionExists(string $id) + { + $this->assertExtension($id, true); + } + + protected function assertExtensionNotExists(string $id) + { + $this->assertExtension($id, false); + } + + protected function assertPackageVersion(string $packageName, string $version) + { + $composerJson = $this->app()->getContainer()->make(ComposerJson::class)->get(); + + $this->assertArrayHasKey($packageName, $composerJson['require'], "$packageName is not required."); + $this->assertEquals($version, $composerJson['require'][$packageName], "Expected $packageName to be $version, found {$composerJson['require'][$packageName]} instead."); + } + + protected function requireExtension(string $package) + { + $this->composer("require $package"); + } + + protected function removeExtension(string $package) + { + $this->composer("remove $package"); + } + + protected function composer(string $command): void + { + /** @var ComposerAdapter $composer */ + $composer = $this->app()->getContainer()->make(ComposerAdapter::class); + $composer->run(new StringInput($command)); + } + + protected function errorDetails(ResponseInterface $response): array + { + $json = json_decode((string) $response->getBody(), true); + + return $json['errors'] ? ($json['errors'][0] ?? []) : []; + } +} diff --git a/extensions/package-manager/tests/integration/api/CheckForUpdatesTest.php b/extensions/package-manager/tests/integration/api/CheckForUpdatesTest.php new file mode 100644 index 000000000..bd667f476 --- /dev/null +++ b/extensions/package-manager/tests/integration/api/CheckForUpdatesTest.php @@ -0,0 +1,42 @@ +setComposerConfig([ + 'require' => [ + 'flarum/core' => '^1.0.0', + 'flarum/tags' => '1.0.0', + ] + ]); + + $response = $this->send( + $this->request('POST', '/api/package-manager/check-for-updates', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals(['flarum/tags'], Arr::pluck(json_decode((string) $response->getBody(), true)['updates']['installed'], 'name')); + } +} diff --git a/extensions/package-manager/tests/integration/api/GlobalUpdateTest.php b/extensions/package-manager/tests/integration/api/GlobalUpdateTest.php new file mode 100644 index 000000000..84e335e49 --- /dev/null +++ b/extensions/package-manager/tests/integration/api/GlobalUpdateTest.php @@ -0,0 +1,32 @@ +send( + $this->request('POST', '/api/package-manager/global-update', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + } +} diff --git a/extensions/package-manager/tests/integration/api/MajorUpdateTest.php b/extensions/package-manager/tests/integration/api/MajorUpdateTest.php new file mode 100644 index 000000000..bd5cdc8ac --- /dev/null +++ b/extensions/package-manager/tests/integration/api/MajorUpdateTest.php @@ -0,0 +1,127 @@ +makeDummyExtensionCompatibleWith("flarum/dummy-incompatible-extension", ">=0.1.0-beta.15 <=0.1.0-beta.16"); + $this->setComposerConfig([ + 'require' => [ + 'flarum/core' => '^0.1.0-beta.15', + 'flarum/tags' => '^0.1.0-beta.15', + 'flarum/dummy-incompatible-extension' => '^1.0.0' + ], + 'minimum-stability' => 'beta', + ]); + + $response = $this->send( + $this->request('POST', '/api/package-manager/major-update', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + $this->assertEquals('no_new_major_version', $this->errorDetails($response)['code']); + } + + /** + * @test + */ + public function can_update_when_major_update_available() + { + $this->makeDummyExtensionCompatibleWith("flarum/dummy-compatible-extension", "^0.1.0-beta.15 | ^1.0.0"); + $this->setComposerConfig([ + 'require' => [ + 'flarum/core' => '^0.1.0-beta.15', + 'flarum/tags' => '^0.1.0-beta.15', + 'flarum/dummy-compatible-extension' => '^1.0.0' + ], + 'minimum-stability' => 'beta', + ]); + + $lastUpdateCheck = $this->send( + $this->request('POST', '/api/package-manager/check-for-updates', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->forgetComposerApp(); + + $response = $this->send( + $this->request('POST', '/api/package-manager/major-update', [ + 'authenticatedAs' => 1, + ]) + ); + + $newMinorCoreVersion = array_filter( + json_decode((string) $lastUpdateCheck->getBody(), true)['updates']['installed'], + function ($package) { + return $package['name'] === 'flarum/core'; + } + )[0]['latest-major']; + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertPackageVersion("flarum/core", str_replace('v', '^', $newMinorCoreVersion)); + $this->assertPackageVersion("flarum/tags", "*"); + $this->assertPackageVersion("flarum/dummy-compatible-extension", "*"); + } + + /** + * @test + */ + public function cannot_update_with_incompatible_extensions() + { + $this->makeDummyExtensionCompatibleWith("flarum/dummy-incompatible-extension-a", ">=0.1.0-beta.16 <0.1.0-beta.17"); + $this->makeDummyExtensionCompatibleWith("flarum/dummy-incompatible-extension-b", ">=0.1.0-beta.16 <=0.1.0-beta.17"); + $this->makeDummyExtensionCompatibleWith("flarum/dummy-incompatible-extension-c", "0.1.0-beta.16"); + $this->setComposerConfig([ + 'require' => [ + 'flarum/core' => '^0.1.0-beta.16', + 'flarum/tags' => '^0.1.0-beta.16', + 'flarum/dummy-incompatible-extension-a' => '^1.0.0', + 'flarum/dummy-incompatible-extension-b' => '^1.0.0', + 'flarum/dummy-incompatible-extension-c' => '^1.0.0', + ], + 'minimum-stability' => 'beta', + ]); + + $this->send( + $this->request('POST', '/api/package-manager/check-for-updates', [ + 'authenticatedAs' => 1, + ]) + ); + + $response = $this->send( + $this->request('POST', '/api/package-manager/major-update', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + $this->assertEquals('extensions_incompatible_with_new_major', $this->errorDetails($response)['guessed_cause']); + $this->assertEquals([ + 'flarum/dummy-incompatible-extension-a', + 'flarum/dummy-incompatible-extension-b', + 'flarum/dummy-incompatible-extension-c' + ], $this->errorDetails($response)['incompatible_extensions']); + } +} diff --git a/extensions/package-manager/tests/integration/api/MinorUpdateTest.php b/extensions/package-manager/tests/integration/api/MinorUpdateTest.php new file mode 100644 index 000000000..4321b4851 --- /dev/null +++ b/extensions/package-manager/tests/integration/api/MinorUpdateTest.php @@ -0,0 +1,95 @@ +makeDummyExtensionCompatibleWith("flarum/dummy-compatible-extension", "^1.0.0"); + $this->setComposerConfig([ + 'require' => [ + // The only reason we don't set this to `^1.0.0` and let it update to latest minor, + // is because migrations that run DDL queries might be introduced in future versions, + // therefore breaking the test transaction. + 'flarum/core' => '>=1.0.0 <= 1.1.0', + // We leave tags fixed to a version, + // the update handler must be able to set it to `*`. + 'flarum/tags' => '1.0.3', + 'flarum/lang-english' => '*', + 'flarum/dummy-compatible-extension' => '^1.0.0' + ] + ]); + + $response = $this->send( + $this->request('POST', '/api/package-manager/minor-update', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertPackageVersion('flarum/tags', '*'); + $this->assertPackageVersion('flarum/dummy-compatible-extension', '*'); + } + + /** + * @test + */ + public function can_update_with_latest_ext_incompatible_with_latest_core() + { + $this->makeDummyExtensionCompatibleWith("flarum/dummy-extension", "1.0.0"); + $this->setComposerConfig([ + 'require' => [ + 'flarum/core' => '>=1.0.0 <=1.1.0', + 'flarum/tags' => '1.0.3', + 'flarum/lang-english' => '*', + 'flarum/dummy-extension' => '^1.0.0' + ] + ]); + + $this->send( + $this->request('POST', '/api/package-manager/check-for-updates', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->forgetComposerApp(); + + $response = $this->send( + $this->request('POST', '/api/package-manager/minor-update', [ + 'authenticatedAs' => 1, + ]) + ); + + /** @var LastUpdateRun $lastUpdateRun */ + $lastUpdateRun = $this->app()->getContainer()->make(LastUpdateRun::class); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertPackageVersion("flarum/tags", "*"); + $this->assertPackageVersion("flarum/dummy-extension", "*"); + $this->assertEquals([ + 'flarum/core', + 'flarum/lang-english', + 'flarum/tags' + ], $lastUpdateRun->for(FlarumUpdated::MINOR)->get()['limitedPackages']); + } +} diff --git a/extensions/package-manager/tests/integration/api/extensions/RemoveExtensionTest.php b/extensions/package-manager/tests/integration/api/extensions/RemoveExtensionTest.php new file mode 100644 index 000000000..d13f494df --- /dev/null +++ b/extensions/package-manager/tests/integration/api/extensions/RemoveExtensionTest.php @@ -0,0 +1,55 @@ +assertExtensionExists('flarum-tags'); + } + + /** + * @test + */ + public function removing_an_extension_works() + { + $response = $this->send( + $this->request('DELETE', '/api/package-manager/extensions/flarum-tags', [ + 'authenticatedAs' => 1 + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertExtensionNotExists('flarum-tags'); + } + + /** + * @test + */ + public function removing_a_non_existant_extension_fails() + { + $response = $this->send( + $this->request('DELETE', '/api/package-manager/extensions/flarum-potato', [ + 'authenticatedAs' => 1 + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + } +} diff --git a/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php b/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php new file mode 100644 index 000000000..2da97b62e --- /dev/null +++ b/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php @@ -0,0 +1,125 @@ +assertExtensionNotExists('v17development-blog'); + } + + /** + * @test + */ + public function requiring_an_existing_extension_fails() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'flarum/tags' + ] + ] + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + } + + /** + * @test + */ + public function requiring_a_compatible_extension_works() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'v17development/flarum-blog' + ] + ] + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertExtensionExists('v17development-blog'); + } + + /** + * @test + */ + public function requiring_a_compatible_extension_with_specific_version_works() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'v17development/flarum-blog:0.4.0' + ] + ] + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertExtensionExists('v17development-blog'); + } + + /** + * @test + */ + public function requiring_an_uncompatible_extension_fails() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'flarum/auth-github' + ] + ] + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + $this->assertEquals('extension_incompatible_with_instance', $this->errorDetails($response)['guessed_cause']); + } + + /** + * @test + */ + public function requiring_an_uncompatible_extension_with_specific_version_fails() + { + $response = $this->send( + $this->request('POST', '/api/package-manager/extensions', [ + 'authenticatedAs' => 1, + 'json' => [ + 'data' => [ + 'package' => 'flarum/auth-github:0.1.0-beta.9' + ] + ] + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + $this->assertEquals('extension_incompatible_with_instance', $this->errorDetails($response)['guessed_cause']); + } +} diff --git a/extensions/package-manager/tests/integration/api/extensions/UpdateExtensionTest.php b/extensions/package-manager/tests/integration/api/extensions/UpdateExtensionTest.php new file mode 100644 index 000000000..b40c18efc --- /dev/null +++ b/extensions/package-manager/tests/integration/api/extensions/UpdateExtensionTest.php @@ -0,0 +1,55 @@ +assertExtensionExists('flarum-tags'); + } + + /** + * @test + */ + public function updating_an_existing_extension_works() + { + $response = $this->send( + $this->request('PATCH', '/api/package-manager/extensions/flarum-tags', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertExtensionExists('flarum-tags'); + } + + /** + * @test + */ + public function updating_a_non_existing_extension_fails() + { + $response = $this->send( + $this->request('PATCH', '/api/package-manager/extensions/flarum-potato', [ + 'authenticatedAs' => 1, + ]) + ); + + $this->assertEquals(409, $response->getStatusCode()); + } +} diff --git a/extensions/package-manager/tests/integration/setup.php b/extensions/package-manager/tests/integration/setup.php new file mode 100644 index 000000000..b740c090b --- /dev/null +++ b/extensions/package-manager/tests/integration/setup.php @@ -0,0 +1,21 @@ +run(); + +$setupComposer = new SetupComposer(); + +$setupComposer->run(); diff --git a/extensions/package-manager/tests/phpunit.integration.xml b/extensions/package-manager/tests/phpunit.integration.xml new file mode 100644 index 000000000..2d2b64c39 --- /dev/null +++ b/extensions/package-manager/tests/phpunit.integration.xml @@ -0,0 +1,28 @@ + + + + + ../src/ + + + + + ./integration + ./integration/tmp + + + + + + diff --git a/extensions/package-manager/tests/phpunit.unit.xml b/extensions/package-manager/tests/phpunit.unit.xml new file mode 100644 index 000000000..d3a4a3e3d --- /dev/null +++ b/extensions/package-manager/tests/phpunit.unit.xml @@ -0,0 +1,27 @@ + + + + + ../src/ + + + + + ./unit + + + + + + diff --git a/extensions/package-manager/tests/unit/.gitkeep b/extensions/package-manager/tests/unit/.gitkeep new file mode 100644 index 000000000..e69de29bb