From a9ff884231552c830122f895ad14f7d5dbbbda20 Mon Sep 17 00:00:00 2001 From: Sami Mazouz Date: Mon, 8 Nov 2021 20:22:07 +0100 Subject: [PATCH] Extension Tests (#9) --- extensions/package-manager/.gitattributes | 5 + .../.github/workflows/test.yml | 1 + extensions/package-manager/composer.json | 3 +- extensions/package-manager/js/dist/admin.js | 1001 +---------------- .../package-manager/js/dist/admin.js.map | 2 +- .../ComposerCommandFailedExceptionHandler.php | 2 +- .../package-manager/tests/fixtures/.gitkeep | 0 .../integration/RefreshComposerSetup.php | 18 + .../tests/integration/SetupComposer.php | 34 + .../tests/integration/TestCase.php | 96 ++ .../api/extensions/RemoveExtensionTest.php | 55 + .../api/extensions/RequireExtensionTest.php | 85 ++ .../api/extensions/UpdateExtensionTest.php | 55 + .../tests/integration/setup.php | 21 + .../tests/phpunit.integration.xml | 27 + .../package-manager/tests/phpunit.unit.xml | 27 + .../package-manager/tests/unit/.gitkeep | 0 17 files changed, 429 insertions(+), 1003 deletions(-) create mode 100644 extensions/package-manager/.gitattributes create mode 100644 extensions/package-manager/tests/fixtures/.gitkeep create mode 100644 extensions/package-manager/tests/integration/RefreshComposerSetup.php create mode 100644 extensions/package-manager/tests/integration/SetupComposer.php create mode 100644 extensions/package-manager/tests/integration/TestCase.php create mode 100644 extensions/package-manager/tests/integration/api/extensions/RemoveExtensionTest.php create mode 100644 extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php create mode 100644 extensions/package-manager/tests/integration/api/extensions/UpdateExtensionTest.php create mode 100644 extensions/package-manager/tests/integration/setup.php create mode 100644 extensions/package-manager/tests/phpunit.integration.xml create mode 100644 extensions/package-manager/tests/phpunit.unit.xml create mode 100644 extensions/package-manager/tests/unit/.gitkeep diff --git a/extensions/package-manager/.gitattributes b/extensions/package-manager/.gitattributes new file mode 100644 index 000000000..67d307d04 --- /dev/null +++ b/extensions/package-manager/.gitattributes @@ -0,0 +1,5 @@ +js/src export-ignore +.git* export-ignore + +js/dist/*.js -diff +tests/* diff --git a/extensions/package-manager/.github/workflows/test.yml b/extensions/package-manager/.github/workflows/test.yml index d3cfc5a82..3f30e72bb 100755 --- a/extensions/package-manager/.github/workflows/test.yml +++ b/extensions/package-manager/.github/workflows/test.yml @@ -71,6 +71,7 @@ jobs: DB_PORT: 13306 DB_PASSWORD: root DB_PREFIX: ${{ matrix.prefix }} + FLARUM_TEST_TMP_DIR_LOCAL: tests/tmp - name: Run Composer tests run: composer test diff --git a/extensions/package-manager/composer.json b/extensions/package-manager/composer.json index d747d9be9..fc260867d 100755 --- a/extensions/package-manager/composer.json +++ b/extensions/package-manager/composer.json @@ -22,7 +22,8 @@ "composer/composer": "^2.0" }, "require-dev": { - "flarum/testing": "^1.0.0" + "flarum/testing": "^1.0.0", + "flarum/tags": "*" }, "extra": { "flarum-extension": { diff --git a/extensions/package-manager/js/dist/admin.js b/extensions/package-manager/js/dist/admin.js index f17a14182..d0f139ff4 100755 --- a/extensions/package-manager/js/dist/admin.js +++ b/extensions/package-manager/js/dist/admin.js @@ -1,1001 +1,2 @@ -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.js"); -/* empty/unused harmony star reexport */ - -/***/ }), - -/***/ "./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/ComposerFailureModal.tsx": -/*!*******************************************************!*\ - !*** ./src/admin/components/ComposerFailureModal.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 ComposerFailureModal; }); -/* 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__); - - - - -var ComposerFailureModal = /*#__PURE__*/function (_Modal) { - Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(ComposerFailureModal, _Modal); - - function ComposerFailureModal() { - return _Modal.apply(this, arguments) || this; - } - - var _proto = ComposerFailureModal.prototype; - - _proto.oninit = function oninit(vnode) { - _Modal.prototype.oninit.call(this, vnode); - - if (this.attrs.error.guessed_cause) { - this.alertAttrs = { - type: 'error', - content: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans("sycho-package-manager.admin.failure_modal.guessed_cause." + this.attrs.error.guessed_cause) - }; - } - }; - - _proto.className = function className() { - return 'Modal--large ComposerFailureModal'; - }; - - _proto.title = function title() { - return flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.failure_modal.title'); - }; - - _proto.content = function content() { - return m("div", { - className: "Modal-body" - }, m("details", null, m("summary", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.failure_modal.show_composer_output')), m("pre", { - className: "ComposerFailureModal-output" - }, this.attrs.error.output))); - }; - - return ComposerFailureModal; -}(flarum_common_components_Modal__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('sycho-package-manager.admin.extensions.install')), m("p", { - className: "helpText" - }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-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('sycho-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('sycho-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"); - - - - - - - - -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; - return _this; - } - - var _proto = MajorUpdater.prototype; - - _proto.view = function view(vnode) { - return m("div", { - className: "Form-group PackageManager-majorUpdate" - }, m("img", { - alt: "flarum logo", - src: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('baseUrl') + '/assets/extensions/sycho-package-manager/flarum.svg' - }), m("label", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-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('sycho-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('sycho-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('sycho-package-manager.admin.major_updater.dry_run'))), m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, { - className: "Button", - icon: "fas fa-play", - onclick: this.update.bind(this, false) - }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.major_updater.update')))); - }; - - _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('sycho-package-manager.admin.update_successful')); - window.location.reload(); - })["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_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_helpers_icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! flarum/common/helpers/icon */ "flarum/common/helpers/icon"); -/* harmony import */ var flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_icon__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 flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! flarum/common/components/Tooltip */ "flarum/common/components/Tooltip"); -/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var _utils_errorHandler__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/errorHandler */ "./src/admin/utils/errorHandler.ts"); -/* harmony import */ var flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! flarum/common/utils/classList */ "flarum/common/utils/classList"); -/* harmony import */ var flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! flarum/common/components/LoadingIndicator */ "flarum/common/components/LoadingIndicator"); -/* harmony import */ var flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_10__); -/* harmony import */ var _MajorUpdater__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./MajorUpdater */ "./src/admin/components/MajorUpdater.tsx"); - - - - - - - - - - - - - -var Updater = /*#__PURE__*/function (_Component) { - Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["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.lastUpdateCheck = flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.lastUpdateCheck || {}; - 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 = null; - - if (coreUpdate) { - core = { - title: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.flarum'), - version: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.settings.version, - icon: { - backgroundImage: "url(" + flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('baseUrl') + "/assets/extensions/sycho-package-manager/flarum.svg" - }, - newPackageUpdate: coreUpdate - }; - } - - return [m("div", { - className: "Form-group" - }, m("label", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.updater_title')), m("p", { - className: "helpText" - }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.updater_help')), Object.keys(this.lastUpdateCheck).length ? m("p", { - className: "PackageManager-lastUpdatedAt" - }, m("span", { - className: "PackageManager-lastUpdatedAt-label" - }, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-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 = this.lastUpdateCheck) == null ? void 0 : _this$lastUpdateCheck.checkedAt))) : null, 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_1___default.a.translator.trans('sycho-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_1___default.a.translator.trans('sycho-package-manager.admin.updater.run_global_update'))), this.isLoading !== null ? m("div", { - className: "PackageManager-extensions" - }, m(flarum_common_components_LoadingIndicator__WEBPACK_IMPORTED_MODULE_10___default.a, null)) : extensions.length || core ? m("div", { - className: "PackageManager-extensions" - }, m("div", { - className: "PackageManager-extensions-grid" - }, core ? this.extensionItem(core, true) : null, extensions.map(function (extension) { - return _this2.extensionItem(extension); - }))) : null), coreUpdate && coreUpdate['latest-major'] ? m(_MajorUpdater__WEBPACK_IMPORTED_MODULE_11__["default"], { - coreUpdate: coreUpdate - }) : null]; - }; - - _proto.extensionItem = function extensionItem(extension, isCore) { - if (isCore === void 0) { - isCore = false; - } - - return m("div", { - className: flarum_common_utils_classList__WEBPACK_IMPORTED_MODULE_9___default()({ - 'PackageManager-extension': true, - 'PackageManager-extension--core': isCore - }) - }, m("div", { - className: "PackageManager-extension-icon ExtensionIcon", - style: extension.icon - }, extension.icon ? flarum_common_helpers_icon__WEBPACK_IMPORTED_MODULE_3___default()(extension.icon.name) : ''), m("div", { - className: "PackageManager-extension-info" - }, m("div", { - className: "PackageManager-extension-name" - }, extension.title || extension.extra['flarum-extension'].title), m("div", { - className: "PackageManager-extension-version" - }, m("span", { - className: "PackageManager-extension-version-current" - }, this.version(extension.version)), extension.newPackageUpdate['latest-minor'] ? m("span", { - className: "PackageManager-extension-version-latest PackageManager-extension-version-latest--minor" - }, this.version(extension.newPackageUpdate['latest-minor'])) : null, extension.newPackageUpdate['latest-major'] && !isCore ? m("span", { - className: "PackageManager-extension-version-latest PackageManager-extension-version-latest--major" - }, this.version(extension.newPackageUpdate['latest-major'])) : null)), m("div", { - className: "PackageManager-extension-controls" - }, m(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_7___default.a, { - text: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.extensions.update') - }, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, { - icon: "fas fa-arrow-alt-circle-up", - className: "Button Button--icon Button--flat", - onclick: isCore ? this.updateCoreMinor.bind(this) : this.updateExtension.bind(this, extension), - "aria-label": flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.extensions.update') - })))); - }; - - _proto.version = function version(v) { - return 'v' + v.replace('v', ''); - }; - - _proto.getExtensionUpdates = function getExtensionUpdates() { - var _this$lastUpdateCheck2, _this$lastUpdateCheck3, _this$lastUpdateCheck4; - - (_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 extension = flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')]; - var safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']); - - if (extension && safeToUpdate) { - extension.newPackageUpdate = composerPackage; - } - - return extension && safeToUpdate; - }); - return Object.values(flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.extensions).filter(function (extension) { - return extension.newPackageUpdate; - }); - }; - - _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 _this3 = this; - - this.isLoading = 'check'; - 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/check-for-updates", - errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_8__["default"] - }).then(function (response) { - _this3.lastUpdateCheck = response; - })["finally"](function () { - _this3.isLoading = null; - m.redraw(); - }); - }; - - _proto.updateCoreMinor = function updateCoreMinor() { - var _this4 = this; - - flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a); - this.isLoading = 'minor-update'; - 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/minor-update", - errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_8__["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('sycho-package-manager.admin.update_successful')); - window.location.reload(); - })["finally"](function () { - _this4.isLoading = null; - m.redraw(); - }); - }; - - _proto.updateExtension = function updateExtension(extension) { - var _this5 = this; - - flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a); - this.isLoading = 'extension-update'; - flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({ - method: 'PATCH', - url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/extensions/" + extension.id, - errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_8__["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('sycho-package-manager.admin.extensions.successful_update', { - extension: extension.extra['flarum-extension'].title - })); - window.location.reload(); - })["finally"](function () { - _this5.isLoading = null; - m.redraw(); - }); - }; - - _proto.updateGlobally = function updateGlobally() { - var _this6 = this; - - flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a); - this.isLoading = 'global-update'; - 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/global-update", - errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_8__["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('sycho-package-manager.admin.updater.global_update_successful')); - window.location.reload(); - })["finally"](function () { - _this6.isLoading = null; - m.redraw(); - }); - }; - - return Updater; -}(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default.a); - - - -/***/ }), - -/***/ "./src/admin/index.js": -/*!****************************!*\ - !*** ./src/admin/index.js ***! - \****************************/ -/*! 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__); -/* harmony import */ var _components_MajorUpdater__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/MajorUpdater */ "./src/admin/components/MajorUpdater.tsx"); - - - - - - - - - - -flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.initializers.add('sycho-package-manager', function (app) { - app.extensionData["for"]('sycho-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('sycho-package-manager.admin.file_permissions'))); - } - }).registerSetting(function () { - if (app.data.isRequiredDirectoriesWritable) { - return m(_components_Installer__WEBPACK_IMPORTED_MODULE_6__["default"], null); - } - }).registerSetting(function () { - if (app.data.isRequiredDirectoriesWritable) { - return m(_components_Updater__WEBPACK_IMPORTED_MODULE_7__["default"], 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 === 'sycho-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('sycho-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 import */ var _components_ComposerFailureModal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/ComposerFailureModal */ "./src/admin/components/ComposerFailureModal.tsx"); - - -/* 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': - flarum_admin_app__WEBPACK_IMPORTED_MODULE_0___default.a.modal.show(_components_ComposerFailureModal__WEBPACK_IMPORTED_MODULE_1__["default"], { - error: error - }); - 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('sycho-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('sycho-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']; - -/***/ }) - -/******/ }); +module.exports=function(a){var e={};function t(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return a[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}return t.m=a,t.c=e,t.d=function(a,e,n){t.o(a,e)||Object.defineProperty(a,e,{enumerable:!0,get:n})},t.r=function(a){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},t.t=function(a,e){if(1&e&&(a=t(a)),8&e)return a;if(4&e&&"object"==typeof a&&a&&a.__esModule)return a;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:a}),2&e&&"string"!=typeof a)for(var r in a)t.d(n,r,function(e){return a[e]}.bind(null,r));return n},t.n=function(a){var e=a&&a.__esModule?function(){return a.default}:function(){return a};return t.d(e,"a",e),e},t.o=function(a,e){return Object.prototype.hasOwnProperty.call(a,e)},t.p="",t(t.s=15)}([function(a,e){a.exports=flarum.core.compat["admin/app"]},function(a,e){a.exports=flarum.core.compat["common/components/Button"]},function(a,e){a.exports=flarum.core.compat["admin/components/LoadingModal"]},function(a,e){a.exports=flarum.core.compat["common/Component"]},function(a,e){a.exports=flarum.core.compat["common/components/Tooltip"]},function(a,e){a.exports=flarum.core.compat["common/extend"]},function(a,e){a.exports=flarum.core.compat["common/components/Alert"]},function(a,e){a.exports=flarum.core.compat["admin/components/ExtensionPage"]},function(a,e){a.exports=flarum.core.compat["common/utils/Stream"]},function(a,e){a.exports=flarum.core.compat["common/components/Modal"]},function(a,e){a.exports=flarum.core.compat["common/helpers/icon"]},function(a,e){a.exports=flarum.core.compat["common/helpers/humanTime"]},function(a,e){a.exports=flarum.core.compat["common/utils/classList"]},function(a,e){a.exports=flarum.core.compat["common/components/LoadingIndicator"]},function(a,e){a.exports=flarum.core.compat["admin/utils/isExtensionEnabled"]},function(a,e,t){"use strict";t.r(e);var n=t(5),r=t(0),o=t.n(r),s=t(6),i=t.n(s),l=t(7),c=t.n(l),u=t(1),d=t.n(u),p=t(2),f=t.n(p);function g(a,e){return(g=Object.setPrototypeOf||function(a,e){return a.__proto__=e,a})(a,e)}function h(a,e){a.prototype=Object.create(e.prototype),a.prototype.constructor=a,g(a,e)}var k=t(3),x=t.n(k),v=t(8),b=t.n(v),y=t(9),_=function(a){function e(){return a.apply(this,arguments)||this}h(e,a);var t=e.prototype;return t.oninit=function(e){a.prototype.oninit.call(this,e),this.attrs.error.guessed_cause&&(this.alertAttrs={type:"error",content:o.a.translator.trans("flarum-package-manager.admin.failure_modal.guessed_cause."+this.attrs.error.guessed_cause)})},t.className=function(){return"Modal--large ComposerFailureModal"},t.title=function(){return o.a.translator.trans("flarum-package-manager.admin.failure_modal.title")},t.content=function(){return m("div",{className:"Modal-body"},m("details",null,m("summary",null,o.a.translator.trans("flarum-package-manager.admin.failure_modal.show_composer_output")),m("pre",{className:"ComposerFailureModal-output"},this.attrs.error.output)))},e}(t.n(y).a),w=function(a){var e=a.response.errors[0];if(!["composer_command_failure","extension_already_installed","extension_not_installed"].includes(e.code))throw a;switch(e.code){case"composer_command_failure":o.a.modal.show(_,{error:e});break;case"extension_already_installed":o.a.alerts.show({type:"error"},o.a.translator.trans("flarum-package-manager.admin.exceptions.extension_already_installed")),o.a.modal.close();break;case"extension_not_installed":o.a.alerts.show({type:"error"},o.a.translator.trans("flarum-package-manager.admin.exceptions.extension_not_installed")),o.a.modal.close()}},P=function(a){function e(){for(var e,t=arguments.length,n=new Array(t),r=0;r extends Modal {\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n if (this.attrs.error.guessed_cause) {\n this.alertAttrs = {\n type: 'error',\n content: app.translator.trans(`sycho-package-manager.admin.failure_modal.guessed_cause.${this.attrs.error.guessed_cause}`),\n };\n }\n }\n\n className() {\n return 'Modal--large ComposerFailureModal';\n }\n\n title() {\n return app.translator.trans('sycho-package-manager.admin.failure_modal.title');\n }\n\n content() {\n return (\n
\n
\n {app.translator.trans('sycho-package-manager.admin.failure_modal.show_composer_output')}\n
{this.attrs.error.output}
\n
\n
\n );\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 ComposerFailureModal from './ComposerFailureModal';\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('sycho-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('sycho-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 } from './Updater';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport errorHandler from '../utils/errorHandler';\n\ninterface MajorUpdaterAttrs extends ComponentAttrs {\n coreUpdate: UpdatedPackage;\n}\n\nexport default class MajorUpdater extends Component {\n isLoading: string | null = null;\n\n view(vnode: Mithril.Vnode): Mithril.Children {\n return (\n
\n \"flarum\n \n

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

\n
\n \n \n \n \n
\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('sycho-package-manager.admin.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 Component from 'flarum/common/Component';\nimport icon from 'flarum/common/helpers/icon';\nimport Button from 'flarum/common/components/Button';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport errorHandler from '../utils/errorHandler';\nimport classList from 'flarum/common/utils/classList';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport MajorUpdater from './MajorUpdater';\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\ntype ComposerUpdates = {\n installed: UpdatedPackage[];\n};\n\ntype LastUpdateCheck = {\n checkedAt: Date;\n updates: ComposerUpdates;\n};\n\nexport default class Updater extends Component {\n isLoading: string | null = null;\n lastUpdateCheck: LastUpdateCheck = app.data.lastUpdateCheck || {};\n\n oninit(vnode) {\n super.oninit(vnode);\n }\n\n view() {\n const extensions: any = this.getExtensionUpdates();\n const coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate();\n let core = null;\n\n if (coreUpdate) {\n core = {\n title: app.translator.trans('sycho-package-manager.admin.updater.flarum'),\n version: app.data.settings.version,\n icon: {\n backgroundImage: `url(${app.forum.attribute('baseUrl')}/assets/extensions/sycho-package-manager/flarum.svg`,\n },\n newPackageUpdate: coreUpdate,\n };\n }\n\n return [\n
\n \n

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

\n {Object.keys(this.lastUpdateCheck).length ? (\n

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

\n ) : null}\n
\n \n {app.translator.trans('sycho-package-manager.admin.updater.check_for_updates')}\n \n \n {app.translator.trans('sycho-package-manager.admin.updater.run_global_update')}\n \n
\n {this.isLoading !== null ? (\n
\n \n
\n ) : extensions.length || core ? (\n
\n
\n {core ? this.extensionItem(core, true) : null}\n {extensions.map((extension: any) => this.extensionItem(extension))}\n
\n
\n ) : null}\n
,\n coreUpdate && coreUpdate['latest-major'] ? : null,\n ];\n }\n\n extensionItem(extension: any, isCore: boolean = false) {\n return (\n \n
\n {extension.icon ? icon(extension.icon.name) : ''}\n
\n
\n
{extension.title || extension.extra['flarum-extension'].title}
\n
\n {this.version(extension.version)}\n {extension.newPackageUpdate['latest-minor'] ? (\n \n {this.version(extension.newPackageUpdate['latest-minor'])}\n \n ) : null}\n {extension.newPackageUpdate['latest-major'] && !isCore ? (\n \n {this.version(extension.newPackageUpdate['latest-major'])}\n \n ) : null}\n
\n
\n
\n \n \n \n
\n \n );\n }\n\n version(v: string) {\n return 'v' + v.replace('v', '');\n }\n\n getExtensionUpdates() {\n this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => {\n const extension = app.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];\n const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']);\n\n if (extension && safeToUpdate) {\n extension.newPackageUpdate = composerPackage;\n }\n\n return extension && safeToUpdate;\n });\n\n return Object.values(app.data.extensions).filter((extension: any) => extension.newPackageUpdate);\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 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('sycho-package-manager.admin.update_successful'));\n window.location.reload();\n })\n .finally(() => {\n this.isLoading = null;\n m.redraw();\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('sycho-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('sycho-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 { 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';\nimport MajorUpdater from './components/MajorUpdater';\n\napp.initializers.add('sycho-package-manager', (app) => {\n app.extensionData\n .for('sycho-package-manager')\n .registerSetting(() => {\n if (!app.data.isRequiredDirectoriesWritable) {\n return (\n
\n \n {app.translator.trans('sycho-package-manager.admin.file_permissions')}\n \n
\n );\n }\n })\n .registerSetting(() => {\n if (app.data.isRequiredDirectoriesWritable) {\n return ;\n }\n })\n .registerSetting(() => {\n if (app.data.isRequiredDirectoriesWritable) {\n return ;\n }\n });\n\n extend(ExtensionPage.prototype, 'topItems', function (items) {\n if (this.extension.id === 'sycho-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('sycho-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';\nimport ComposerFailureModal from '../components/ComposerFailureModal';\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 app.modal.show(ComposerFailureModal, { error });\n break;\n\n case 'extension_already_installed':\n app.alerts.show({ type: 'error' }, app.translator.trans('sycho-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('sycho-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 +{"version":3,"sources":["webpack://@flarum/package-manager/webpack/bootstrap","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/app']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/Button']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/components/LoadingModal']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/Component']\"","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/components/Alert']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/utils/Stream']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/Modal']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/helpers/icon']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/helpers/humanTime']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/utils/classList']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@flarum/package-manager/external \"flarum.core.compat['admin/utils/isExtensionEnabled']\"","webpack://@flarum/package-manager/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@flarum/package-manager/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/package-manager/./src/admin/components/ComposerFailureModal.tsx","webpack://@flarum/package-manager/./src/admin/utils/errorHandler.ts","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/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","flarum","core","compat","_setPrototypeOf","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","constructor","ComposerFailureModal","oninit","vnode","this","attrs","error","guessed_cause","alertAttrs","type","content","app","translator","trans","className","title","output","Modal","e","response","errors","includes","code","modal","show","alerts","close","Installer","packageName","isLoading","Stream","view","htmlFor","extiverse","href","id","placeholder","bidi","icon","onclick","onsubmit","loading","data","package","LoadingModal","request","method","url","forum","attribute","body","errorHandler","then","extensionId","extension","window","location","reload","redraw","Component","MajorUpdater","alt","src","version","coreUpdate","text","update","dryRun","Updater","lastUpdateCheck","extensions","getExtensionUpdates","getCoreUpdate","settings","backgroundImage","newPackageUpdate","keys","length","humanTime","checkedAt","checkForUpdates","disabled","updateGlobally","extensionItem","map","isCore","classList","style","extra","updateCoreMinor","updateExtension","aria-label","v","replace","updates","installed","filter","composerPackage","safeToUpdate","values","pop","initializers","add","extensionData","registerSetting","isRequiredDirectoriesWritable","dismissible","extend","ExtensionPage","items","isExtensionEnabled"],"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 = 15);\n","module.exports = flarum.core.compat['admin/app'];","module.exports = flarum.core.compat['common/components/Button'];","module.exports = flarum.core.compat['admin/components/LoadingModal'];","module.exports = flarum.core.compat['common/Component'];","module.exports = flarum.core.compat['common/components/Tooltip'];","module.exports = flarum.core.compat['common/extend'];","module.exports = flarum.core.compat['common/components/Alert'];","module.exports = flarum.core.compat['admin/components/ExtensionPage'];","module.exports = flarum.core.compat['common/utils/Stream'];","module.exports = flarum.core.compat['common/components/Modal'];","module.exports = flarum.core.compat['common/helpers/icon'];","module.exports = flarum.core.compat['common/helpers/humanTime'];","module.exports = flarum.core.compat['common/utils/classList'];","module.exports = flarum.core.compat['common/components/LoadingIndicator'];","module.exports = flarum.core.compat['admin/utils/isExtensionEnabled'];","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 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}","import app from 'flarum/admin/app';\nimport Modal from 'flarum/common/components/Modal';\nimport { ComponentAttrs } from 'flarum/common/Component';\nimport Alert from 'flarum/common/components/Alert';\nimport Mithril from 'mithril';\n\ninterface Attrs extends ComponentAttrs {\n output: string;\n}\n\nexport default class ComposerFailureModal extends Modal {\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n if (this.attrs.error.guessed_cause) {\n this.alertAttrs = {\n type: 'error',\n content: app.translator.trans(`flarum-package-manager.admin.failure_modal.guessed_cause.${this.attrs.error.guessed_cause}`),\n };\n }\n }\n\n className() {\n return 'Modal--large ComposerFailureModal';\n }\n\n title() {\n return app.translator.trans('flarum-package-manager.admin.failure_modal.title');\n }\n\n content() {\n return (\n
\n
\n {app.translator.trans('flarum-package-manager.admin.failure_modal.show_composer_output')}\n
{this.attrs.error.output}
\n
\n
\n );\n }\n}\n","import app from 'flarum/admin/app';\nimport ComposerFailureModal from '../components/ComposerFailureModal';\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 app.modal.show(ComposerFailureModal, { error });\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","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 ComposerFailureModal from './ComposerFailureModal';\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 } from './Updater';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport errorHandler from '../utils/errorHandler';\n\ninterface MajorUpdaterAttrs extends ComponentAttrs {\n coreUpdate: UpdatedPackage;\n}\n\nexport default class MajorUpdater extends Component {\n isLoading: string | null = null;\n\n view(vnode: Mithril.Vnode): Mithril.Children {\n return (\n
\n \"flarum\n \n

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

\n
\n \n \n \n \n
\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 .finally(() => {\n this.isLoading = null;\n m.redraw();\n });\n }\n}\n","import app from 'flarum/admin/app';\nimport Component from 'flarum/common/Component';\nimport icon from 'flarum/common/helpers/icon';\nimport Button from 'flarum/common/components/Button';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport LoadingModal from 'flarum/admin/components/LoadingModal';\nimport Tooltip from 'flarum/common/components/Tooltip';\nimport errorHandler from '../utils/errorHandler';\nimport classList from 'flarum/common/utils/classList';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport MajorUpdater from './MajorUpdater';\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\ntype ComposerUpdates = {\n installed: UpdatedPackage[];\n};\n\ntype LastUpdateCheck = {\n checkedAt: Date;\n updates: ComposerUpdates;\n};\n\nexport default class Updater extends Component {\n isLoading: string | null = null;\n lastUpdateCheck: LastUpdateCheck = app.data.lastUpdateCheck || {};\n\n oninit(vnode) {\n super.oninit(vnode);\n }\n\n view() {\n const extensions: any = this.getExtensionUpdates();\n const coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate();\n let core = null;\n\n if (coreUpdate) {\n core = {\n title: app.translator.trans('flarum-package-manager.admin.updater.flarum'),\n version: app.data.settings.version,\n icon: {\n backgroundImage: `url(${app.forum.attribute('baseUrl')}/assets/extensions/flarum-package-manager/flarum.svg`,\n },\n newPackageUpdate: coreUpdate,\n };\n }\n\n return [\n
\n \n

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

\n {Object.keys(this.lastUpdateCheck).length ? (\n

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

\n ) : null}\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 ? this.extensionItem(core, true) : null}\n {extensions.map((extension: any) => this.extensionItem(extension))}\n
\n
\n ) : null}\n
,\n coreUpdate && coreUpdate['latest-major'] ? : null,\n ];\n }\n\n extensionItem(extension: any, isCore: boolean = false) {\n return (\n \n
\n {extension.icon ? icon(extension.icon.name) : ''}\n
\n
\n
{extension.title || extension.extra['flarum-extension'].title}
\n
\n {this.version(extension.version)}\n {extension.newPackageUpdate['latest-minor'] ? (\n \n {this.version(extension.newPackageUpdate['latest-minor'])}\n \n ) : null}\n {extension.newPackageUpdate['latest-major'] && !isCore ? (\n \n {this.version(extension.newPackageUpdate['latest-major'])}\n \n ) : null}\n
\n
\n
\n \n \n \n
\n \n );\n }\n\n version(v: string) {\n return 'v' + v.replace('v', '');\n }\n\n getExtensionUpdates() {\n this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => {\n const extension = app.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];\n const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']);\n\n if (extension && safeToUpdate) {\n extension.newPackageUpdate = composerPackage;\n }\n\n return extension && safeToUpdate;\n });\n\n return Object.values(app.data.extensions).filter((extension: any) => extension.newPackageUpdate);\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 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 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 { 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';\nimport MajorUpdater from './components/MajorUpdater';\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 .registerSetting(() => {\n if (app.data.isRequiredDirectoriesWritable) {\n return ;\n }\n })\n .registerSetting(() => {\n if (app.data.isRequiredDirectoriesWritable) {\n return ;\n }\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"],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php b/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php index 3f9efa600..75e7d040e 100755 --- a/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php +++ b/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php @@ -13,7 +13,7 @@ use Flarum\Foundation\ErrorHandling\HandledError; class ComposerCommandFailedExceptionHandler { - protected const INCOMPATIBLE_REGEX = '/ +- {PACKAGE_NAME} v[0-9.]+ requires flarum\/core/m'; + protected const INCOMPATIBLE_REGEX = '/(?:(?: +- {PACKAGE_NAME} v[0-9A-z.-]+ requires flarum\/core)|(?:Could not find a version of package {PACKAGE_NAME} matching your minim))/m'; public function handle(ComposerCommandFailedException $e): HandledError { 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/RefreshComposerSetup.php b/extensions/package-manager/tests/integration/RefreshComposerSetup.php new file mode 100644 index 000000000..8009f0386 --- /dev/null +++ b/extensions/package-manager/tests/integration/RefreshComposerSetup.php @@ -0,0 +1,18 @@ +tmpDir().'/composer.lock'); + + $composerSetup->run(); + + $this->composer('install'); + + parent::tearDown(); + } +} diff --git a/extensions/package-manager/tests/integration/SetupComposer.php b/extensions/package-manager/tests/integration/SetupComposer.php new file mode 100644 index 000000000..58ee1b2df --- /dev/null +++ b/extensions/package-manager/tests/integration/SetupComposer.php @@ -0,0 +1,34 @@ +tmpDir().'/composer.json'; + + file_put_contents($filePath, json_encode([ + 'require' => [ + 'flarum/core' => '1.0.0', + 'flarum/tags' => '1.0.3', + 'flarum/lang-english' => '*', + ], + 'config' => [ + 'preferred-install' => 'dist', + 'sort-packages' => true, + ], + ], JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); + } +} diff --git a/extensions/package-manager/tests/integration/TestCase.php b/extensions/package-manager/tests/integration/TestCase.php new file mode 100644 index 000000000..92d1efc95 --- /dev/null +++ b/extensions/package-manager/tests/integration/TestCase.php @@ -0,0 +1,96 @@ +extension('flarum-package-manager', 'flarum-tags'); + + $tmp = $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 requireExtension(string $package) + { + $this->composer("require $package"); + } + + protected function removeExtension(string $package) + { + $this->composer("remove $package"); + } + + protected function composer(string $command): void + { + /** @var Application $composer */ + $composer = $this->app()->getContainer()->make(Application::class); + $output = new NullOutput(); + $composer->run(new StringInput($command), $output); + } + + protected function guessedCause(ResponseInterface $response): ?string + { + $json = json_decode($response->getBody()->getContents(), true); + + return $json['errors'] ? ($json['errors'][0]['guessed_cause'] ?? null) : null; + } +} 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..c7a457abc --- /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(204, $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..3a41af0e1 --- /dev/null +++ b/extensions/package-manager/tests/integration/api/extensions/RequireExtensionTest.php @@ -0,0 +1,85 @@ +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_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->guessedCause($response)); + } +} 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..d19f91e9d --- /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(204, $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..4602db3fd --- /dev/null +++ b/extensions/package-manager/tests/phpunit.integration.xml @@ -0,0 +1,27 @@ + + + + + ../src/ + + + + + ./integration + + + + + + 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