diff options
-rw-r--r-- | .eslintrc.js | 7 | ||||
-rw-r--r-- | .github/workflows/lint-eslint.yml | 47 | ||||
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | babel.config.js | 5 | ||||
-rw-r--r-- | css/explore.css | 57 | ||||
-rw-r--r-- | css/explore.scss | 64 | ||||
-rw-r--r-- | css/mobile.css (renamed from css/mobile.scss) | 2 | ||||
-rw-r--r-- | js/gulpfile.js | 2 | ||||
-rw-r--r-- | lib/Controller/AdminController.php | 114 | ||||
-rw-r--r-- | lib/Settings/AdminSettings.php | 16 | ||||
-rw-r--r-- | package-lock.json | 20794 | ||||
-rw-r--r-- | package.json | 49 | ||||
-rw-r--r-- | src/components/AdminSettings.vue | 147 | ||||
-rw-r--r-- | src/main-admin.js | 20 | ||||
-rw-r--r-- | stylelint.config.js | 5 | ||||
-rw-r--r-- | templates/admin.php | 134 | ||||
-rw-r--r-- | tests/Unit/Controller/AdminControllerTest.php | 156 | ||||
-rw-r--r-- | webpack.config.js | 13 |
19 files changed, 21164 insertions, 473 deletions
diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..76352e46c --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,7 @@ +// SPDX-FileCopyrightText: Carl Schwan <carl@carlschwan.eu> +// SPDX-License-Identifier: AGPL-3.0-or-later +module.exports = { + extends: [ + '@nextcloud', + ] +} diff --git a/.github/workflows/lint-eslint.yml b/.github/workflows/lint-eslint.yml new file mode 100644 index 000000000..564a4a829 --- /dev/null +++ b/.github/workflows/lint-eslint.yml @@ -0,0 +1,47 @@ +# This workflow is provided via the organization template repository +# +# https://github.com/nextcloud/.github +# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization +# SPDX-FileCopyrightText: Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +name: Lint + +on: + pull_request: + push: + branches: + - main + - master + - stable* + +jobs: + lint: + runs-on: ubuntu-latest + + name: eslint + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@v1.2 + id: versions + with: + fallbackNode: '^12' + fallbackNpm: '^6' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@v3 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fe7e20c0..45489f10b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is mostly based on [Keep a Changelog](https://keepachangelog.com/en/1 # Unreleased ## [18.x.x] ### Changed +- Ported the admin settings to vue (#2353) ### Fixed - Fix PHP 8.1 deprecations (#1861) @@ -83,6 +83,8 @@ endif # Installs npm dependencies .PHONY: npm npm: + $(npm) ci + $(npm) run build ifneq (, $(npm)) cd js && $(npm) run build else @@ -171,7 +173,7 @@ appstore: # on macOS there is no option "--parents" for the "cp" command mkdir -p $(appstore_sign_dir)/$(app_name)/js/build $(appstore_sign_dir)/$(app_name)/js/admin cp js/build/app.min.js $(appstore_sign_dir)/$(app_name)/js/build - cp js/admin/Admin.js $(appstore_sign_dir)/$(app_name)/js/admin + cp js/build/news-admin-settings.js* $(appstore_sign_dir)/$(app_name)/js/build # export the key and cert to a file mkdir -p $(cert_dir) diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 000000000..0aeac49aa --- /dev/null +++ b/babel.config.js @@ -0,0 +1,5 @@ +// SPDX-FileCopyrightText: Carl Schwan <carl@carlschwan.eu> +// SPDX-License-Identifier: AGPL-3.0-or-later +const babelConfig = require('@nextcloud/babel-config') + +module.exports = babelConfig diff --git a/css/explore.css b/css/explore.css new file mode 100644 index 000000000..03efb07b0 --- /dev/null +++ b/css/explore.css @@ -0,0 +1,57 @@ +/** + * Nextcloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright 2020, Jan C. Borchardt, https://jancborchardt.net + * @copyright Bernhard Posselt 2014 + */ +/** + * Explore styles + */ +.explore #app-content-wrapper { + height: 100%; +} + +#explore { + height: 100%; + width: 100%; + padding: 45px 0 45px 45px; +} +#explore .grid-item { + width: 300px; + border: 2px solid var(--color-border); + border-radius: var(--border-radius-large); + margin: 0 24px 24px 0; + padding: 24px; +} +#explore .grid-item .explore-title { + background-repeat: no-repeat; + background-position: 0 center; + background-size: 24px; + padding-left: 32px; +} +#explore .grid-item .explore-title a { + word-wrap: break-word; +} +#explore .grid-item .explore-title a:hover, #explore .grid-item .explore-title a:focus { + text-decoration: underline; +} +#explore .grid-item .explore-logo { + text-align: center; + margin-top: 25px; +} +#explore .grid-item .explore-logo img { + width: 100%; +} +#explore .grid-item .explore-subscribe { + margin-top: 16px; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/*# sourceMappingURL=explore.css.map */ diff --git a/css/explore.scss b/css/explore.scss deleted file mode 100644 index d459ae825..000000000 --- a/css/explore.scss +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Nextcloud - News - * - * This file is licensed under the Affero General Public License version 3 or - * later. See the COPYING file. - * - * @author Bernhard Posselt <dev@bernhard-posselt.com> - * @copyright 2020, Jan C. Borchardt, https://jancborchardt.net - * @copyright Bernhard Posselt 2014 - */ - -/** - * Explore styles - */ -.explore #app-content-wrapper { - height: 100%; -} - -#explore { - height: 100%; - width: 100%; - padding: 45px 0 45px 45px; - - .grid-item { - width: 300px; - border: 2px solid var(--color-border); - border-radius: var(--border-radius-large); - margin: 0 24px 24px 0; - padding: 24px; - - .explore-title { - background-repeat: no-repeat; - background-position: 0 center; - background-size: 24px; - padding-left: 32px; - - a { - word-wrap: break-word; - - &:hover, - &:focus { - text-decoration: underline; - } - } - } - - .explore-logo { - text-align: center; - margin-top: 25px; - - img { - width: 100%; - } - } - - .explore-subscribe { - margin-top: 16px; - max-width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } -} diff --git a/css/mobile.scss b/css/mobile.css index 02271a263..3f2dc6343 100644 --- a/css/mobile.scss +++ b/css/mobile.css @@ -1,4 +1,4 @@ -@media only screen and (max-width: $breakpoint_mobile) { +@media only screen and (max-width: 1024px) { #app-content .utils .date { display: none; } diff --git a/js/gulpfile.js b/js/gulpfile.js index eef83d114..52a74922d 100644 --- a/js/gulpfile.js +++ b/js/gulpfile.js @@ -39,7 +39,7 @@ const sources = [ 'directive/**/*.js' ]; const testSources = ['tests/**/*.js']; -const watchSources = sources.concat(testSources).concat(['*.js']); +const watchSources = sources.concat(testSources).concat(['*.js', '!news-admin-settings.js']); const lintSources = watchSources; // tasks diff --git a/lib/Controller/AdminController.php b/lib/Controller/AdminController.php deleted file mode 100644 index 8a0dfd99c..000000000 --- a/lib/Controller/AdminController.php +++ /dev/null @@ -1,114 +0,0 @@ -<?php -/** - * Nextcloud - News - * - * This file is licensed under the Affero General Public License version 3 or - * later. See the COPYING file. - * - * @author Alessandro Cosentino <cosenal@gmail.com> - * @author Bernhard Posselt <dev@bernhard-posselt.com> - * - * @copyright 2012 Alessandro Cosentino - * @copyright 2012-2014 Bernhard Posselt - */ - -namespace OCA\News\Controller; - -use OCA\News\AppInfo\Application; -use OCP\AppFramework\Http\TemplateResponse; -use OCP\IConfig; -use OCP\IRequest; -use OCP\AppFramework\Controller; - -/** - * Class AdminController - * - * @package OCA\News\Controller - */ -class AdminController extends Controller -{ - - /** - * @var IConfig - */ - private $config; - - /** - * AdminController constructor. - * - * @param IRequest $request The request - * @param IConfig $config Config for nextcloud - */ - public function __construct(IRequest $request, IConfig $config) - { - parent::__construct(Application::NAME, $request); - - $this->config = $config; - } - - /** - * Controller main entry. - * - * There are no checks for the index method since the output is - * rendered in admin/admin.php - * - * @return TemplateResponse - */ - public function index(): TemplateResponse - { - return new TemplateResponse($this->appName, 'admin', $this->getData(), 'blank'); - } - - /** - * Get admin data. - * - * @return array - */ - private function getData(): array - { - $data = []; - - foreach (array_keys(Application::DEFAULT_SETTINGS) as $setting) { - $data[$setting] = $this->config->getAppValue( - Application::NAME, - $setting, - Application::DEFAULT_SETTINGS[$setting] - ); - } - - return $data; - } - - /** - * Update the app config. - * - * @param int $autoPurgeMinimumInterval New minimum interval for auto-purge - * @param int $autoPurgeCount New value of auto-purge count - * @param int $maxRedirects New value for max amount of redirects - * @param int $feedFetcherTimeout New timeout value for feed fetcher - * @param bool $useCronUpdates Whether or not to use cron updates - * @param string $exploreUrl URL to use for the explore feed - * @param int $updateInterval Interval in which the feeds will be updated - * - * @return array with the updated values - */ - public function update( - int $autoPurgeMinimumInterval, - int $autoPurgeCount, - int $maxRedirects, - int $feedFetcherTimeout, - bool $useCronUpdates, - string $exploreUrl, - int $updateInterval - ): array { - $this->config->setAppValue($this->appName, 'autoPurgeMinimumInterval', $autoPurgeMinimumInterval); - $this->config->setAppValue($this->appName, 'autoPurgeCount', $autoPurgeCount); - $this->config->setAppValue($this->appName, 'maxRedirects', $maxRedirects); - $this->config->setAppValue($this->appName, 'feedFetcherTimeout', $feedFetcherTimeout); - $this->config->setAppValue($this->appName, 'useCronUpdates', $useCronUpdates); - $this->config->setAppValue($this->appName, 'exploreUrl', $exploreUrl); - $this->config->setAppValue($this->appName, 'updateInterval', $updateInterval); - - return $this->getData(); - } -} diff --git a/lib/Settings/AdminSettings.php b/lib/Settings/AdminSettings.php index 1f3d98c08..c29b5d46c 100644 --- a/lib/Settings/AdminSettings.php +++ b/lib/Settings/AdminSettings.php @@ -6,6 +6,7 @@ use OCA\News\AppInfo\Application; use OCP\AppFramework\Http\TemplateResponse; use OCP\IConfig; use OCP\Settings\ISettings; +use OCP\AppFramework\Services\IInitialState; class AdminSettings implements ISettings { @@ -14,25 +15,26 @@ class AdminSettings implements ISettings * @var IConfig */ private $config; + /** @var IInitialState */ + private $initialState; - public function __construct(IConfig $config) + public function __construct(IConfig $config, IInitialState $initialState) { $this->config = $config; + $this->initialState = $initialState; } public function getForm() { - $data = []; - foreach (array_keys(Application::DEFAULT_SETTINGS) as $setting) { - $data[$setting] = $this->config->getAppValue( + $this->initialState->provideInitialState($setting, $this->config->getAppValue( Application::NAME, $setting, - Application::DEFAULT_SETTINGS[$setting] - ); + (string)Application::DEFAULT_SETTINGS[$setting] + )); } - return new TemplateResponse(Application::NAME, 'admin', $data); + return new TemplateResponse(Application::NAME, 'admin', []); } public function getSection() diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..43076400c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,20794 @@ +{ + "name": "news", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "news", + "version": "0.0.1", + "license": "agpl", + "dependencies": { + "@nextcloud/auth": "^2.0.0", + "@nextcloud/axios": "^1.10.0", + "@nextcloud/dialogs": "^3.1.4", + "@nextcloud/initial-state": "^2.0.0", + "@nextcloud/l10n": "^1.6.0", + "@nextcloud/password-confirmation": "^1.0.1", + "@nextcloud/router": "^2.0.0", + "@nextcloud/vue": "^6.0.0-beta.4", + "vue": "^2.7.0" + }, + "devDependencies": { + "@nextcloud/babel-config": "^1.0.0", + "@nextcloud/browserslist-config": "^2.2.0", + "@nextcloud/eslint-config": "^8.0.0", + "@nextcloud/stylelint-config": "^2.1.2", + "@nextcloud/webpack-vue-config": "^5.2.1" + }, + "engines": { + "node": "^16.0.0", + "npm": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", + "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", + "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", |