diff --git a/.docker/nginx.conf b/.docker/nginx.conf index e0deb2b8da..d1844c4f13 100644 --- a/.docker/nginx.conf +++ b/.docker/nginx.conf @@ -3,12 +3,8 @@ # include mime.types; # } -upstream php-pimcore10 { - server coreshop-4-php:9000; -} - -upstream php-pimcore10-debug { - server coreshop-4-php-debug:9000; +upstream php-pimcore11 { + server coreshop4-php:9000; } server { @@ -121,7 +117,6 @@ server { #try_files $fastcgi_script_name =404; # include fastcgi.conf if needed include fastcgi_params; - # Bypass the fact that try_files resets $fastcgi_path_info # see: http://trac.nginx.org/nginx/ticket/321 set $path_info $fastcgi_path_info; @@ -134,12 +129,7 @@ server { # Mitigate https://httpoxy.org/ vulnerabilities fastcgi_param HTTP_PROXY ""; - # If Xdebug session is requested, pass it to the Xdebug enabled container - if ($http_cookie ~* "XDEBUG_SESSION") { - fastcgi_pass php-pimcore10-debug; - } - - fastcgi_pass php-pimcore10; + fastcgi_pass php-pimcore11; # Prevents URIs that include the front controller. This will 404: # http://domain.tld/index.php/some-path # Remove the internal directive to allow URIs like this @@ -155,10 +145,10 @@ server { allow 127.0.0.1; # add additional IP's or Ranges deny all; - fastcgi_pass php-pimcore10; + fastcgi_pass php-pimcore11; } location /fpm-ping { - fastcgi_pass php-pimcore10; + fastcgi_pass php-pimcore11; } } # nginx Status diff --git a/.env b/.env index 6dc4027aeb..6140d6861c 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ PIMCORE_KERNEL_CLASS=Kernel +APP_DEBUG=1 \ No newline at end of file diff --git a/.github/workflows/behat.yml b/.github/workflows/behat.yml index 45feff6124..66bc227459 100644 --- a/.github/workflows/behat.yml +++ b/.github/workflows/behat.yml @@ -2,10 +2,22 @@ name: Behat on: push: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' pull_request: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' release: types: [ created ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs.yaml' + - 'README.md' schedule: - cron: "0 1 * * 1" @@ -25,12 +37,11 @@ jobs: PIMCORE_INSTALL_MYSQL_DATABASE: "coreshop_test" PIMCORE_INSTALL_MYSQL_PORT: "3306" PIMCORE_KERNEL_CLASS: 'Kernel' - PIMCORE_CLASS_DIRECTORY: 'var/tmp/behat/var/classes' strategy: matrix: php: [ 8.1, 8.2 ] - pimcore: [ ^11.0 ] + pimcore: [ ~11.1.0, ~11.2.0 ] dependencies: [ highest ] exclude: - php: 8.1 @@ -47,7 +58,7 @@ jobs: name: "${{ matrix.pimcore }}, PHP ${{ matrix.php }}, Deps ${{ matrix.dependencies }}" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install PHP uses: shivammathur/setup-php@v2 @@ -68,7 +79,7 @@ jobs: run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache composer dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} diff --git a/.github/workflows/behat_ui.yml b/.github/workflows/behat_ui.yml index 605b5c9c52..7f74f6851a 100644 --- a/.github/workflows/behat_ui.yml +++ b/.github/workflows/behat_ui.yml @@ -2,8 +2,16 @@ name: Behat UI on: push: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' pull_request: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' release: types: [ created ] schedule: @@ -26,12 +34,11 @@ jobs: PANTHER_EXTERNAL_BASE_URI: "http://localhost:9080/index_test.php" PANTHER_CHROME_ARGUMENTS: "--disable-dev-shm-usage" PIMCORE_KERNEL_CLASS: 'Kernel' - PIMCORE_CLASS_DIRECTORY: 'var/tmp/behat/var/classes' strategy: matrix: php: [ 8.1, 8.2 ] - pimcore: [ ^11.0 ] + pimcore: [ ~11.1.0, ~11.2.0 ] dependencies: [ highest ] exclude: - php: 8.1 @@ -49,7 +56,7 @@ jobs: name: "${{ matrix.pimcore }}, PHP ${{ matrix.php }}, Deps ${{ matrix.dependencies }}" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install PHP uses: shivammathur/setup-php@v2 @@ -71,7 +78,7 @@ jobs: run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache composer dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} @@ -113,7 +120,7 @@ jobs: run: vendor/bin/behat --strict --no-interaction -vvv -f progress --config behat.yml.dist -p ui - name: Upload Behat logs - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 if: failure() with: name: "Behat logs (non-JS, PHP ${{ matrix.php }}, Symfony ${{ matrix.pimcore }})" @@ -121,7 +128,7 @@ jobs: if-no-files-found: ignore - name: Upload Pimcore logs - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 if: failure() with: name: "Pimcore logs (non-JS, PHP ${{ matrix.php }}, Symfony ${{ matrix.pimcore }})" diff --git a/.github/workflows/codestyles.yml b/.github/workflows/codestyles.yml index bc436917e4..b33420ab0a 100644 --- a/.github/workflows/codestyles.yml +++ b/.github/workflows/codestyles.yml @@ -18,7 +18,7 @@ jobs: branch: [ '4.0' ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ matrix.branch }} diff --git a/.github/workflows/docs_next.yml b/.github/workflows/docs_next.yml index 24c778103b..88794b232b 100644 --- a/.github/workflows/docs_next.yml +++ b/.github/workflows/docs_next.yml @@ -1,37 +1,19 @@ -name: Docs +name: "Documentation" on: + pull_request: + paths: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' push: - branches: [ '4.0' ] paths: - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' + +permissions: + contents: read jobs: docs: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Set Node.js 18.x - uses: actions/setup-node@v3 - with: - node-version: 18.x - - - name: Setup and Generate - run: | - cd docs - npm install - npm run build - - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v0' - with: - credentials_json: '${{ secrets.GOOGLE_CREDENTIALS }}' - - - name: Upload Folder - uses: 'google-github-actions/upload-cloud-storage@v0' - if: github.ref == 'refs/heads/4.0' - with: - path: 'docs/build/' - destination: 'cors-wolke-coreshop-docs/4.0.0' - parent: false + uses: coreshop/workflow-collection/.github/workflows/docs.yml@v1 \ No newline at end of file diff --git a/.github/workflows/gitsplit.yml b/.github/workflows/gitsplit.yml index 16e577107e..0d6d92d6cf 100644 --- a/.github/workflows/gitsplit.yml +++ b/.github/workflows/gitsplit.yml @@ -9,6 +9,10 @@ on: - 3.0 - 3.1 - 4.0 + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' release: types: [ published ] @@ -25,7 +29,7 @@ jobs: - name: Gitsplit Cache id: gitsplit-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: cache key: gitsplit-cache diff --git a/.github/workflows/packages_bundles.yml b/.github/workflows/packages_bundles.yml index bd636ea0fc..8d40ae9057 100644 --- a/.github/workflows/packages_bundles.yml +++ b/.github/workflows/packages_bundles.yml @@ -2,8 +2,16 @@ name: Packages Bundles on: push: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' pull_request: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' release: types: [ created ] schedule: @@ -15,7 +23,7 @@ jobs: name: "Create a list of packages" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: "List Packages" id: create-list @@ -32,7 +40,7 @@ jobs: fail-fast: false matrix: php: [ 8.1, 8.2 ] - pimcore: [ ^11.0 ] + pimcore: [ ~11.1.0, ~11.2.0 ] dependencies: [ highest ] package: "${{ fromJson(needs.list.outputs.packages) }}" exclude: @@ -40,7 +48,7 @@ jobs: dependencies: lowest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install PHP uses: shivammathur/setup-php@v2 @@ -53,7 +61,7 @@ jobs: run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache Composer - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-php-${{ matrix.php }}-package-${{ matrix.package }}-composer-${{ hashFiles(format('src/CoreShop/{0}/composer.json', matrix.package)) }} diff --git a/.github/workflows/packages_components.yml b/.github/workflows/packages_components.yml index a9b04baa3e..4beadf5c21 100644 --- a/.github/workflows/packages_components.yml +++ b/.github/workflows/packages_components.yml @@ -2,8 +2,16 @@ name: Packages Components on: push: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' pull_request: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' release: types: [ created ] schedule: @@ -15,7 +23,7 @@ jobs: name: "Create a list of packages" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: "List Packages" id: create-list @@ -32,7 +40,7 @@ jobs: fail-fast: false matrix: php: [ 8.1, 8.2 ] - pimcore: [ ^11.0 ] + pimcore: [ ~11.1.0, ~11.2.0 ] dependencies: [ highest ] package: "${{ fromJson(needs.list.outputs.packages) }}" exclude: @@ -40,7 +48,7 @@ jobs: dependencies: lowest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install PHP uses: shivammathur/setup-php@v2 @@ -53,7 +61,7 @@ jobs: run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache Composer - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-php-${{ matrix.php }}-package-${{ matrix.package }}-composer-${{ hashFiles(format('src/CoreShop/{0}/composer.json', matrix.package)) }} diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 3cd82dfbe3..cb7644254d 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -2,8 +2,16 @@ name: Static Tests (Lint, Stan) on: push: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' pull_request: branches: [ '4.0' ] + paths-ignore: + - 'docs/**' + - '.github/workflows/docs_next.yml' + - 'README.md' release: types: [ created ] schedule: @@ -19,7 +27,7 @@ jobs: strategy: matrix: php: [ 8.1, 8.2 ] - pimcore: [ ^11.0 ] + pimcore: [ ~11.1.0, ~11.2.0 ] dependencies: [ highest ] exclude: - php: 8.1 @@ -38,7 +46,7 @@ jobs: name: "${{ matrix.pimcore }}, PHP ${{ matrix.php }}, Deps ${{ matrix.dependencies }}" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install PHP uses: shivammathur/setup-php@v2 @@ -55,7 +63,7 @@ jobs: run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache composer dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} diff --git a/.gitignore b/.gitignore index bb47951289..5cbb4724d5 100644 --- a/.gitignore +++ b/.gitignore @@ -56,9 +56,9 @@ public/bundles public/var drivers vendor/ -cache/ docs/generated-docs docs/build docs/node_modules docs/.docusaurus node_modules +docker-compose.override.yaml \ No newline at end of file diff --git a/CHANGELOG-3.1.x.md b/CHANGELOG-3.1.x.md index 547e0b51b3..cec45c45c9 100644 --- a/CHANGELOG-3.1.x.md +++ b/CHANGELOG-3.1.x.md @@ -1,3 +1,47 @@ +# 3.1.5 +* +* [ResourceBundle] remove request handler by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2443 +* fix unit solidifier paths by @solverat in https://github.com/coreshop/CoreShop/pull/2446 +* fix nested rule condition by @solverat in https://github.com/coreshop/CoreShop/pull/2447 +* [StorageListBundle] fix standalone SessionBasedListContext by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2448 +* [ResourceBundle] fix custom resource registration by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2454 +* [StorageListBundle] disable cache for StorageList and StorageListItem by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2449 +* [Messenger] fix tab panel layout by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2462 +* [Core] Cart Item Discount Percent Gross Values by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2464 +* Disable CartStockAvailability constraint in revise action by @solverat in https://github.com/coreshop/CoreShop/pull/2461 +* [Cache] don't overwrite the prepareCacheData by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2469 +* [Core] defaultUnitQuantity should never be null by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2470 +* [PimcoreBundle] add cache.system to ExpressionLanguage by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2468 +* [User] implement symfony "getUserIdentifier" by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2475 +* [StorageList] implement \Countable by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2476 +* [Composer] update bdi and add psr-4 autoload-dev for Pimcore Data Objects by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2477 +* [FrontendBundle] check for isSubmitted before calling isValid by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2480 +* allow pending payments in checkout workflow by @solverat in https://github.com/coreshop/CoreShop/pull/2481 + +# 3.1.4 + +* cast trackingCode as string by @solverat in https://github.com/coreshop/CoreShop/pull/2412 +* fix comment delete request by @solverat in https://github.com/coreshop/CoreShop/pull/2407 +* [Core] add unit to GiftProductAction by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2422 +* [Cart] fix wrong decoration of cart-context by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2432 +* Bugfix listing order by by @BlackbitDevs in https://github.com/coreshop/CoreShop/pull/2370 +* [Order expiration] Use orderDate for confirmed orders, not o_creationDate by @BlackbitDevs in + +# 3.1.3 + +* [Cart] fix using right context for performance increase by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2387 +* [Core] Optimize Category recursive and Product Variants Condition Checker by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2388 +* [ResourceBundle] fix cache marshalling issues with CoreShop Doctrine … by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2389 +* [Cache] cache improvements - decorate Pimcore CoreCacheHandler by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2398 +* [Messenger] fix menu in standalone mode by @jdreesen in https://github.com/coreshop/CoreShop/pull/2393 + +# 3.1.2 + +## Bugs + - [Cache] "apply CacheResourceMarshaller to doctrine_dbal adapter, add cache marshaller to MoneyCurrency (https://github.com/coreshop/CoreShop/pull/2373) + - [Core] re-add mainObjectId and objectId (https://github.com/coreshop/CoreShop/pull/2380) + - [Reports] fix reports to only select actual orders (https://github.com/coreshop/CoreShop/pull/2381) + # 3.1.1 ## Bugs diff --git a/CHANGELOG-3.2.x.md b/CHANGELOG-3.2.x.md new file mode 100644 index 0000000000..ef70ffb864 --- /dev/null +++ b/CHANGELOG-3.2.x.md @@ -0,0 +1,58 @@ +# 3.2.7 +* Fix store mail and store order mail collection entry type by @kkarkus in https://github.com/coreshop/CoreShop/pull/2586 +* [NoteService] implement deadlock retry strategy by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2588 +* always set default unit quantity in gift product action by @solverat in https://github.com/coreshop/CoreShop/pull/2590 +* [CoreBundle] fix PaymentWorkflow Listener to trigger state transition conditions by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2601 +* [CoreBundle] fix CartTextProcessor priority and CartManagers setParent for cart-item by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2602 + +# 3.2.6 +* [Tests] add test for stock tracked products in checkout by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2560 +* [Tests] test only latest pimcore with highest deps for 3.2 by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2559 +* Increase MessengerBundle Receivers combobox width by @NiklasBr in https://github.com/coreshop/CoreShop/pull/2567 +* Updated CachedStoreContext.php by @kamil-karkus in https://github.com/coreshop/CoreShop/pull/2565 +* [Core] fix price calculation with immutables and adjustments by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2573 + +# 3.2.5 +* [Migration] [Migration] fix Staticroute Migration for Pimcore 10 by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2550 + +# 3.2.4 +* [CoreBundle] fix priority of coreshop_payment_token route by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2542 +* [Frontend] create order-token if not yet exists by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2543 +* [ProductBundle] default return empty array instead of null in preGetData by @breakone in https://github.com/coreshop/CoreShop/pull/2544 + +# 3.2.3 +* [ProductBundle] fix ClearCachedPriceRulesListener - remove service definition + +# 3.2.2 +* [CartManager] create unique key for cart items by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2510 +* [Core] Use order tokens in payment capture by @yariksheptykin in https://github.com/coreshop/CoreShop/pull/2515 +* [Core] add caching for recursive variant checking by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2520 +* use null coalescing operator against maxUsagePerUser by @sovlerat in https://github.com/coreshop/CoreShop/pull/2524 + +# 3.2.1 +* [ClassDefinitionPatch] allow update of field-definitions instead of replace by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2494 +* [Product] assert range sort for qpr by @solverat in https://github.com/coreshop/CoreShop/pull/2498 +* [OrderEdit] allow 0 quantity by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2499 +* [ClassDefinitionPatch] Class patches array by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2496 + +# 3.2.0 + +* [Order] introduce feature to allow editing confirmed orders in backend by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2382 +* [Order] Backend Order Editing by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2397 +* [StorageListBundle] make restore cart after checkout configurable by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2428 +* [OrderEdit] don't allow cancelled orders to be editable by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2431 +* [Voucher] restrict voucher usage per customer by @Philip-Neusta in https://github.com/coreshop/CoreShop/pull/2451 +* [CoreBundle] introduce Product Price Rule that is not combinable with Cart Price Voucher Rule by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2458 +* [CoreBundle] fix migration to add immutable field to order by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2465 + +# 3.2.0-beta.1 + +* [StorageListBundle] make restore cart after checkout configurable by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2428 +* [OrderEdit] don't allow cancelled orders to be editable by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2431 + +# 3.2.0-beta.1 + +## Features + +- [Order] Backend Order Editing by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2397, https://github.com/coreshop/CoreShop/pull/2382 + diff --git a/CHANGELOG-4.0.x.md b/CHANGELOG-4.0.x.md index 76dec74c81..4749c57031 100644 --- a/CHANGELOG-4.0.x.md +++ b/CHANGELOG-4.0.x.md @@ -1,3 +1,62 @@ +# 4.0.5 + +* [Core] Pimcore 11.1 and 11.2 compatibility and psalm update by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2584 +* [NoteService] implement deadlock retry strategy by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2588 + +# 4.0.4 + +* [Docs] Improve resource bundle docs a bit by @jdreesen in https://github.com/coreshop/CoreShop/pull/2554 +* [OrderBundle] register OrderDocumentPrintController in controller.yml by @breakone in https://github.com/coreshop/CoreShop/pull/2557 +* [OrderBundle] cast return values for getWkHtmlToPdfBinary and getXvfb… by @breakone in https://github.com/coreshop/CoreShop/pull/2558 +* [Docs] improved installation instructions by @nehlsen in https://github.com/coreshop/CoreShop/pull/2569 + +# 4.0.3 + +* [Core] Fixes in DataObject Extensions and Subscribed Services by @solverat in https://github.com/coreshop/CoreShop/pull/2528 +* [MessengerBundle] make FailedMessageDetails and MessageDetails JsonSerializable by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2530 + +# 4.0.2 + +* [DataHub] only enable queries for selected entities by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2512 +* add address identifier repository to subscribed services by @solverat in https://github.com/coreshop/CoreShop/pull/2518 +* add guest condition by @breakone in https://github.com/coreshop/CoreShop/pull/2514 +* fix customer repository service link by @solverat in https://github.com/coreshop/CoreShop/pull/2523 + +# 4.0.1 + +* [Docs] Update docusaurus by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2490 +* [Resource] Update Select.php by @breakone in https://github.com/coreshop/CoreShop/pull/2489 +* [Product] use coreshop.form.factory in product unit definitions extension by @solverat in https://github.com/coreshop/CoreShop/pull/2501 + +# 4.0.0 + +* add missing subscribed services by @hethehe in https://github.com/coreshop/CoreShop/pull/2439 +* [Docs] update docs by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2455 +* fix workflow.registry service argument by @hethehe in https://github.com/coreshop/CoreShop/pull/2457 +* [StoreBundle] fix StoreCollector for backend by @codingioanniskrikos in https://github.com/coreshop/CoreShop/pull/2466 +* [Core] fix o_id usages by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2473 + +# 4.0.0-beta.4 + +* [Pimcore11] remove o_ column usages by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2413 +* [Pimcore11] fix return type for getChildCategories by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2414 +* can not save store shop settings by @sevarozh in https://github.com/coreshop/CoreShop/pull/2415 +* [Pimcore] require Pimcore 11.1 as minimum by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2423 +* Fix error in the filter functionality for multiselects by @hethehe in https://github.com/coreshop/CoreShop/pull/2426 + +# 4.0.0-beta.3 +- CoreShop 4.0.0 is the same as 3.2.0 will be, it contains all bug-fixes and feature from 3.1 and 3.2 + +## Bugs + - [ResourceBundle] fix CoreShopRelation and CoreShopRelations dynamic classes setter by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2396 + +## Features +### From 3.2 +- [Order] Backend Order Editing by @dpfaffenbauer in https://github.com/coreshop/CoreShop/pull/2397, https://github.com/coreshop/CoreShop/pull/2382 + +# 4.0.0-beta.2 + - CoreShop 4.0.0 is the same as 3.2.0 will be, it contains all bug-fixes and feature from 3.1 and 3.2 + # 4.0.0-beta.1 > CoreShop 4.0.0 is the same as 3.1.0, but with Pimcore 11 compatibility. Updating CoreShop therefore is quite easy. Since Symfony now doesn't have a full container anymore, we use Service Containers now for our Controllers. So your overwritten Controllers probably need changes. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ea0716fe6..1c20227947 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,6 +21,101 @@ your PR (if one is not already open), and your approach to solving it (not neces * [Fork us!](https://help.github.com/articles/fork-a-repo/) Code! Follow the coding standards PSR-1 and PSR-2 * [Send a pull request](https://help.github.com/articles/using-pull-requests/) from your fork’s branch to our `master` branch. +## Set up local development environment +This guide outlines the steps to set up CoreShop for development on your local machine. +### Prerequisites: +* Docker Desktop: Ensure you have Docker Desktop installed and running on your system. You can find download and installation instructions for Windows, Mac and Linux here: https://docs.docker.com/desktop/ or +* OrbStack (macOS only): Ensure you have OrbStack installed on your system. You can find download and installation instructions here: https://orbstack.dev/ + +### Step 1: Build docker images +Navigate to the cloned CoreShop directory in your terminal, and run the following command to build the Docker images: + +```shell +docker compose build --build-arg uid=$(id -u) --pull +``` + +### Step 2: Full Install +Run the following command to install Pimcore and CoreShop: +```shell +docker compose run --rm php bin/install +```` + +#### Step 3: Handle permissions +```shell +docker compose run --rm php chown www-data:www-data public/var/* var/* +``` +For Linux Native systems we also need to execute: +```shell +sudo chown -R $(id -u):$(id -g) +``` + +### Manual Installation +Optionally you can run the single steps: + +#### Step 1: Install Dependencies +Navigate to the cloned CoreShop directory in your terminal. + +Run the following command to install all the required dependencies using Composer: +```shell +docker compose run --rm php composer install +``` + +#### Step 2: Install Pimcore +Run the following command to install Pimcore using the provided Docker image: +```shell +docker compose run --rm php vendor/bin/pimcore-install --no-interaction --ignore-existing-config +``` + +#### Step 3: Install CoreShop +Run the following command to install CoreShop: +```shell +docker compose run --rm php bin/console coreshop:install +``` + +#### Step 4: Install Demo Data (Optional) +CoreShop offers a demo dataset for testing purposes. To install the demo data, run the following command: +```shell +docker compose run --rm php bin/console coreshop:install:demo +``` + +## Running Code Analysis +CoreShop provides options for running code analysis tools like Psalm and PHPStan. These tools help identify potential errors and improve code quality. +Run the following command to execute Psalm within a Docker container: + +```shell +docker compose run --rm php vendor/bin/psalm +``` + +Run the following command to run PHPStan with specific configuration options: +```shell +docker compose run --env SYMFONY_ENV=test --rm php vendor/bin/phpstan analyse -c phpstan.neon src -l 3 --memory-limit=-1 +``` + +## Running Tests + +Setup the behat container first by building the image and installing the dependencies: + +```shell +docker compose build --build-arg behat +``` + +### BEHAT Domain + +Run the following command to execute the domain tests: + +```shell +docker compose run --rm behat vendor/bin/behat -c behat.yml.dist -p default +``` + +### BEHAT UI + +UI tests require a running coreshop instance and a browser. Use the following command to run the UI tests +in a container: + +```shell +docker compose run --rm behat +``` + ### Contributor License Agreement The following terms are used throughout this agreement: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..2853c06a54 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM pimcore/pimcore:php8.2-debug-latest as dev +RUN set -eux; \ + apt-get update; \ + apt-get install -y $PHPIZE_DEPS libxslt1-dev; \ + docker-php-ext-install xsl; \ + sync; \ + apt-get purge -y $PHPIZE_DEPS; \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* +ARG uid=1000 +RUN usermod -u $uid www-data && chown -R www-data:www-data /var/www + +FROM dev as behat +RUN apt update && \ + apt install -y chromium chromium-driver + +# Install Symfony, Pimcore and CoreShop inside Tests container +# RUN wget https://get.symfony.com/cli/installer -O - | bash +RUN curl -1sLf 'https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh' | bash +RUN apt install symfony-cli + +ENV PANTHER_NO_SANDBOX=1 +ENV PANTHER_CHROME_ARGUMENTS='--disable-dev-shm-usage' +ENV CORESHOP_SKIP_DB_SETUP=1 +ENV PANTHER_NO_HEADLESS=0 +ENV APP_ENV="test" + diff --git a/README.md b/README.md index d234c6dbfb..e20604ebf2 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,36 @@ -![CoreShop](etc/logo.png) - ---- - -**CoreShop - Pimcore eCommerce** +**CoreShop - Pimcore enhanced eCommerce** ![Static Tests (Lint, Stan)](https://github.com/coreshop/CoreShop/actions/workflows/static.yml/badge.svg) -![Behat UI Tests](https://github.com/coreshop/CoreShop/workflows/Behat%20UI/badge.svg) -![Behat Tests](https://github.com/coreshop/CoreShop/workflows/Behat/badge.svg) +[![Behat UI](https://github.com/coreshop/CoreShop/actions/workflows/behat_ui.yml/badge.svg)](https://github.com/coreshop/CoreShop/actions/workflows/behat_ui.yml) +[![Behat](https://github.com/coreshop/CoreShop/actions/workflows/behat.yml/badge.svg)](https://github.com/coreshop/CoreShop/actions/workflows/behat.yml) [![Software License](https://img.shields.io/badge/license-GPLv3-brightgreen.svg?style=flat)](LICENSE.md) [![Latest Pre-Release](https://img.shields.io/packagist/vpre/coreshop/core-shop.svg)](https://www.packagist.org/packages/coreshop/core-shop) -[CoreShop](https://www.coreshop.org) is a eCommerce Platform for [Pimcore](http://www.pimcore.org). - -![CoreShop Interface](docs/img/screenshot5.png) +[![CoreShop](etc/illustration.png 'CoreShop')](https://www.coreshop.org) -# Requirements - - Pimcore `^11.0` - -# Installation - - Allow dev version to be installed: - ``` - composer config "minimum-stability" "dev" - composer config "prefer-stable" "true" - ``` - - Install with composer - ``` - composer require coreshop/core-shop:^4.0 - ``` - - Run enable Bundle command - ``` - php bin/console pimcore:bundle:enable CoreShopCoreBundle - ``` - - Run Install Command - ``` - php bin/console coreshop:install - ``` - - Optional: Install Demo Data - ``` - php bin/console coreshop:install:demo - ``` -## Messenger -CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data -``` -bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300 -``` +CoreShop harnesses Pimcore's advanced features for unmatched efficiency and customization in your online store. Dive +into a seamless blend of cutting-edge technology and user-friendly interfaces, crafting an eCommerce experience that +transcends ordinary transactions. # Further Information - - [Website](https://www.coreshop.org) - - [Documentation](https://docs.coreshop.org/latest) - - [Pimcore Forum](https://talk.pimcore.org) - -# Demo -You can see a running demo here [CoreShop 3.x Demo](https://demo3.coreshop.org) - -**Backend Credentials** - -``` -Admin: https://demo3.coreshop.org/admin -Username: admin -Password: coreshop -``` +- [Website](https://www.coreshop.org) +- [Documentation](https://docs.coreshop.org/latest) +- [Pimcore Github](https://github.com/pimcore/pimcore) -## Running Tests Locally -### Psalm -``` -vendor/bin/psalm -``` +# Requirements -### PHPStan -``` -SYMFONY_ENV=test vendor/bin/phpstan analyse -c phpstan.neon src -l 3 --memory-limit=-1 -``` +- Pimcore `^11.1` -### BEHAT Domain -``` -CORESHOP_SKIP_DB_SETUP=1 PIMCORE_TEST_DB_DSN=mysql://root:ROOT@coreshop-next/coreshop4___behat vendor/bin/behat -c behat.yml.dist -p default -``` +# Installation -### BEHAT UI -``` -vendor/bin/bdi detect drivers +Read our Documentation for the Installation Guide [here](https://docs.coreshop.org/CoreShop/Getting_Started/Installation) -# Install Pimcore and CoreShop in Test Env -APP_ENV=test PIMCORE_TEST_DB_DSN=mysql://root:ROOT@coreshop-next/coreshop4___behat PIMCORE_INSTALL_ADMIN_USERNAME=admin PIMCORE_INSTALL_ADMIN_PASSWORD=admin PIMCORE_INSTALL_MYSQL_HOST_SOCKET=coreshop-next PIMCORE_INSTALL_MYSQL_USERNAME=root PIMCORE_INSTALL_MYSQL_PASSWORD=ROOT PIMCORE_INSTALL_MYSQL_DATABASE=coreshop4___behat PIMCORE_INSTALL_MYSQL_PORT=3306 PIMCORE_KERNEL_CLASS=Kernel vendor/bin/pimcore-install --env=test --skip-database-config -APP_ENV=test PIMCORE_CLASS_DIRECTORY=var/tmp/behat/var/classes PIMCORE_TEST_DB_DSN=mysql://root:ROOT@coreshop-next/coreshop4___behat bin/console coreshop:install +# Demo -# OUTSIDE CONTAINER -# Run Symfony Server -APP_ENV=test PIMCORE_TEST_DB_DSN=mysql://root:ROOT@127.0.0.1:3306/coreshop4___behat symfony server:start --port=9080 --dir=public --no-tls +Discover the full potential of CoreShop through our interactive demos. Read more about this [here](https://docs.coreshop.org/CoreShop/Getting_Started/Demo) -# Run Behat -CORESHOP_SKIP_DB_SETUP=1 PANTHER_EXTERNAL_BASE_URI=http://127.0.0.1:9080/index_test.php PANTHER_NO_HEADLESS=0 PIMCORE_TEST_DB_DSN=mysql://root:ROOT@127.0.0.1:3306/coreshop4___behat php -d memory_limit=-1 vendor/bin/behat -c behat.yml.dist -p ui -vvv -``` +## Copyright and license -## Copyright and license Copyright: [CoreShop GmbH](https://www.coreshop.org) -For licensing details please visit [LICENSE.md](LICENSE.md) - -## Screenshots -![CoreShop Interface](docs/img/screenshot5-2.png) -![CoreShop Interface](docs/img/screenshot5-3.png) +For licensing details please visit [LICENSE.md](LICENSE.md) \ No newline at end of file diff --git a/behat-bootstrap.php b/behat-bootstrap.php index 5693c4c36a..dc04b68cfd 100755 --- a/behat-bootstrap.php +++ b/behat-bootstrap.php @@ -19,13 +19,6 @@ ); } -if (!defined('TESTS_PATH')) { - define('TESTS_PATH', __DIR__); -} - -define('PIMCORE_CLASS_DIRECTORY', __DIR__ . '/var/tmp/behat/var/classes'); -define('PIMCORE_TEST', true); - ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); diff --git a/bin/console b/bin/console index a87ce17b45..dbc8a166aa 100755 --- a/bin/console +++ b/bin/console @@ -11,34 +11,27 @@ * @license https://www.coreshop.org/license GPLv3 and CCL */ -ob_get_clean(); - -if (file_exists($a = getcwd() . '/vendor/autoload.php')) { - include $a; -} elseif (file_exists($a = __DIR__ . '/../../../../vendor/autoload.php')) { - include $a; -} elseif (file_exists($a = __DIR__ . '/../vendor/autoload.php')) { - include $a; +use Pimcore\Bootstrap; +use Pimcore\Console\Application; + +if (file_exists($a = getcwd() . '/vendor/autoload_runtime.php')) { + require_once $a; +} elseif (file_exists($a = __DIR__ . '/../vendor/autoload_runtime.php')) { + require_once $a; +} elseif (file_exists($a = __DIR__ . '/../../../../vendor/autoload_runtime.php')) { + require_once $a; +} elseif (file_exists($a = __DIR__ . '/../autoload_runtime.php')) { + require_once $a; } else { - fwrite(STDERR, 'Cannot locate autoloader; please run "composer install"' . PHP_EOL); - exit(1); + throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".'); } -\Pimcore\Bootstrap::setProjectRoot(); - define('PIMCORE_CONSOLE', true); +Bootstrap::setProjectRoot(); -$input = new \Symfony\Component\Console\Input\ArgvInput(); -if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) { - putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); -} - -if ($input->hasParameterOption('--no-debug', true)) { - putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); -} +return static function (array $context) { + $kernel = Bootstrap::startupCli(); -/** @var \Pimcore\Kernel $kernel */ -$kernel = \Pimcore\Bootstrap::startupCli(); -$application = new \Pimcore\Console\Application($kernel); -$application->run(); + return new Application($kernel); +}; \ No newline at end of file diff --git a/bin/install b/bin/install new file mode 100755 index 0000000000..70ba9dc971 --- /dev/null +++ b/bin/install @@ -0,0 +1,6 @@ +#!/bin/bash + +composer install +vendor/bin/pimcore-install --no-interaction +bin/console coreshop:install +bin/console coreshop:install:demo \ No newline at end of file diff --git a/composer.json b/composer.json index 2c1fd711cd..3cebc0194f 100644 --- a/composer.json +++ b/composer.json @@ -86,7 +86,7 @@ "require": { "php": "^8.0", "ext-json": "*", - "dachcom-digital/emailizr": "^2.0.0", + "dachcom-digital/emailizr": "^3.0", "doctrine/data-fixtures": "^1.5", "doctrine/doctrine-bundle": "^2.4", "doctrine/doctrine-fixtures-bundle": "^3.4", @@ -101,12 +101,12 @@ "payum/payum-bundle": "^2.5", "php-http/guzzle7-adapter": "^1.0", "php-http/message-factory": "^1.1", - "pimcore/admin-ui-classic-bundle": "^1.0", + "pimcore/admin-ui-classic-bundle": "^1.2", "pimcore/google-marketing-bundle": "^1.0", "pimcore/newsletter-bundle": "^1.0", - "pimcore/pimcore": "^11.0", + "pimcore/pimcore": "^11.1", "rinvex/countries": "^7.3", - "sebastian/diff": "^4.0 | ^5.0", + "sebastian/diff": "^4.0 | ^5.0 | ^6.0", "stof/doctrine-extensions-bundle": "^1.6", "sylius/theme-bundle": "^2.2", "symfony/dotenv": "^6.3", @@ -130,15 +130,16 @@ "phpstan/phpstan-doctrine": "^1.3.40", "phpstan/phpstan-symfony": "^1.3.2", "phpstan/phpstan-webmozart-assert": "^1.2.4", - "phpunit/phpunit": "^9.5", + "phpunit/phpunit": "^10.0", "robertfausk/behat-panther-extension": "^1.0", "symfony/panther": "^2.0", + "symfony/runtime": "^6.3", "symplify/easy-coding-standard": "^11.1", - "vimeo/psalm": "^4.10" + "vimeo/psalm": "^5.23" }, "conflict": { "jms/serializer-bundle": "4.1.0", - "league/csv": ">= 9.11" + "twig/twig": "^3.9.0" }, "suggest": { "dpfaffenbauer/process-manager": "Allows to start Processes from within Pimcore UI and also tracks the status." @@ -180,7 +181,8 @@ "config": { "sort-packages": true, "allow-plugins": { - "phpstan/extension-installer": false + "phpstan/extension-installer": false, + "symfony/runtime": true } } } diff --git a/docker-compose.yaml b/docker-compose.yaml index 686bb48288..d7e8b87aa6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,76 +1,99 @@ -version: '3.4' +name: 'coreshop-4' -networks: - cors_dev: - external: true - coreshop_4: - external: false +x-php: &php + volumes: + - .:/var/www/html + # Reset xdebug configuration to default + - /dev/null:/usr/local/etc/php/conf.d/20-xdebug.ini:ro + environment: + PHP_IDE_CONFIG: serverName=localhost + # Enable step debugging and development helpers by default. + # `debug`-mode in conjuction with `trigger` (default) in `xdebug.start_with_request` enables step-debugging + # only if a "trigger" (i.e. `XDEBUG_TRIGGER`) is present. Refer to + # [start_with_request](https://xdebug.org/docs/all_settings#start_with_request) documentation of how to trigger + # step debugging with `trigger`. + # To configure PhpStorm for step-debugging with xdebug see: https://www.jetbrains.com/help/phpstorm/2021.3/zero-configuration-debugging.html#start-debugging-session + # See: https://xdebug.org/docs/all_settings#mode + XDEBUG_MODE: debug + # This forces xdebug to always connect to the debug client running on docker host (host.docker.internal). + # It will work without further configuration with [Docker Desktop](https://www.docker.com/products/docker-desktop). + # See: https://xdebug.org/docs/all_settings#client_host + XDEBUG_CONFIG: client_host=host.docker.internal + COMPOSER_HOME: /var/www/html + PIMCORE_DB_DSN: "mysql://pimcore:pimcore@db:3306/pimcore" + PIMCORE_INSTALL_ADMIN_USERNAME: "admin" + PIMCORE_INSTALL_ADMIN_PASSWORD: "admin" + PIMCORE_INSTALL_MYSQL_HOST_SOCKET: "db" + PIMCORE_INSTALL_MYSQL_USERNAME: "pimcore" + PIMCORE_INSTALL_MYSQL_PASSWORD: "pimcore" + PIMCORE_INSTALL_MYSQL_DATABASE: "pimcore" + PIMCORE_INSTALL_MYSQL_PORT: "3306" + PIMCORE_INSTALL_INSTALL_BUNDLES: "PimcoreApplicationLoggerBundle,PimcoreCustomReportsBundle,PimcoreGlossaryBundle,PimcoreSeoBundle,PimcoreSimpleBackendSearchBundle,PimcoreStaticRoutesBundle,PimcoreTinymceBundle,PimcoreUuidBundle,PimcoreWordExportBundle,PimcoreXliffBundle" + extra_hosts: + - "host.docker.internal:host-gateway" services: db: - image: mysql:8 - container_name: coreshop-4 - networks: - - cors_dev - - coreshop_4 + container_name: coreshop4-db + image: mariadb:10.5 working_dir: /application - command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_general_ci] - ports: - - "3306:3306" + command: [ mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_general_ci ] volumes: - - coreshop-4:/var/lib/mysql + - db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=ROOT - MYSQL_DATABASE=pimcore - MYSQL_USER=pimcore - MYSQL_PASSWORD=pimcore + expose: + - "3306" nginx: + container_name: coreshop4-nginx image: nginx:stable-alpine - container_name: coreshop-4-nginx volumes: - - .:/var/www/html:cached - - ./.docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro + - .:/var/www/html + - ./.docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - php - - php-debug - networks: - - cors_dev - - coreshop_4 - labels: - - traefik.enable=true - - traefik.http.routers.coreshop_4.rule=Host(`coreshop-4.localhost`) - - traefik.http.routers.coreshop_4.entrypoints=cors_dev - - traefik.http.routers.coreshop_4.tls=true - - traefik.http.services.coreshop_4.loadbalancer.server.port=80 - - traefik.docker.network=cors_dev + ports: + - "80:80" php: - image: pimcore/pimcore:php8.2-latest - container_name: coreshop-4-php - networks: - - coreshop_4 - environment: - COMPOSER_HOME: /var/www/html + <<: *php + container_name: coreshop4-php + image: coreshop/coreshop:PHP8.1-fpm-debug + build: + target: dev + args: + uid: ${USER_ID:-1000} depends_on: - db - volumes: - - .:/var/www/html:cached - php-debug: - image: pimcore/pimcore:php8.2-debug-latest - container_name: coreshop-4-php-debug - networks: - - coreshop_4 + behat: + <<: *php + container_name: coreshop4-behat + image: coreshop/coreshop:PHP8.1-fpm-debug-behat + build: + target: behat + args: + uid: ${USER_ID:-1000} + profiles: + - behat depends_on: - db - volumes: - - .:/var/www/html:cached environment: - PHP_IDE_CONFIG: serverName=localhost - XDEBUG_TRIGGER: PHPSTORM - COMPOSER_HOME: /var/www/html - XDEBUG_HOST: 198.19.248.254 + PIMCORE_TEST_DB_DSN: "mysql://pimcore:pimcore@db:3306/pimcore" + PIMCORE_KERNEL_CLASS: 'Kernel' + PIMCORE_CLASS_DIRECTORY: 'var/tmp/behat/var/classes' + command: + - bash + - -c + - | + set -e; + vendor/bin/bdi detect drivers; + symfony server:start --port=9080 --dir=public --no-tls -d; + CORESHOP_SKIP_DB_SETUP=1 PANTHER_EXTERNAL_BASE_URI=http://127.0.0.1:9080/index_test.php PANTHER_NO_HEADLESS=0 php -d memory_limit=-1 vendor/bin/behat -c behat.yml.dist -p ui volumes: - coreshop-4: + db: diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index b2d6de3062..0000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Dependencies -/node_modules - -# Production -/build - -# Generated files -.docusaurus -.cache-loader - -# Misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/docs/00_Introduction.md b/docs/00_Introduction.md new file mode 100644 index 0000000000..6c28b7aaae --- /dev/null +++ b/docs/00_Introduction.md @@ -0,0 +1,31 @@ +--- +slug: / +title: Introduction +--- + +# Introduction to CoreShop - Pimcore eCommerce Framework + +Welcome to the CoreShop documentation. This section is designed for developers and provides comprehensive information on +utilizing CoreShop within Pimcore, a powerful and flexible eCommerce solution. + +![illustration.png](img%2Fillustration.png) + +## Quick Navigation Guide + +Our documentation is organized into easy-to-navigate sections, each tailored to different aspects of CoreShop: + +- **Getting Started**: Visit the [Getting Started](./01_Getting_Started/index.md) section for an introduction to + CoreShop, including installation instructions. +- **Bundles Overview**: Explore the [Bundles](./03_Bundles/index.md) section to understand the various CoreShop Bundles + and their functionalities. +- **User Documentation**: For configuration details and user-oriented instructions, see + the [User Documentation](./02_User_Documentation/index.md). +- **Developer Guide**: If you're looking to develop with CoreShop, check out + our [Development](./03_Development/index.md) section for in-depth technical information. + +## Explore CoreShop in Action + +- **Live Demo**: Experience CoreShop firsthand and use our [CoreShop Demo](https://demo4.coreshop.org) as a blueprint + for your implementations. + +For more information about Pimcore itself, visit [pimcore.com](https://pimcore.com). diff --git a/docs/01_Getting_Started/00_Installation.md b/docs/01_Getting_Started/00_Installation.md new file mode 100644 index 0000000000..963f160ef4 --- /dev/null +++ b/docs/01_Getting_Started/00_Installation.md @@ -0,0 +1,91 @@ +# Installation + +To install CoreShop, ensure you have a running instance of Pimcore on your system. Follow these steps to set up +CoreShop: + +## Initial Setup + +1. Install with composer: `composer require coreshop/core-shop ^4.0` +2. Enable the bundle in `config/bundles.php` and the `CoreShopCoreBundle` to the list of Bundles to load: + ```php + ['all' => true], + ]; + ``` +3. To configure the CoreShop Password Hasher, create or update the `config/packages/pimcore.yaml` and add: + ```yaml + pimcore: + security: + password_hasher_factories: + Pimcore\Model\DataObject\CoreShopUser: coreshop.security.user.password_hasher_factories + ``` +4. Update `config/packages/security.yaml` to allow access to the CoreShop Backend. + - Add the CoreShop Frontend parameter at the very top of your `security.yaml` (before `security`): + ```yaml + parameters: + coreshop.security.frontend_regex: "^/(?!admin)[^/]*" + + security: + ... + ``` + - Add the Authentication Provider. Find your existing `providers` entry and add the `coreshop_user` entry after the other(s): + ```yaml + providers: + ... + coreshop_user: + id: CoreShop\Bundle\CoreBundle\Security\ObjectUserProvider + ``` + - Add the Firewall Config. Find your existing `firewalls` entry and add the `coreshop_frontend` entry after the other entries: + ```yaml + firewalls: + coreshop_frontend: + provider: coreshop_user + pattern: '%coreshop.security.frontend_regex%' + context: shop + form_login: + login_path: coreshop_login + check_path: coreshop_login_check + provider: coreshop_user + failure_path: coreshop_login + default_target_path: coreshop_index + use_forward: false + use_referer: true + remember_me: + secret: "%secret%" + name: APP_CORESHOP_REMEMBER_ME + lifetime: 31536000 + remember_me_parameter: _remember_me + logout: + path: coreshop_logout + target: coreshop_login + invalidate_session: false + ``` + - Add Access Control. Find your existing `access_control` entry and add the following lines after the existing ones: + ```yaml + access_control: + - { path: "%coreshop.security.frontend_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } + - { path: "%coreshop.security.frontend_regex%/_partial", role: ROLE_NO_ACCESS } + ``` +5. Run Install Command `php bin/console coreshop:install` +6. Optional: Install Demo Data `php bin/console coreshop:install:demo` + +## Messenger + +CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. +Please run these 2 transports to process the data + +```yaml +bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300 +``` + +## Payment + +CoreShop uses Payum for Payment. Checkout Payum's Documentation on how to add payment providers. + +Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all +available payment modules via composer + +[Payum Documentation](https://github.com/Payum/Payum/blob/master/docs/index.md#symfony-payum-bundle) diff --git a/docs/01_Getting_Started/01_Architecture_Overview.md b/docs/01_Getting_Started/01_Architecture_Overview.md new file mode 100644 index 0000000000..95231eeb6c --- /dev/null +++ b/docs/01_Getting_Started/01_Architecture_Overview.md @@ -0,0 +1,52 @@ +# Architecture + +CoreShop is an open-source (GPL license) eCommerce solution, maintained and financed by CoreShop GmbH. It benefits from +a diverse community of developers and companies contributing to its development. + +## Core Values and Distinctions + +CoreShop stands out for its: + +- **Components-Based Approach**: Offering modularity and flexibility. +- **Unlimited Flexibility and Customization**: Easily tailored to specific needs. +- **Developer-Friendly**: Incorporates the latest technologies. +- **High-Quality Code**: Focus on robust and reliable coding practices. + +# The Three Natures of CoreShop + +CoreShop combines three distinct elements: + +1. **Decoupled eCommerce Components**: Written in PHP for flexibility. +2. **Symfony Bundles**: Integrating components into the full-stack Symfony framework. +3. **Complete eCommerce Suite**: A cohesive solution crafted from these building blocks. + +CoreShop can be utilized in various ways: as standalone components in any framework, as bundles in a new or existing +Pimcore application, or as a full-stack suite. + +# CoreShop Suite + +This documentation focuses on the CoreShop full-stack eCommerce suite. As a standard Pimcore Bundle, it provides the +foundation for common webshop functionality and custom systems. + +# Leveraging Symfony Bundles + +For custom systems built from scratch, CoreShop's standalone Symfony bundles can be integrated into your project. +Installation instructions are available in each bundle's documentation. + +## Difference to the Official Pimcore eCommerce Framework + +While the Pimcore eCommerce Framework offers a basic toolset for eCommerce development, CoreShop extends this with a +feature-rich set of tools for complex and rich eCommerce solutions. + +> **Example I:** The Framework does not fully support complex shipping price calculations. This requires custom coding. +> CoreShop, however, includes Carriers and Shipping Rules for such functionality. + +CoreShop's bundles are designed for individual use, with the CoreBundle combining all features for a comprehensive +solution. + +# Architecture Overview + +CoreShop Suite is built upon CoreShop Components and Bundles. The CoreBundle and CoreComponent unify these elements into +a cohesive eCommerce Suite for both B2B and B2C solutions. + +![Architecture](img/architecture.png) diff --git a/docs/01_Getting_Started/02_Upgrade_Notes.md b/docs/01_Getting_Started/02_Upgrade_Notes.md new file mode 100644 index 0000000000..0adcb21f2c --- /dev/null +++ b/docs/01_Getting_Started/02_Upgrade_Notes.md @@ -0,0 +1,1527 @@ +# Upgrade Notes + +Always check this page for some important upgrade notes before updating to the latest coreshop build. + +# 4.0.0-beta.1 + +> CoreShop 4.0.0 is the same as 3.1.0, but with Pimcore 11 compatibility. Updating CoreShop therefore is quite easy. +> Since Symfony now doesn't have a full container anymore, we use Service Containers now for our Controllers. So your +> overwritten Controllers probably need changes. + +- Pimcore 11 + Compatibility (https://github.com/coreshop/CoreShop/pull/2252, https://github.com/coreshop/CoreShop/pull/2340, https://github.com/coreshop/CoreShop/pull/2345, https://github.com/coreshop/CoreShop/pull/2352, https://github.com/coreshop/CoreShop/pull/2321, https://github.com/coreshop/CoreShop/pull/2347) + +## Pimcore 10.6 + +If you update to Pimcore 10.6 and you get following +error: ```"You have requested a non-existent parameter "coreshop.model.user.class"``` then check if you have this config +in your `security.yaml`: + +```yaml +pimcore: + security: + encoder_factories: + ‘%coreshop.model.user.class%’: coreshop.security.user.password_encoder_factory +``` + +If you have that, remove that entry. CoreShop internally sets that anyway. + +Also check the priority of which the `CoreShopCoreBundle` gets loaded. It has to be loaded before Pimcore, so set the +priority to '1000': + +```php +addBundle(new \CoreShop\Bundle\CoreBundle\CoreShopCoreBundle(), 1000); + } +} +``` + +## 3.0.x + +### 3.0.4 + +#### Bugs + +- [PimcoreBundle] fix SluggableLinkGenerator DI Config (https://github.com/coreshop/CoreShop/pull/2218) +- [CoreBundle] Fix Grid Column Config (https://github.com/coreshop/CoreShop/pull/2215) +- [CoreBundle] Improve payment detail rendering (https://github.com/coreshop/CoreShop/pull/2207) +- [CoreBundle] Move Cart Subtotal Calculation To Dedicated Cart + Processor (https://github.com/coreshop/CoreShop/pull/2205) +- [FrontendBundle] fix only showing customer orders and not cars too (https://github.com/coreshop/CoreShop/pull/2201) +- [IndexBundle] check recursively child elements (https://github.com/coreshop/CoreShop/pull/2200) +- [CoreBundle] set corret store value attributes (https://github.com/coreshop/CoreShop/pull/2197) +- [Core] allow decoration of StackRepository (https://github.com/coreshop/CoreShop/pull/2196) +- [CoreBundle] surcharge is possible to be more than item value (https://github.com/coreshop/CoreShop/pull/2192) +- [ShippingBundle] allow min.amount from to be 0 (https://github.com/coreshop/CoreShop/pull/2195) +- [Payum] don't use dev version (https://github.com/coreshop/CoreShop/pull/2193) + +### 3.0.3 + +- Feature + - [StorageList] allow for shareable StorageLists (eg. wishlist) (https://github.com/coreshop/CoreShop/pull/2150) + +- Bugs + - [StorageListItem] add definitive StorageList (Order/Wishlist) field to + Item (https://github.com/coreshop/CoreShop/pull/2117) + - [FrontendBundle] keep a reference to the just-removed Product (https://github.com/coreshop/CoreShop/pull/2125) + - [MessengerBundle] only allow to list ListableReceiverInterface (https://github.com/coreshop/CoreShop/pull/2127) + - [MessengerBundle] standalone fixes (https://github.com/coreshop/CoreShop/pull/2130) + - [Slug] improve slug generation and don't store slugs for every site if the + same (https://github.com/coreshop/CoreShop/pull/2131) + - [MoneyBundle] fix issue with not-nullable types and null values (https://github.com/coreshop/CoreShop/pull/2138) + - [Resource] add return types for BigIntIntegerType (https://github.com/coreshop/CoreShop/pull/2140) + - [LinkGeneration] introduce possibility to disable slugs and use fallback + routes (https://github.com/coreshop/CoreShop/pull/2143) + - [Payum] use stable payum release (https://github.com/coreshop/CoreShop/pull/2141) + - [FrontendBundle] use asset() helper for logo image (https://github.com/coreshop/CoreShop/pull/2137) + - [CoreBundle] Fix migration for price_rules in OrderItem class (https://github.com/coreshop/CoreShop/pull/2145) + - [CoreBundle] Add layout price_rules only once to OrderItem (https://github.com/coreshop/CoreShop/pull/2148) + - [StorageList & Slug] fixes for shared wishlist & slugs (https://github.com/coreshop/CoreShop/pull/2151) + - [CoreBundle] Use valid key in user migration (https://github.com/coreshop/CoreShop/pull/2159) + - [CoreBundle] fix price_rule migration section (https://github.com/coreshop/CoreShop/pull/2160) + - [StorageList] Fix SessionStorageManager (https://github.com/coreshop/CoreShop/pull/2165) + - [IndexBundle] check if index value is null before exploding (https://github.com/coreshop/CoreShop/pull/2163) + - [IndexBundle] process children within same Handler (https://github.com/coreshop/CoreShop/pull/2171) + +### 3.0.2 + +> Please make sure you also start the messenger worker for the CoreShop Tasks +> ```bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300``` + +- Features + - [Messenger] introduce Messenger + Bundle (https://github.com/coreshop/CoreShop/pull/2105, https://github.com/coreshop/CoreShop/pull/2114, https://github.com/coreshop/CoreShop/pull/2112, https://github.com/coreshop/CoreShop/pull/2106) + +- Bugs + - [CartPiceRules] fix OrderItem not finding Order with + CartItemPriceRules (https://github.com/coreshop/CoreShop/pull/2116) + - [StorageList] fix storage-list priority (https://github.com/coreshop/CoreShop/pull/2113) + - [ResourceBundle] class names with lower-case names (https://github.com/coreshop/CoreShop/pull/2097) + - [Checkout] introduce Payment Provider Validator to check if the selected one is still + valid (https://github.com/coreshop/CoreShop/pull/2111) + - [Unit] fix issues with unit selection in ui (https://github.com/coreshop/CoreShop/pull/2104) + - [CustomerAssignment] Fix typo when passing the company ID to the + router (https://github.com/coreshop/CoreShop/pull/2102) + - [CoreBundle] fix cart-item-rule discount action form (https://github.com/coreshop/CoreShop/pull/2101) + - [IndexBundle] fix: index table o_classId type fix (https://github.com/coreshop/CoreShop/pull/2095) + - [Menu] Use correct permission definition for product unit menu + item (https://github.com/coreshop/CoreShop/pull/2094) + +## 3.0.1 + +- Bugs + - [Translations] fix order object translations (https://github.com/coreshop/CoreShop/pull/2091) + - [Psalm] fixes (https://github.com/coreshop/CoreShop/pull/2089) + - [CustomerTransformHelper] Use company's name initial as parent folder for + companies (https://github.com/coreshop/CoreShop/pull/2082) + - [StorageListBundle] PimcoreStorageListRepository: Comply to PSR-4 autoloading + standards (https://github.com/coreshop/CoreShop/pull/2081) + - [ProductVariantTrait] Prevent MySQL syntax error (https://github.com/coreshop/CoreShop/pull/2086) + - [Wishlist] add tests and fix routing (https://github.com/coreshop/CoreShop/pull/2084) + +## 3.0.0 + +CoreShop is now Licenced under CCL and GPLv3! (https://github.com/coreshop/CoreShop/pull/2061) + +- Feature + - [IndexBundle] clone index, change default name of cloned item (https://github.com/coreshop/CoreShop/pull/2056) + - [CartPriceRules] introduce feature to allow cart-price rules based on + cart-items (https://github.com/coreshop/CoreShop/pull/2057, https://github.com/coreshop/CoreShop/pull/2060) + - [Wishlist] Introduce a persisted wishlist - StorageListBundle now works as a base for Order and + Wishlist (https://github.com/coreshop/CoreShop/pull/2030, https://github.com/coreshop/CoreShop/pull/2066) + - [Reports] Support filtering for order type (https://github.com/coreshop/CoreShop/pull/2055) + - [Symfony] fix Injecting @session is deprecated with Symfony (https://github.com/coreshop/CoreShop/pull/2035) + - [AccessManagement] prepare CoreShop for advanced + access-management (https://github.com/coreshop/CoreShop/pull/2063) + - [Pimcore] 10.5 as min requirement (https://github.com/coreshop/CoreShop/pull/2067) + +- Bugs + - [VariantBundle] Serializer: Allow `$innerObject` to be + null (https://github.com/coreshop/CoreShop/pull/2058, https://github.com/coreshop/CoreShop/pull/2069) + - [DataHub] Fix non unique typename (https://github.com/coreshop/CoreShop/pull/2004) + - [Translations] Update admin-translations.yml (https://github.com/coreshop/CoreShop/pull/2064) + - [Pimcore UI] Make default Product Unit unselectable (https://github.com/coreshop/CoreShop/pull/2065) + - [Variant] allow recursive attributes and variants (https://github.com/coreshop/CoreShop/pull/2068) + +### 3.0.0-beta.5 + +> This will be the last BETA for the final release. + +- Bugs + - [Frontend] fix controller overwriting (https://github.com/coreshop/CoreShop/pull/2017) + - Replaced old Registration Service with Customer Manager (https://github.com/coreshop/CoreShop/pull/2020) + - Update install guide while it is in beta (https://github.com/coreshop/CoreShop/pull/2019) + - [Frontend] fix getQuantityModifier return type (https://github.com/coreshop/CoreShop/pull/2024) + - Fix TagManagerEnhancedEcommerce (https://github.com/coreshop/CoreShop/pull/2027) + - [ProductBundle] fix saving of Price Rule Conditions and Actions when + creating (https://github.com/coreshop/CoreShop/pull/2029) + - [FrontendBundle] Consider UrlSlugs in the locale switcher (https://github.com/coreshop/CoreShop/pull/2032) + - [DB] Remove Migrate and ClassUpdate rename and fix psalm issues (https://github.com/coreshop/CoreShop/pull/2034) + - fix: property must not be accessed before initialization (https://github.com/coreshop/CoreShop/pull/2036) + - [MoneyBundle] bugfix unmarshalVersion for coreShopMoney (https://github.com/coreshop/CoreShop/pull/2037) + - [ThemeBundle] add document pre_renderer listener to resolve theme (https://github.com/coreshop/CoreShop/pull/2041) + - [OrderBundle] fix "coreshop_admin_order_find" route (https://github.com/coreshop/CoreShop/pull/2045) + - [Pimcore] add tests for ^10.5 (https://github.com/coreshop/CoreShop/pull/2043) + - [Events] fix pimcore events BC break (https://github.com/coreshop/CoreShop/pull/2046) + - [Tests] test against pimcore ^11.0 (https://github.com/coreshop/CoreShop/pull/2047) + - [CoreBundle] add typecasts for MoneyFormatter in Reports, bugfix + SQL (https://github.com/coreshop/CoreShop/pull/2048) + - [MoneyBundle] bugfix marshalVersion for coreShopMoney (https://github.com/coreshop/CoreShop/pull/2051) + - [MoneyBundle] bugfix setter code for FieldCollection (https://github.com/coreshop/CoreShop/pull/2052) + - [CoreBundle] check for null value in + CartStockAvailabilityValidator (https://github.com/coreshop/CoreShop/pull/2053) + +### 3.0.0-beta.4 + +- Feature + - [Variants] introduce Variant Bundle (https://github.com/coreshop/CoreShop/pull/1990) @breakone + - [Pimcore] require min 10.4 (https://github.com/coreshop/CoreShop/pull/2013) + +- Bugs + - [Store] add Store Resolver for document save from Pimcore Admin (https://github.com/coreshop/CoreShop/pull/1962) + - [ResourceBundle] add feature to clone resources (https://github.com/coreshop/CoreShop/pull/1965) + - [CartPriceRules] fix cart-price-rules with over 100% discount (https://github.com/coreshop/CoreShop/pull/1966) + - [Tests] re-enable cart tests (https://github.com/coreshop/CoreShop/pull/1970) + - [FrontendBundle] fix: paginator.html.twig prepends four spaces to + URLs (https://github.com/coreshop/CoreShop/pull/1968) + - [IndexBundle] fix Argument #2 (`$values`) must be of type array, string + given (https://github.com/coreshop/CoreShop/pull/1967) + - [CoreBundle] use themeHelper to resolve template in + StoreMailActionProcessor (https://github.com/coreshop/CoreShop/pull/1973) + - [Condition] fix rules being active even if inactive when having no + conditions (https://github.com/coreshop/CoreShop/pull/1977) + - [CoreBundle] Handle null addresses when persisting customers (https://github.com/coreshop/CoreShop/pull/1979) + - [ResourceBundle] fix ResourceSettingsController getConfigAction (https://github.com/coreshop/CoreShop/pull/1981) + - [CoreBundle] fix registered user validator (https://github.com/coreshop/CoreShop/pull/1980) + - [CustomerBundle] fix: wiring non-existing User classes which were migrated to + CustomerBundle (https://github.com/coreshop/CoreShop/pull/1984) + - [CoreBundle] Remove duplicate assignment (https://github.com/coreshop/CoreShop/pull/1985) + - [CoreBundle] Fix Typo in notifcation.yml (https://github.com/coreshop/CoreShop/pull/1988) + - [ResourceBundle] Fix grid view for orders/quotes/carts in admin (https://github.com/coreshop/CoreShop/pull/1989) + - [OrderBundle] Fix for order grid configs (https://github.com/coreshop/CoreShop/pull/1992) + - [Taxation] pass context into TaxCalculatorFactory (https://github.com/coreshop/CoreShop/pull/1978) + - [CoreBundle] use TaxationDisplayProvider in CarrierChoiceType (https://github.com/coreshop/CoreShop/pull/1994) + - [CoreBundle] Fix newsletter double opt in mail not sending (https://github.com/coreshop/CoreShop/pull/1993) + - [CoreBundle] added newline before phoneNumber in CountryFixture (https://github.com/coreshop/CoreShop/pull/1995) + - [CoreBundle] fix variant js, added variant select template (https://github.com/coreshop/CoreShop/pull/1997) + - [Checkout] change thank-you to work with token and fix strict samesite + cookies (https://github.com/coreshop/CoreShop/pull/1999) + - [Variant] add concrete return type to ui configuration (https://github.com/coreshop/CoreShop/pull/1996) + - [CoreBundle] fix event listeners for variants (https://github.com/coreshop/CoreShop/pull/2000) + - [Rule] use tags for TraceableRuleConditionsValidationProcessor (https://github.com/coreshop/CoreShop/pull/2002) + - [Guest] improve guest checkout to change address or use different one for + shipping (https://github.com/coreshop/CoreShop/pull/2003) + - [CoreBundle] use the index for categories to allow fine tuning the + menus (https://github.com/coreshop/CoreShop/pull/1915) + - [Pimcore] add dirname() and basename() to expression function + provider (https://github.com/coreshop/CoreShop/pull/2007) + - [Product Model] Allow getIndexableName() to return null (https://github.com/coreshop/CoreShop/pull/2009) + - [Doctrine] Use doctrine-extension 3.6.0 (https://github.com/coreshop/CoreShop/pull/2012) + +### 3.0.0-beta.3 + +- [IndexBundle] fix: generate the correct menu route (https://github.com/coreshop/CoreShop/pull/1815) +- [All] rename document coreshop editables (https://github.com/coreshop/CoreShop/pull/1822) +- [CoreBundle] Fix fetch of checkout_finisher url from request (https://github.com/coreshop/CoreShop/pull/1814) +- [FrontendBundle] Fix "Invoice Address is Shipping Address" in checkout address + step (https://github.com/coreshop/CoreShop/pull/1823) +- [CoreBundle] Add address parent check (https://github.com/coreshop/CoreShop/pull/1825) +- [Core] add is_null in isNewEntity for Customer (https://github.com/coreshop/CoreShop/pull/1830) +- [IndexBundle] add boolean filter condition (https://github.com/coreshop/CoreShop/pull/1834) +- [IndexBundle] add clear button for filter preSelect combos (https://github.com/coreshop/CoreShop/pull/1833) +- [OrderBundle] fix session cart subscriber when no session is + available (https://github.com/coreshop/CoreShop/pull/1836) +- [OrderBundle] cart context returns latest cart even if multiple found (https://github.com/coreshop/CoreShop/pull/1800) +- [ResourceBundle] fix resource list calling Pimcore Event and CoreShop Event to open + object (https://github.com/coreshop/CoreShop/pull/1838) +- [CoreBundle] Fix doctrine type in migration (followup of #1839) (https://github.com/coreshop/CoreShop/pull/1840) +- [List] fix open CoreShop Entry and Pimcore DataObject (https://github.com/coreshop/CoreShop/pull/1845) +- [Cache] optimize Pimcore cache with doctrine entities (https://github.com/coreshop/CoreShop/pull/1843) +- [FrontendBundle] fix: Since symfony/http-kernel 5.1: Referencing controllers with a single colon is + deprecated (https://github.com/coreshop/CoreShop/pull/1848/commits) +- [IndexBundle] Migrate to SettingsStoreAwareInstaller (https://github.com/coreshop/CoreShop/pull/1847) +- [FrontendBundle] Make category sort options configurable (https://github.com/coreshop/CoreShop/pull/1850) +- [Theme] fallback to SettableThemeContext (https://github.com/coreshop/CoreShop/pull/1851) +- [PimcoreBundle] added SluggableSlugger for SluggableListener (https://github.com/coreshop/CoreShop/pull/1857) +- [Pimcore] Definition Updater: check if we should use 'childs' or ' + children' (https://github.com/coreshop/CoreShop/pull/1858) +- [Core] address assignment manager should check for null (https://github.com/coreshop/CoreShop/pull/1863) +- [IndexBundle] decimal should be 10,2 (https://github.com/coreshop/CoreShop/pull/1862) +- [IndexBundle] QuantityValue ID's are strings (https://github.com/coreshop/CoreShop/pull/1861) +- [IndexBundle] Add pimcore.dataobject.postAdd event to index + DataObjects (https://github.com/coreshop/CoreShop/pull/1866) +- [PaymentBundle] Added payum payment model fields to coreshop payment + model (https://github.com/coreshop/CoreShop/pull/1854) +- [Taxation] add taxRate to TaxItemInterface (https://github.com/coreshop/CoreShop/pull/1867) +- [CoreBundle] fix quote notification sending (https://github.com/coreshop/CoreShop/pull/1868) +- [CoreBundle] fix quote notification sending 3.x (https://github.com/coreshop/CoreShop/pull/1869) +- [FrontendBundle] fix createQuoteAction (https://github.com/coreshop/CoreShop/pull/1870) +- [IndexBundle] FIX:double click on field group adds them to indices (https://github.com/coreshop/CoreShop/pull/1871) +- [CoreBundle] fix user-reset password notification sending (https://github.com/coreshop/CoreShop/pull/1877) +- [IndexBundle] FIX: localized fields from brick and fieldcollections can be added to + index (https://github.com/coreshop/CoreShop/pull/1872) +- [CurrencyBundle] fix exchange rate saving/deleting (https://github.com/coreshop/CoreShop/pull/1879) +- [PaymentBundle] FIX: coreshop_payment_provider editable select, wrong property + name (https://github.com/coreshop/CoreShop/pull/1883) +- [ResourceBundle] Make stack of classes not extended in CoreBundle + working (https://github.com/coreshop/CoreShop/pull/1882) +- [IndexBundle] FIX: select from multiselect throws error if no value is + pre-selected (https://github.com/coreshop/CoreShop/pull/1880) +- [ThemeBundle] improve loading theme when document cannot be loaded (https://github.com/coreshop/CoreShop/pull/1884) +- [ResourceBundle] fix entity-merger to delete collection entries (https://github.com/coreshop/CoreShop/pull/1887) +- [ProductBundle] fix translations (https://github.com/coreshop/CoreShop/pull/1888) +- [IndexBundle] fixed issue 1891, fix totalCount for pagination (https://github.com/coreshop/CoreShop/pull/1892) +- [UserBundle] Email field required on request reset password form (https://github.com/coreshop/CoreShop/pull/1893) +- [FrontendBundle] Category select template fix (https://github.com/coreshop/CoreShop/pull/1890) +- [IndexBundle] category multiselect (https://github.com/coreshop/CoreShop/pull/1899) +- [IndexBundle] extending condition proccesor adds empty tag (https://github.com/coreshop/CoreShop/pull/1900) +- [OrderBundle] Error during serialization of OrderInvoice (https://github.com/coreshop/CoreShop/pull/1903) +- [CoreBundle] don't load settings if user has no permission (https://github.com/coreshop/CoreShop/pull/1902) +- [NotificationBundle] Fixed invoice, payment, shipment state condition in + notifications (https://github.com/coreshop/CoreShop/pull/1905) +- [CoreBundle] Order mail note fix (https://github.com/coreshop/CoreShop/pull/1906) +- [ShippingBundle] Removed free shipping checkbog from carrier (https://github.com/coreshop/CoreShop/pull/1910) +- [FrontendBundle] logo in _header.html.twig no longer hardcoded (https://github.com/coreshop/CoreShop/pull/1908) +- [ProductBundle] duplicated unit definition title in product view in + admin (https://github.com/coreshop/CoreShop/pull/1894/files) +- [OrderBundle] Fix xvfb error (https://github.com/coreshop/CoreShop/pull/1911) +- [FrontendBundle] fix: paginator prev/next links point to first/last + page (https://github.com/coreshop/CoreShop/pull/1923) +- [CoreBundle] fix currency conversion (https://github.com/coreshop/CoreShop/pull/1889) +- [FrontendBundle] fix: use only first-level categories in CategoryController:: + menuAction (https://github.com/coreshop/CoreShop/pull/1914) +- [FrontendBundle] fix configuration for controller names (https://github.com/coreshop/CoreShop/pull/1919) +- [IndexBundle] don't lower-case interpreter types (https://github.com/coreshop/CoreShop/pull/1925) +- [IndexBundle] Category multiselect filter condition (https://github.com/coreshop/CoreShop/pull/1909) +- [PimcoreBundle] make command "coreshop:app:migration:generate" not + hidden (https://github.com/coreshop/CoreShop/pull/1927) +- [Installer] mark migrations as migrated in the installer (https://github.com/coreshop/CoreShop/pull/1928) +- [IndexBundle] fix saving quantity values for index conditions ([IndexBundle] fix saving quantity values for index + conditions) +- [IndexBundle] Search filter (https://github.com/coreshop/CoreShop/pull/1924) +- [NotificationBundle] fix reloading of Notification Conditions/Actions (https://github.com/coreshop/CoreShop/pull/1930) +- [Slug] fallback to ID if nameForSlug is null (https://github.com/coreshop/CoreShop/pull/1932) +- [ResourceBundle] fix creating static routes (https://github.com/coreshop/CoreShop/pull/1934) +- [FrontendBundle] Cart update and checkout validation for cart (https://github.com/coreshop/CoreShop/pull/1920) +- [FrontendBundle] fix styling of reset-password-request submit button (https://github.com/coreshop/CoreShop/pull/1935) +- [ProductBundle] fix ProductUnitDefinition unmarshal (https://github.com/coreshop/CoreShop/pull/1936) +- [Routing] fix route name coreshop_cart_create_quote (https://github.com/coreshop/CoreShop/pull/1937) +- [IndexBundle] Search filter dynamic name (https://github.com/coreshop/CoreShop/pull/1938) +- [IndexBundle] Fixed wrong categories returned when concatenator is + AND (https://github.com/coreshop/CoreShop/pull/1939) +- [CoreBundle] Profiler fix (https://github.com/coreshop/CoreShop/pull/1941) +- [FrontendBundle] Fix redirect to profile if customer is present (https://github.com/coreshop/CoreShop/pull/1942/files) +- [MoneyBundle] allow Money to be nullable (https://github.com/coreshop/CoreShop/pull/1949) +- [Pimcore] use min Pimcore 10.3 and fix tests ([Pimcore] use min Pimcore 10.3 and fix tests) +- [Quotes] introduce simple state machine (https://github.com/coreshop/CoreShop/pull/1948) +- [FrontendBundle] Add submit buttons for voucher submit and form update in cart + form (https://github.com/coreshop/CoreShop/pull/1950) +- [NotificationBundle] fix saving multiple emails (https://github.com/coreshop/CoreShop/pull/1954) +- + +### 3.0.0-beta.2 + +- [Order] remove unused CartRepository (https://github.com/coreshop/CoreShop/pull/1801) +- [PimcoreBundle] add coreshop:migration:migrate and coreshop:migration: + generate (https://github.com/coreshop/CoreShop/pull/1802) +- [FrontendBundle] fix new form namespace (https://github.com/coreshop/CoreShop/pull/1807) +- [Index] make ListingInterface a Pimcore PaginateListingInterface (https://github.com/coreshop/CoreShop/pull/1790) +- [Cart] fix existing cart initialization on customer login (https://github.com/coreshop/CoreShop/pull/1779) +- [CoreBundle] fix saving stores in PaymentProvider (https://github.com/coreshop/CoreShop/pull/1783) +- [Index] make IndexProcess compatible with the interface (https://github.com/coreshop/CoreShop/pull/1782) +- [User] remove md5 password and use password_hash (https://github.com/coreshop/CoreShop/pull/1780) +- [ThemeBundle] refactor theme-context to work with area-bricks (https://github.com/coreshop/CoreShop/pull/1778) +- [ThemeBundle] remove sylius theme-aware-translator, that doesn't work well with + Pimcore (https://github.com/coreshop/CoreShop/pull/1777) +- [ResourceBundle] allow easier custom resources (https://github.com/coreshop/CoreShop/pull/1776) +- [Index] remove dbal connection in AbstractListing (https://github.com/coreshop/CoreShop/pull/1769) +- [Store select / multiselect] Support getOptions() via option provider (https://github.com/coreshop/CoreShop/pull/1773) +- [CoreExtensions] refactor how Doctrine Entities are cloned (https://github.com/coreshop/CoreShop/pull/1770) +- [Faker] use fakerphp/faker (https://github.com/coreshop/CoreShop/pull/1768) +- [CoreBundle] remove duplicate paymentTotal and convertedPaymentTotal from class + definition (https://github.com/coreshop/CoreShop/pull/1766) +- [OrderBundle] fix admin en translations (https://github.com/coreshop/CoreShop/pull/1764) +- [All] remove installed translations and use symfony translations + instead (https://github.com/coreshop/CoreShop/pull/1762) + +### 3.0.0-beta.1 + +- PHP8.0 Return Types (https://github.com/coreshop/CoreShop/pull/1288, https://github.com/coreshop/CoreShop/pull/1666) +- Cart eq Order eq Quote - one Object to rule them all (https://github.com/coreshop/CoreShop/pull/1289) +- Strict Types (https://github.com/coreshop/CoreShop/pull/1294) +- make service-aliases deprecated and change all internal uses of it (https://github.com/coreshop/CoreShop/pull/1320) +- change IndexableInterface and pass IndexInterface (https://github.com/coreshop/CoreShop/pull/1326) +- remove php template helpers (https://github.com/coreshop/CoreShop/pull/1323) +- [Panther] Implement + ui-tests (https://github.com/coreshop/CoreShop/pull/1335, https://github.com/coreshop/CoreShop/pull/1347) +- introduce class translations (https://github.com/coreshop/CoreShop/pull/1349) +- change cart/order base-currency conversion (https://github.com/coreshop/CoreShop/pull/1324) +- Allow to create a new Customer within the order-creation Process (https://github.com/coreshop/CoreShop/pull/1236) +- introduce currency fraction display provider service (https://github.com/coreshop/CoreShop/pull/1394) +- introduce tax-display service (https://github.com/coreshop/CoreShop/pull/1393) +- integration to dachcom-digital/pimcore-seo (https://github.com/coreshop/CoreShop/pull/1399) +- remove usage of ItemKeyTransformer Service and use DataObject\Service + directly (https://github.com/coreshop/CoreShop/pull/1411) +- create default address if customer doesn't have one (https://github.com/coreshop/CoreShop/pull/1435) +- apply confirm and pay transition for orders with value of 0 (https://github.com/coreshop/CoreShop/pull/1434) +- resolve theme only if not in admin (https://github.com/coreshop/CoreShop/pull/1505) +- Pimcore X + Compatibility (https://github.com/coreshop/CoreShop/pull/1511, https://github.com/coreshop/CoreShop/pull/1574, https://github.com/coreshop/CoreShop/pull/1599, https://github.com/coreshop/CoreShop/pull/1621) +- migrate to sylius/theme-bundle (https://github.com/coreshop/CoreShop/pull/1513) +- implement new JS Routing and start with first backend tests (https://github.com/coreshop/CoreShop/pull/1420) +- some JMS fixes and payum concurrency test (https://github.com/coreshop/CoreShop/pull/1550) +- cleanup proposal stuff and fix serialization of Doctrine collections (https://github.com/coreshop/CoreShop/pull/1641) +- migrate migrations to Doctrine Migrations Bundle (https://github.com/coreshop/CoreShop/pull/1635) +- Feature/customer list (https://github.com/coreshop/CoreShop/pull/1667) +- Fix merge for index-conditions (https://github.com/coreshop/CoreShop/pull/1673) +- fix voucher modifier with empty voucher code (https://github.com/coreshop/CoreShop/pull/1672) +- [ResourceBundle] fix unserialization of CoreShop entities saved by pimcore auto + save (https://github.com/coreshop/CoreShop/pull/1674) +- split customer and user into seperate entities (https://github.com/coreshop/CoreShop/pull/1669) +- add proper events for cart-item add and remove (https://github.com/coreshop/CoreShop/pull/1676) +- Introduce a folder creation service which loads the paths directly from the + metadata (https://github.com/coreshop/CoreShop/pull/1677) +- Introduce payum payment bundle (https://github.com/coreshop/CoreShop/pull/1675) +- [Slug] default generate slugs and use instead of static routes for product and + category (https://github.com/coreshop/CoreShop/pull/1678, https://github.com/coreshop/CoreShop/pull/1701) +- [FrontendBundle] Macro "price" is not defined in template (https://github.com/coreshop/CoreShop/pull/1684) +- [SEO - ImageExtractor] Add thumbnail definition coreshop_seo (https://github.com/coreshop/CoreShop/pull/1688) +- [Shipping] Ability to hide carrier from checkout (https://github.com/coreshop/CoreShop/pull/1693) +- [Psalm] Introduce Psaml Tests for Components (https://github.com/coreshop/CoreShop/pull/1727) +- Removed security.yaml, since Pimcore 10, you have to define the security config yourself, just copy following to + config/packages/security.yaml (https://github.com/coreshop/CoreShop/pull/1599) + +```yaml +parameters: + coreshop.security.frontend_regex: "^/(?!admin)[^/]++" + +security: + providers: + coreshop_customer: + id: CoreShop\Bundle\CoreBundle\Security\ObjectUserProvider + firewalls: + coreshop_frontend: + anonymous: ~ + provider: coreshop_customer + pattern: '%coreshop.security.frontend_regex%' + context: shop + form_login: + login_path: coreshop_login + check_path: coreshop_login_check + provider: coreshop_customer + failure_path: coreshop_login + default_target_path: coreshop_index + use_forward: false + use_referer: true + remember_me: + secret: "%secret%" + name: APP_CORESHOP_REMEMBER_ME + lifetime: 31536000 + remember_me_parameter: _remember_me + logout: + path: coreshop_logout + target: coreshop_login + invalidate_session: false + success_handler: CoreShop\Bundle\CoreBundle\EventListener\ShopUserLogoutHandler + + access_control: + - { path: "%coreshop.security.frontend_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } + - { path: "%coreshop.security.frontend_regex%/_partial", role: ROLE_NO_ACCESS } + +``` + +## 2.2.x + +### 2.2.14 + +- Bugs: + - [ProductQuantityPriceRules] remove variable variables sign (https://github.com/coreshop/CoreShop/pull/1991) + +### 2.2.13 + +- Bugs: + - [ResourceBundle] fix ResourceSettingsController getConfigAction (https://github.com/coreshop/CoreShop/pull/1981) + +### 2.2.12 + +- Bugs: + - [FrontendBundle] Fix "Invoice Address is Shipping Address" in checkout address + step (https://github.com/coreshop/CoreShop/pull/1823) + - [OrderBundle] cart context returns latest cart even if multiple + found (https://github.com/coreshop/CoreShop/pull/1837) + - [FrontendBundle] Password reset: Clearer form labels (https://github.com/coreshop/CoreShop/pull/1855) + - [ResourceBundle] Fatal error when saving object with product-specific prices -> EntityMerger got object of wrong + class (https://github.com/coreshop/CoreShop/pull/1864) + - [ProductBundle] Add isEqual() for product-specific price (https://github.com/coreshop/CoreShop/pull/1844) + - [Pimcore] Fix delete icons in Pimcore backend (https://github.com/coreshop/CoreShop/pull/1885) + +### 2.2.11 + +- Bugs: + - [CoreExtensions] refactor how Doctrine Entities are cloned (https://github.com/coreshop/CoreShop/pull/1770) + - [Frontend] After renaming formtypes with coreshop[], form elements where not + found (https://github.com/coreshop/CoreShop/pull/1791) + - [Checkout] fix new form namespace (https://github.com/coreshop/CoreShop/pull/1807) + +### 2.2.10 + +- Bugs: + - [Shipping] make shipping calculation more independent from cart (https://github.com/coreshop/CoreShop/pull/1562) + - [PaymentBundle] Add PaymentProvider Multiselect CoreExtension (https://github.com/coreshop/CoreShop/pull/1585) + - [Address] prevent empty lines in address formatter (https://github.com/coreshop/CoreShop/pull/1587/files) + - [Core] remove country-aware currency context as it messes with the Storage Based Currency + Context (https://github.com/coreshop/CoreShop/pull/1588) + - [DoctrineCache] remove doctrine cache and all usages of useQueryCache and + useResultCache (https://github.com/coreshop/CoreShop/pull/1596) + - [FrontendBundle] use named forms where applicable (https://github.com/coreshop/CoreShop/pull/1597) + - [All] Add italian translations for validators (https://github.com/coreshop/CoreShop/pull/1595) + - [PaymentBundle] Fix provider multiselect (https://github.com/coreshop/CoreShop/pull/1601) + - [IndexBundle] Fix range filter to work if min/max value = 0 (https://github.com/coreshop/CoreShop/pull/1606) + - [Docs] Fixed typo (https://github.com/coreshop/CoreShop/pull/1608) + - [FrontendBundle] clear password reset hash after reset (https://github.com/coreshop/CoreShop/pull/1631) + - [ShippingBundle] fix configuration (https://github.com/coreshop/CoreShop/pull/1632) + - [PimcoreBundle] fix missing Multiselect (https://github.com/coreshop/CoreShop/pull/1614) + - [Fixtures] fix region_short for address format (https://github.com/coreshop/CoreShop/pull/1636) + - [Docs] Add missing process conditions in docs (https://github.com/coreshop/CoreShop/pull/1643) + - [FrontendBundle] fix having unique form-ids for cart add (https://github.com/coreshop/CoreShop/pull/1648) + - [Core] fix cloning and serializing (with DeepCopy) of + UnitDefinitions (https://github.com/coreshop/CoreShop/pull/1649) + - [Tracking] enable auto-configuration and auto-wiring with + configuration (https://github.com/coreshop/CoreShop/pull/1656) + - [Rule] refactor Rule conditions and actions persistence (https://github.com/coreshop/CoreShop/pull/1657) + - [OrderBundle] fix pagination in voucher codes and add pagination for csv + export (https://github.com/coreshop/CoreShop/pull/1662) + - [CoreBundle] remove zones from shipping rules installer (https://github.com/coreshop/CoreShop/pull/1664) + - [IndexBundle] add feature to rename tables when index get's + renamed (https://github.com/coreshop/CoreShop/pull/1663) + - [FrontendBundle] Print cart price rule label instead name if + available (https://github.com/coreshop/CoreShop/pull/1668) + - [Tests] Add Pimcore ~6.9.0 in behat test matrix (https://github.com/coreshop/CoreShop/pull/1670) + - [CoreBundle] Use right permission for tax rate (https://github.com/coreshop/CoreShop/pull/1681) + - [SEO] Add thumbnail definition coreshop_seo (https://github.com/coreshop/CoreShop/pull/1688) + - [Core] Fix: ProductRepository: Added missing placeholder (https://github.com/coreshop/CoreShop/pull/1708) + - [Docs] Quantity Price Rules (https://github.com/coreshop/CoreShop/pull/1716) + - [PimcoreBundle] super-select box readonly (https://github.com/coreshop/CoreShop/pull/1739) + +- Feature: + - [ProductQuantityPriceRules] add interface for QuantityPriceFetcher and + QuantityRuleFetcher (https://github.com/coreshop/CoreShop/pull/1628) + - [Payment] make payment description translatable (https://github.com/coreshop/CoreShop/pull/1633) + +### 2.2.9 + +- Bugs: + - [ResourceBundle] fix compatibility with Doctrine EventSubscriber (https://github.com/coreshop/CoreShop/pull/1580) + - [All] replace all usages of href with manyToOneRelation and multihref with + manyToManyRelation (https://github.com/coreshop/CoreShop/pull/1576) + - [OptimisticEntityLockBundle] fix version for Pimcore Extensions + UI (https://github.com/coreshop/CoreShop/pull/1577) + - [Models] strict defining of model trait methods (https://github.com/coreshop/CoreShop/pull/1578) + - [ProductBundle] use full unit definition label in choice field (https://github.com/coreshop/CoreShop/pull/1569) + - [ResourceBundle] check if instance is null before calling + class_implements (https://github.com/coreshop/CoreShop/pull/1566) + - [Admin] use form.Panel instead of form.FieldSet (panel supports + isDirty) (https://github.com/coreshop/CoreShop/pull/1561) + - [Resource] Provide Pimcore driver for Stack Repository (https://github.com/coreshop/CoreShop/pull/1567) + - [StoreBundle] fix cached store context decoration (https://github.com/coreshop/CoreShop/pull/1565) + - [Mailer] remove usages of PimcoreBundle\MailerInterface and fix interface + deprecation (https://github.com/coreshop/CoreShop/pull/1568) + +### 2.2.8 + +- Bugs: + - [OptimisticEntityLockBundle] fix Version loading with Composer v3 (https://github.com/coreshop/CoreShop/pull/1558) + +### 2.2.7 + +- Features: + - [OptimisticLock] allow to optimistically lock Pimcore DataObjects (https://github.com/coreshop/CoreShop/pull/1537) + - [Pimcore] introduce DataObjectBatchListing (https://github.com/coreshop/CoreShop/pull/1519) + +- Bugs: + - [Payment] Concurrency + issues (https://github.com/coreshop/CoreShop/issues/1536, https://github.com/coreshop/CoreShop/pull/1549) + - [Frontend] fix addressAccessType check and improve view (https://github.com/coreshop/CoreShop/pull/1544) + - [Payment] Payment Details can be null (https://github.com/coreshop/CoreShop/issues/1545) + - [ProductBundle] fix UnitDefinition without id (https://github.com/coreshop/CoreShop/pull/1547) + - [Order] fix payment provider (https://github.com/coreshop/CoreShop/pull/1548) + - [Payment] ignore failed payments in total amount check (https://github.com/coreshop/CoreShop/pull/1543) + - [Checkout] Fix checkout with addressAccessType COMPANY_ONLY (https://github.com/coreshop/CoreShop/pull/1526) + - [CompilerPass] rework compiler passes (simplify) (https://github.com/coreshop/CoreShop/pull/1535) + - [Admin Order detail] Carrier name not shown with legacy serialization of + Orders (https://github.com/coreshop/CoreShop/issues/1540) + - [composer2] make getVersion compatible (https://github.com/coreshop/CoreShop/pull/1539) + - [DynmicDropdown] support class override and fix order by id (https://github.com/coreshop/CoreShop/pull/1538) + - [DeepCopy] Order details are no longer + working (https://github.com/coreshop/CoreShop/issues/1507, https://github.com/coreshop/CoreShop/pull/1534) + - [OrderBundle] fix voucher code export (https://github.com/coreshop/CoreShop/pull/1530) + - [Resources] Reset Id on __ + clone (https://github.com/coreshop/CoreShop/issues/1501, https://github.com/coreshop/CoreShop/pull/1502) + - [Document] Document saving + failed (https://github.com/coreshop/CoreShop/issues/1498, https://github.com/coreshop/CoreShop/pull/1518) + - [Admin] fix payment details in backend order view (https://github.com/coreshop/CoreShop/pull/1525) + - [Notification] fix return of store on notification rule (https://github.com/coreshop/CoreShop/pull/1520) + - [Locale] Fix PSR-4 namespace (https://github.com/coreshop/CoreShop/pull/1509) + +- Docs: + - [Docs] add docu for product units (https://github.com/coreshop/CoreShop/pull/1551) + +- Tests: + - [Actions] add tests for packages (https://github.com/coreshop/CoreShop/pull/1542) + +### 2.2.6 + +- Bugs: + - [Product] fix cloning of ProductUnitDefinitions and add test for + it. (https://github.com/coreshop/CoreShop/pull/1502) + - [CoreBundle] interactive login: cart might not be available for several reasons, ignore exception and don't assign + a cart (https://github.com/coreshop/CoreShop/pull/1500) + +### 2.2.5 + +- Bugs: + - [OrderBundle] fix permission keys for order-creation (https://github.com/coreshop/CoreShop/pull/1474) + - [ProductBundle] fix persistance of spefiic-product-price-rule + label (https://github.com/coreshop/CoreShop/pull/1472) + - [OrderBundle] remove 'applyOn' from DiscountPercent and + SurchagePercent (https://github.com/coreshop/CoreShop/pull/1479) + - [QPR] Wrong Pseudo-Price in Grid-View (https://github.com/coreshop/CoreShop/issues/1488) + - [Pimcore] fix hasDefinition with + pimcore.implementation_loader.document.tag (https://github.com/coreshop/CoreShop/pull/1490) + - [OrderBundle, LocaleBundle] fix backend order-creation localeCode + selection (https://github.com/coreshop/CoreShop/pull/1481) + - [CoreBundle] fix setting price-values for inherited store-values (https://github.com/coreshop/CoreShop/pull/1491) + - [CoreBundle] don't set product for store-values on pre-get-data (https://github.com/coreshop/CoreShop/pull/1492) + +- Features: + - [Core] pass cart-item to price calculation context (https://github.com/coreshop/CoreShop/pull/1482) + - [Index] allow to define column config with index-extensions (https://github.com/coreshop/CoreShop/pull/1494) + +### 2.2.4 + +- Bugs: + - [CoreBundle] Don't validate maximum or minimum order quantity when value is + 0 (https://github.com/coreshop/CoreShop/issues/1467, https://github.com/coreshop/CoreShop/pull/1468) + - [Specific Price Rule] Unable to edit saved + rule (https://github.com/coreshop/CoreShop/issues/1437, https://github.com/coreshop/CoreShop/pull/1452) + - [Pimcore] Fix Ext Item Selector (https://github.com/coreshop/CoreShop/pull/1465) + - [Core, Order] fix surchage amount processor and remove apply-on (https://github.com/coreshop/CoreShop/pull/1462) + - [All] fix for copying data-objects with complex doctrine entities (https://github.com/coreshop/CoreShop/pull/1404) + - [CoreBundle] fix installation of address + format (https://github.com/coreshop/CoreShop/pull/1455, https://github.com/coreshop/CoreShop/issues/1432) + - [Orders] Unable to edit grid options to add/remove + fields (https://github.com/coreshop/CoreShop/issues/1438, https://github.com/coreshop/CoreShop/pull/1454) + - [Voucher] Voucher code generator returns always the same + code (https://github.com/coreshop/CoreShop/issues/1448, https://github.com/coreshop/CoreShop/pull/1451) + - [ProductBundle] fix serialization of translation labels in product-price + rules (https://github.com/coreshop/CoreShop/pull/1447) + +- Features: + - [OrderBundle] check if generation of a certain amount of codes is possible before actually generating + them (https://github.com/coreshop/CoreShop/pull/1456, https://github.com/coreshop/CoreShop/issues/1453) + +### 2.2.3 + +- Bugs: + - [FrontendBundle] apply confirm and pay transition for orders with value of + 0 (https://github.com/coreshop/CoreShop/pull/1442) + - [Core] create default address if customer doesn't have one (https://github.com/coreshop/CoreShop/pull/1444) + - [OrderBundle] Values should be zero, if amount should not be + defined (https://github.com/coreshop/CoreShop/pull/1443) + - [OrderBundle] Voucher Credit and Tax rounding issue (https://github.com/coreshop/CoreShop/pull/1441) + - [OrderBundle] Add currency property (https://github.com/coreshop/CoreShop/pull/1436) + - [Docs] Fix typo in the docs (https://github.com/coreshop/CoreShop/pull/1426) + - [CoreBundle] assert default address + type (https://github.com/coreshop/CoreShop/pull/1440, https://github.com/coreshop/CoreShop/issues/1257) + +- Features: + - [OrderBundle] Voucher Credit and Tax rounding issue (https://github.com/coreshop/CoreShop/pull/1441) + +### 2.2.2 + +- Bugs: + - [IndexBundle] fix range filter + condition (https://github.com/coreshop/CoreShop/pull/1416, https://github.com/coreshop/CoreShop/issues/1387) + - [OrderBundle] Fix currency formatting in sale detail related + components (https://github.com/coreshop/CoreShop/pull/1421) + - [OrderBundle] Fix order expire command (https://github.com/coreshop/CoreShop/pull/1422) + - [Product] re-add id reset on entity clone (https://github.com/coreshop/CoreShop/pull/1419) + - [ProductBundle] fix quantity price rule condition (https://github.com/coreshop/CoreShop/pull/1412) + - [Installer] fix output of thumbnail installer (https://github.com/coreshop/CoreShop/pull/1413) + - [IndexBundle] fix saving of nested + filters (https://github.com/coreshop/CoreShop/pull/1415, https://github.com/coreshop/CoreShop/issues/1414) + - [CoreBundle] fix typo in query condition to fetch product + variants (https://github.com/coreshop/CoreShop/pull/1418) + - [FrontendBundle] Fixed issue with saving address changes (https://github.com/coreshop/CoreShop/pull/1408) + - [RuleBundle] improve dirty detection (https://github.com/coreshop/CoreShop/pull/1410) + - [CurrencyBundle] fix cache issue with money-currency type (https://github.com/coreshop/CoreShop/pull/1406) + - [QuantityPriceRules] fix decimal precision + display (https://github.com/coreshop/CoreShop/pull/1398, https://github.com/coreshop/CoreShop/issues/1395) + +- Features: + - [FrontendBundle] add italian translations (https://github.com/coreshop/CoreShop/pull/1417) big thanks to + @ramundomario + +### 2.2.1 + +- Bugs: + - [CoreBundle] fix registration service (https://github.com/coreshop/CoreShop/pull/1391) + - [CoreBundle] fix validation groups (https://github.com/coreshop/CoreShop/pull/1390) + - [PimcoreBundle] Dynamic Dropdowns + Issues (https://github.com/coreshop/CoreShop/issues/1380, https://github.com/coreshop/CoreShop/pull/1382) + - [FrontendBundle] revert url-forward, doesn't work for all + cases (https://github.com/coreshop/CoreShop/pull/1386, https://github.com/coreshop/CoreShop/issues/1383) + +### 2.2.0 + +- Features: + - [Order] don't allow order-revise when completed payment has been + made (https://github.com/coreshop/CoreShop/pull/1334) + - [Order] persist internal cancellation reasons (https://github.com/coreshop/CoreShop/pull/1333) + - [Pimcore] require min 6.6 (https://github.com/coreshop/CoreShop/pull/1338) + - [GithubAction] add stan test (https://github.com/coreshop/CoreShop/pull/1341) + - [OrderBundle] show price rules without tax in backend (https://github.com/coreshop/CoreShop/pull/1346) + - [ThemeBundle] introduce theme + inheritance (https://github.com/coreshop/CoreShop/pull/1353, https://github.com/coreshop/CoreShop/pull/1359) + - [Order] introduce paymentTotal Property to store the rounded payment value with a precision of + 2 (https://github.com/coreshop/CoreShop/pull/1360) + - [Order] use Javascript intl for currency format (https://github.com/coreshop/CoreShop/pull/1366) + - [FrontendBundle] allow preview from admin-mode and redirect to right URL if + wrong (https://github.com/coreshop/CoreShop/pull/1367) + +- Bugs: + - [SecurityValidator] only trigger when Pimcore Frontend request (https://github.com/coreshop/CoreShop/pull/1339) + - [PimcoreBundle] Fix loading dynamic dropdown options (https://github.com/coreshop/CoreShop/pull/1340) + - [PimcoreBundle] fix dynamic dropdown extensions (https://github.com/coreshop/CoreShop/pull/1337) + - [PimcoreBundle] Fix data persistence for class definition and + database (https://github.com/coreshop/CoreShop/pull/1343) + - [PimcoreBundle] add dependency resolving (https://github.com/coreshop/CoreShop/pull/1348) + - [CoreBundle] add missing alias for taxed product price calculator (https://github.com/coreshop/CoreShop/pull/1355) + - [Migration] move migration before other migration in order to avoid missing db + columns (https://github.com/coreshop/CoreShop/pull/1356) + - [Payment] Revert "decouple Payment from Payum and consider decimal + factor" (https://github.com/coreshop/CoreShop/pull/1358) + - [Pimcore] fix getDataForEditmode (https://github.com/coreshop/CoreShop/pull/1361) + - [ThemeBundle] fix pimcore bc-break (https://github.com/coreshop/CoreShop/pull/1363) + - [Product] serialize stopPropogation property (https://github.com/coreshop/CoreShop/pull/1365) + - [Product] fix null value for pricing (https://github.com/coreshop/CoreShop/pull/1370) + - [ResourceBundle] ignore length for name of CoreShop doctrine assets (also fixes the error on + cancel) (https://github.com/coreshop/CoreShop/pull/1369) + - [CoreBundle] only show restore-inheritance when actually + inheritable (https://github.com/coreshop/CoreShop/pull/1368) + +### 2.2.0-RC.2 + +- Features: + - [IndexBundle] allow configuring if versions should be indexed or + not (https://github.com/coreshop/CoreShop/pull/1303) + - [IndexBundle] add possibility to store extra information into relational + table (https://github.com/coreshop/CoreShop/pull/1306) + - [Pimcore] Compatibility with Pimcore 6.5.3 (https://github.com/coreshop/CoreShop/pull/1310) + - [Shipping] Calculate shipping tax using cart items (https://github.com/coreshop/CoreShop/pull/1283) + - [Doctrine] remove usage of deprecated merge (https://github.com/coreshop/CoreShop/pull/1314) + - [Docs] Add Documentation for Unit Definitions (https://github.com/coreshop/CoreShop/pull/1312) + - [Payment] decouple Payment from Payum and consider decimal factor (https://github.com/coreshop/CoreShop/pull/1021) + - [Installer] change installer colors (https://github.com/coreshop/CoreShop/pull/1325) + - [Github Actions] introduce testing with Github Actions (https://github.com/coreshop/CoreShop/pull/1329) + +- Bugs: + - [CoreBundle] fix typo in validation groups and fix guest-registration + type (https://github.com/coreshop/CoreShop/pull/1304) + - [Frontend] Fixes the category items-per-page dropdown in the + frontend (https://github.com/coreshop/CoreShop/pull/1313) + - [Customer] fix missing username field (https://github.com/coreshop/CoreShop/pull/1315) + - [FrontendBundle/CoreBundle] prevent _fragment calls by using + ACL's (https://github.com/coreshop/CoreShop/pull/1309) + - [Reports] fix export params (https://github.com/coreshop/CoreShop/pull/1328) + +### 2.2.0 + +- Features: + - [Core] Implement Username/Email Login Identifier + @solverat (https://github.com/coreshop/CoreShop/issues/1290, https://github.com/coreshop/CoreShop/pull/1291) + - [Pimcore] require min Pimcore 6.5 (https://github.com/coreshop/CoreShop/pull/1286) + - [Core] Company - Customer Workflow + @solverat (https://github.com/coreshop/CoreShop/issues/1266, https://github.com/coreshop/CoreShop/pull/1284) + - [Scrutinizer] remove unused-code (https://github.com/coreshop/CoreShop/pull/1226) + - [STAN] fixes (https://github.com/coreshop/CoreShop/pull/1239) + - [PHPStan] level-3 (https://github.com/coreshop/CoreShop/pull/1220) + - [Pimcore] remove pimcore bc layers (https://github.com/coreshop/CoreShop/pull/1221) + - [CoreBundle] support version marshall und unmarshall to merge with existing + data (https://github.com/coreshop/CoreShop/pull/1145) +- Bugs: + - [CoreExtensions] fix issue with CoreShop CoreExtensions Recycle + Bin (https://github.com/coreshop/CoreShop/pull/1254) + +## 2.1.x + +### 2.1.9 + +- Bugs: + - [OrderBundle] fix usage of inherited values in backend-cart/order + controllers (https://github.com/coreshop/CoreShop/pull/1461, https://github.com/coreshop/CoreShop/issues/1459) + +### 2.1.8 + +- Bugs: + - [ResourceBundle] Fix unique entity validator (https://github.com/coreshop/CoreShop/pull/1385) + - [DataHub] fix integration (https://github.com/coreshop/CoreShop/pull/1389) + +- Features: + - [WorkflowBundle] Add enabled option to workflow callbacks (https://github.com/coreshop/CoreShop/pull/1392) + +### 2.1.7 + +- Bugs: + - [Pimcore] fix + getDataForEditmode (https://github.com/coreshop/CoreShop/pull/1372, https://github.com/coreshop/CoreShop/pull/1361) + +### 2.1.6 + +- Bugs: + - [CoreBundle][2.1] Fix name of country combo (https://github.com/coreshop/CoreShop/pull/1350) + +### 2.1.5 + +- Bugs: + - [Translations] fix: add missing translation (https://github.com/coreshop/CoreShop/pull/1308) + - [IndexBundle] index ui improvements (https://github.com/coreshop/CoreShop/pull/1300) + - [ThemeBundle] fix configuration for default resolvers (https://github.com/coreshop/CoreShop/pull/1301) + - [AddressBundle] introduce filter-active action and filter store-base countries by + those (https://github.com/coreshop/CoreShop/pull/1302) + +### 2.1.4 + +- Feature: + - [CoreBundle] allow store-values to be reset and inherit again (https://github.com/coreshop/CoreShop/pull/1273) +- Bugs: + - [IndexBundle] Change return type of WorkerInterface::getList (https://github.com/coreshop/CoreShop/pull/1280) + - [ThemeBundle] fix default theme-resolvers (https://github.com/coreshop/CoreShop/pull/1281) + - [Pimcore] make compatible with Pimcore 6.5 (https://github.com/coreshop/CoreShop/pull/1285) + - [Core] fix bug where we calculated item-discount and + item-discount-prices (https://github.com/coreshop/CoreShop/pull/1293) + +### 2.1.3 + +- Bugs: + - [Address, Order, Core] fix release (https://github.com/coreshop/CoreShop/pull/1269) + +### 2.1.2 + +- Features: + - [FrontendBundle] Change function from private to protected (https://github.com/coreshop/CoreShop/pull/1248) + - [Installer] update logo (https://github.com/coreshop/CoreShop/pull/1264) + - [Cart] introduce cart-context resolver to allow better extendability of the context used for the + cart (https://github.com/coreshop/CoreShop/pull/1267) + +- Bugs: + - [ThemeBundle] fix Undefined index: default_resolvers (https://github.com/coreshop/CoreShop/pull/1235) + - [IndexBundle] `$indexIds` is always an array, hence the condition is now + empty (https://github.com/coreshop/CoreShop/pull/1241) + - [Stan] fixes for 2.1 (https://github.com/coreshop/CoreShop/pull/1244) + - [CurrencyBundle] fix money-currency type is rounding prices wrong (https://github.com/coreshop/CoreShop/pull/1238) + - [CoreBundle] Change repository so that unit definition deletion works with multiple product + models (https://github.com/coreshop/CoreShop/pull/1252) + - [Order] fix throwing/catching right exceptions in purchasable + calculalator (https://github.com/coreshop/CoreShop/pull/1250) + - [Core] allow non QuantityPriceRangeAware Products in + cart-processor (https://github.com/coreshop/CoreShop/pull/1249) + - [IndexBundle] fix index columns form (https://github.com/coreshop/CoreShop/pull/1259) + - [Country] don't call the request based resolvers every time (https://github.com/coreshop/CoreShop/pull/1261) + +### 2.1.1 + +- Features: + - [CoreBundle] Implement Variant Unit and QPR Solidifier (https://github.com/coreshop/CoreShop/issues/1157) + - [AddressBundle] Improve Country Address Formatting (https://github.com/coreshop/CoreShop/pull/1153) + - [OrderBundle] properly implement AddMultipleToCart (https://github.com/coreshop/CoreShop/pull/1154) + - [IndexBundle] allow to query relations also by relation type (https://github.com/coreshop/CoreShop/pull/1156) + - [SEOBundle] add priority to extractors (https://github.com/coreshop/CoreShop/pull/1155) + - [QuantityPriceRules] Allow Object Deletion without removing QPR + first (https://github.com/coreshop/CoreShop/issues/1160) + - [CoreBundle] Improve Unit Definition `<=>` QPR Dependency (https://github.com/coreshop/CoreShop/pull/1161) + - [StorageList] introduce service to resolve if cart-items are + equal (https://github.com/coreshop/CoreShop/pull/1188) + - [OrderBundle] Allow Item Data per Row in Order Overview (https://github.com/coreshop/CoreShop/pull/1193) + - [OrderBundle] add sale-detail event (https://github.com/coreshop/CoreShop/pull/1192) + - [IndexBundle] Argument for re-index command (https://github.com/coreshop/CoreShop/pull/1219) + - [CoreBundle] Maximum Quantity to Order (https://github.com/coreshop/CoreShop/issues/1209) + +- Bugs: + - [StoreBundle] add missing store dependency (https://github.com/coreshop/CoreShop/pull/1159) + - [Install] add dummy migration (https://github.com/coreshop/CoreShop/pull/1172) + - [CoreBundle] Remove Store Values after Store has been removed (https://github.com/coreshop/CoreShop/pull/1171) + - [Order] Fix Character Length Count in Voucher Code + Generator (https://github.com/coreshop/CoreShop/pull/1194/files) + - [Order] fix item price for items without tax-rule (https://github.com/coreshop/CoreShop/pull/1200) + - [TRACKING] use single item price in order item extractor (https://github.com/coreshop/CoreShop/pull/1232) + +### 2.1.0 + +- If you have a custom validation File for *AddToCart* or *Cart*, make sure to use the new 2 MinimumQuantity and + MaximumQuantity Constraints. Otherwise it will happen that a validation is triggered twice. + +### 2.1.0 + +- Bugs: + - [ThemeBundle] add missing dependency to + pimcore-bundle (https://github.com/coreshop/CoreShop/pull/1138, https://github.com/coreshop/CoreShop/pull/1140) + - [ResourceBundle] fix naming of parameter sortBy (https://github.com/coreshop/CoreShop/pull/1132) + - [Quantity Price Rules] Check Inherited Product Quantity Price Range + Data (https://github.com/coreshop/CoreShop/pull/1143) + - [FrontendBundle] allow usage of auto-wired Frontend Controllers (https://github.com/coreshop/CoreShop/pull/1141) + - [OrderBundle] CartItem Quantity has to be > 0 (https://github.com/coreshop/CoreShop/pull/1144) + +### 2.1.0-rc.2 + +- Features: + - [IndexBundle] allow for more complex doctrine types in index (https://github.com/coreshop/CoreShop/pull/1110) + - [IndexBundle] add Select and Multiselect Filter Processor from + Multiselect (https://github.com/coreshop/CoreShop/pull/1111) + - [Autowire] improvement: allow service registries to be + autowired (https://github.com/coreshop/CoreShop/pull/1113, https://github.com/coreshop/CoreShop/pull/1116, https://github.com/coreshop/CoreShop/pull/1122) + - [QuantityPriceRules] allow price range ordering @solverat (https://github.com/coreshop/CoreShop/pull/1121) + - [Payment] Fix payment provider logo @davidhoeck (https://github.com/coreshop/CoreShop/pull/1124) + - [ResourceBundle, OrderBundle, CoreBundle] introduce more memory + efficient (https://github.com/coreshop/CoreShop/pull/1126, https://github.com/coreshop/CoreShop/pull/1129) + - [Shipping, ShippingBundle] Add logo field to carrier @davidhoeck (https://github.com/coreshop/CoreShop/pull/1127) + - + +- Bugs: + - [Tests] exit code (https://github.com/coreshop/CoreShop/pull/1119) + - [Tracking] remove decimal factor multiplier in order extractor + @solverat (https://github.com/coreshop/CoreShop/pull/1128) + - [QuantityPriceRules] Move migration for Quantity Rule Range Unit to Sales Unit + migration (https://github.com/coreshop/CoreShop/pull/1123) + +### 2.1.0 + +- BC-Break: Introduced `array $options` parameter into `CoreShop\Component\Index\Listing\ListingInterface` to allow + certain variations for loading data + +- Introduced WholesalePrice Calculators, this deprecates the "wholesalePrice" property in the Product Class and adds + the "wholesaleBuyingPrice" Property with a currency attached. We've added a migration for that, but since we need a + currency now, we just assume the buying currency as the defaults store currency. If you have a different one, create a + custom migration that changes it. + +- `CoreShop\Component\StorageList\StorageListModifierInterface` got completely refactored and works a bit different now. + Since deciding what StorageListItem belongs to what product, can be a bit more complicated, we decided to introduce a + BC break. + - `CoreShop\Component\StorageList\StorageListModifierInterface` added `addToList` function + - `CoreShop\Component\StorageList\StorageListModifierInterface` removed `remove` to `removeFromList` + - `CoreShop\Component\StorageList\Model\StorageListItemInterface` added `equals` function + - `CoreShop\Component\StorageList\Model\StorageListInterface` removed `getItemForProduct` function + - `CoreShop\Component\StorageList\Model\StorageListProductInterface` got deprecated, since not it's not needed + anymore +- `CoreShop\Component\Order\Factory\CartItemFactoryInterface` introduced a new + function `public function createWithPurchasable(PurchasableInterface $purchasable, $quantity = 1);` + +- Introduced Theme-Bundle to handle + Themes (https://github.com/coreshop/CoreShop/pull/749, https://github.com/coreshop/CoreShop/pull/756, https://github.com/coreshop/CoreShop/pull/755) + - + deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeHelper](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeHelper.php) + in favor + of [CoreShop\Bundle\ThemeBundle\Service\ThemeHelper](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeHelper.php) + - + deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeHelperInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeHelperInterface.php) + in favor + of [CoreShop\Bundle\ThemeBundle\Service\ThemeHelperInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeHelperInterface.php) + - + deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeResolver.php) + in favor + of [CoreShop\Bundle\ThemeBundle\Service\ThemeResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeResolver.php) + - + deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeResolverInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeResolverInterface.php) + in favor + of [CoreShop\Bundle\ThemeBundle\Service\ThemeResolverInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeResolverInterface.php) + +- Introduce AddToCartFormType and QuantityType. This allows to use validators to check if its allowed to add a product + to the cart. If you update from CoreShop 2.0.* change the add-to-cart form in your templates to the + following: (https://github.com/coreshop/CoreShop/pull/812/files#diff-3e06a5f0e813be230a0cd232e916738eL29) (https://github.com/coreshop/CoreShop/pull/812, https://github.com/coreshop/CoreShop/pull/864) + - `{{ render(url('coreshop_cart_add', {'product': product.id})) }}` + - Be sure you have adopted the new form template in `views/Product/_addToCart.html.twig` + +- Introduced Store + Unit: (https://github.com/coreshop/CoreShop/pull/877, https://github.com/coreshop/CoreShop/pull/883, https://github.com/coreshop/CoreShop/pull/950, https://github.com/coreshop/CoreShop/pull/902, https://github.com/coreshop/CoreShop/pull/896) + - Please add `product_unit` to permission table. + - Remove `storePrice` field from all product classes + - If you don't use the `Store Price` element in your classes besides the `storePrice` field, you should delete + the `coreshop_product_store_price` table after migration. + - We introduced a new jquery plugin `$.coreshopQuantitySelector()` which allows you to add more numeric control to + your quantity field, checkout our + demo [example](https://github.com/coreshop/CoreShop/blob/7d05ccd89aed99f9fd93c585e096cd1edaf20010/src/CoreShop/Bundle/FrontendBundle/Resources/public/static/js/shop.js#L20). + +- Features: +- *Product Quantity Rules*, big thanks to + @solverat (https://github.com/coreshop/CoreShop/pull/791, https://github.com/coreshop/CoreShop/pull/954, https://github.com/coreshop/CoreShop/pull/951, https://github.com/coreshop/CoreShop/pull/898, https://github.com/coreshop/CoreShop/pull/813) +- *Product Units*, big thanks to + @solverat (https://github.com/coreshop/CoreShop/pull/861, https://github.com/coreshop/CoreShop/pull/911, https://github.com/coreshop/CoreShop/pull/900, https://github.com/coreshop/CoreShop/pull/897, https://github.com/coreshop/CoreShop/pull/891, https://github.com/coreshop/CoreShop/pull/875) +- *Minimum Order Quantity and Item Quantity Factor* big thanks to + @solverat (https://github.com/coreshop/CoreShop/pull/881) +- Introduce Menu + Bundle (https://github.com/coreshop/CoreShop/pull/854, https://github.com/coreshop/CoreShop/pull/880, https://github.com/coreshop/CoreShop/pull/878, https://github.com/coreshop/CoreShop/pull/876) +- Introduce Theme + Bundle (https://github.com/coreshop/CoreShop/pull/749, https://github.com/coreshop/CoreShop/pull/756, https://github.com/coreshop/CoreShop/pull/755) +- [Store Values] swap store-prices with store-values and make them extendable for custom store + values (https://github.com/coreshop/CoreShop/pull/877, https://github.com/coreshop/CoreShop/pull/883, https://github.com/coreshop/CoreShop/pull/950, https://github.com/coreshop/CoreShop/pull/902, https://github.com/coreshop/CoreShop/pull/896) +- [ResourceBundle] Add group to ThumbnailInstaller (https://github.com/coreshop/CoreShop/pull/1017) @AndiKeiser +- [All] AutoWiring (https://github.com/coreshop/CoreShop/pull/850) +- [All] Pimcore 6/Symfony 4 + compatibilty (https://github.com/coreshop/CoreShop/pull/996, https://github.com/coreshop/CoreShop/pull/1062, https://github.com/coreshop/CoreShop/pull/1035) +- [Tests] Update to friends-of-behat/symfony-extension:^2.0 (https://github.com/coreshop/CoreShop/pull/1024) +- [Travis] add setup for Pimcore 6 changed system.yml config (https://github.com/coreshop/CoreShop/pull/1029) +- [All] Introduce configurable decimal precision and factor (https://github.com/coreshop/CoreShop/pull/1030) +- [All] change db type for pricing fields to + BIGINT (https://github.com/coreshop/CoreShop/pull/1032, https://github.com/coreshop/CoreShop/pull/1098) +- [ShippingBundle] introduce gross/net checkbox for amount condition (https://github.com/coreshop/CoreShop/pull/1042) +- [Graphql] Add Support for Pimcore GraphQl Data Hub (https://github.com/coreshop/CoreShop/pull/1052) +- [Tracking] Add Decimal Precision to Order Extractor (https://github.com/coreshop/CoreShop/pull/1058) +- [MoneyBundle] add fallback in money-bundle for decimal precision (https://github.com/coreshop/CoreShop/pull/1061) +- [Docs] Added visualization for coreshop_order Workflow (https://github.com/coreshop/CoreShop/pull/1067) @davidhoeck +- [Pimcore] add conflict for Pimcore 6.1.0 and Pimcore 6.1.1 (https://github.com/coreshop/CoreShop/pull/1069) +- [Docs] Update 03_Theme.md (https://github.com/coreshop/CoreShop/pull/1072) @D37R4C7 +- [FQCN] FQCN + Services (https://github.com/coreshop/CoreShop/pull/1079, https://github.com/coreshop/CoreShop/pull/1084, https://github.com/coreshop/CoreShop/issues/1085, https://github.com/coreshop/CoreShop/pull/1086, https://github.com/coreshop/CoreShop/pull/1090) +- [Product] Unit Definition - + Precision (https://github.com/coreshop/CoreShop/pull/1081, https://github.com/coreshop/CoreShop/pull/1091, https://github.com/coreshop/CoreShop/pull/1092) + @solverat +- [IndexBundle] split conditions into pre_conditions and + user_conditions (https://github.com/coreshop/CoreShop/pull/1055) +- [Quantity Price Rules] Remove "to" field from quantity price + range (https://github.com/coreshop/CoreShop/pull/1003, https://github.com/coreshop/CoreShop/pull/1095) +- [Order] Introduce backend cart-creation and cart-details (https://github.com/coreshop/CoreShop/pull/963) +- [PermissionSetup] add category to Permission (https://github.com/coreshop/CoreShop/pull/1101) +- [ShippingBundle] add more carrier price options (https://github.com/coreshop/CoreShop/pull/1015) +- [FrontendBundle] show discount/surcharge label in order overview (https://github.com/coreshop/CoreShop/pull/1006) +- [Index, IndexBundle] allow options for the listing load function (https://github.com/coreshop/CoreShop/pull/1001) +- [ResourceBundle] add connection interface into Pimcore Repository (https://github.com/coreshop/CoreShop/pull/1000) +- [ProductBundle, CoreBundle] set itemQuantityFactor min value to null (https://github.com/coreshop/CoreShop/pull/993) +- [Core] use default unit quanity in onhold inventory (https://github.com/coreshop/CoreShop/pull/990) @solverat +- [Maintenance] refactor to use new maintenance task from pimcore 5.8 (https://github.com/coreshop/CoreShop/pull/986) +- [All] require min Pimcore 5.8 and PHP 7.2 (https://github.com/coreshop/CoreShop/pull/973) +- [CoreBundle] introduce store-preview for products (https://github.com/coreshop/CoreShop/pull/982) +- [Adjustments] remove return type AdjustmentInterface (https://github.com/coreshop/CoreShop/pull/978) @solverat +- [Taxation] fix tax collection on gross values - 2.1 (https://github.com/coreshop/CoreShop/pull/974) +- [Order] introduce translatable cart-price-rules (https://github.com/coreshop/CoreShop/pull/969) +- [WholesaleCalculator] introduce purchasable wholesale calculator (https://github.com/coreshop/CoreShop/pull/957) +- [Product] introduce stop propagation flag for price-rules (https://github.com/coreshop/CoreShop/pull/946) +- [Pimcore] make CoreShop 2.1 compatible with Pimcore 5.7.2 (https://github.com/coreshop/CoreShop/pull/915) +- [CoreBundle] serialize relational values (product and store) as + relation (https://github.com/coreshop/CoreShop/pull/916) +- [Core] Disable Customer Deletion if bounded Orders are available (https://github.com/coreshop/CoreShop/pull/732) +- [PriceRules] add priority to product-price-rules (https://github.com/coreshop/CoreShop/pull/905) +- [Product] add translation to product price rules (https://github.com/coreshop/CoreShop/pull/879) +- [All] Min 5.7 (https://github.com/coreshop/CoreShop/pull/871) +- [Core] Refactor how we identify CartItem - Product (https://github.com/coreshop/CoreShop/pull/866) +- [Core/Cart] Refactor add to cart (https://github.com/coreshop/CoreShop/pull/864) +- [Cart] implement add-to-cart as Symfony Form (https://github.com/coreshop/CoreShop/pull/812) +- [Core, Order, Product] throw exceptions for when a price can't be + found (https://github.com/coreshop/CoreShop/pull/811) +- [Order] make accessor protected for OrderDocument Processor (https://github.com/coreshop/CoreShop/pull/775) +- [WorkflowBundle, OrderBundle] always load all available coreshop states into + js (https://github.com/coreshop/CoreShop/pull/773) +- [Core, Order] also apply discounts to cart-items (https://github.com/coreshop/CoreShop/pull/770) +- [OrderBundle, Pimcore] extract DataLoader from Controller to be used + oustide (https://github.com/coreshop/CoreShop/pull/771) +- [OrderBundle] add event to prepare sale in order to better extend + details (https://github.com/coreshop/CoreShop/pull/772) +- [IndexBundle] implement optional inclusion into ProcessManager (https://github.com/coreshop/CoreShop/pull/758) + +- Bugs: + - [Product] remove getIsAvailableWhenOutOfStock and + setIsAvailableWhenOutOfStock (https://github.com/coreshop/CoreShop/pull/1019) + - [CoreBundle] fix inheritance for store-values (https://github.com/coreshop/CoreShop/pull/1028) + - [ResourceBundle] Fix missing coreshop.helper namespace (https://github.com/coreshop/CoreShop/pull/1039) + - [PimcoreBundle] fix dynamic-dropdown for pimcore-6 (https://github.com/coreshop/CoreShop/pull/1040) + - [All] fix related to element.href and this pimcore PR: + pimcore/pimcore#4496 (https://github.com/coreshop/CoreShop/pull/1041) + - [Core] Store Values - default value to 0 instead of null, fix setting inherited store + values (https://github.com/coreshop/CoreShop/pull/1093) + - [FrontendBundle] fix wishlist remove and allow purchasables (https://github.com/coreshop/CoreShop/pull/997) + - [Bundles] provide proper version strings and names (https://github.com/coreshop/CoreShop/pull/970) + - [Migration] only add indices to store_price table if table actually + exists (https://github.com/coreshop/CoreShop/pull/967) + - [IndexBundle] improve standalone usage (https://github.com/coreshop/CoreShop/pull/965) + - [Product] allow price rule labels to be null and fix error with two trait + constructors (https://github.com/coreshop/CoreShop/pull/953) + - [ProductBundle] re-add active to list serializer group (https://github.com/coreshop/CoreShop/pull/912) + - [CoreBundle] fix cart-stock validation (https://github.com/coreshop/CoreShop/pull/894) + - [Tests] [Behat] the cart tests haven't been ran since the theme-bundle was + introduced (https://github.com/coreshop/CoreShop/pull/872) + +## 2.0.x + +### 2.0.12 + +- Translations: + - New Crowdin translations (https://github.com/coreshop/CoreShop/pull/1165) +- Tests + - [Tests] add conflict for monolog (https://github.com/coreshop/CoreShop/pull/1178) +- Bug + - [TRACKING] use single item price in order item extractor (https://github.com/coreshop/CoreShop/pull/1231) + +### 2.0.11 + +- Bugs: + - [IndexBundle] use doctrine schema-config to create index-table + schema (https://github.com/coreshop/CoreShop/pull/1142) + +### 2.0.10 + +- Bugs: + - [PayumBundle]: add sandbox to PayPal Configuration (https://github.com/coreshop/CoreShop/pull/1112) + +### 2.0.9 + +- Bugs: + - [Pimcore] fix stan tests on 2.0 (https://github.com/coreshop/CoreShop/pull/998) + - [CurrencyBundle] fix for money-currency editable when data comes from pimcore + editmode (https://github.com/coreshop/CoreShop/pull/1023) + - [PimcoreBundle] use reflection to get class methods (https://github.com/coreshop/CoreShop/pull/1038) + - [CoreExtensions] don't allow any diff until properly implemented (https://github.com/coreshop/CoreShop/pull/1050) + - [ProductBundle] specific price rules: keep id on save (https://github.com/coreshop/CoreShop/pull/1045) + - [TrackingBundle] fix total tax in tag manager tracker (https://github.com/coreshop/CoreShop/pull/1053) @solverat + - [IndexBundle] fix iterator and nested interpreter (https://github.com/coreshop/CoreShop/pull/1054) + - [IndexBundle] fix index iterator interpreter (https://github.com/coreshop/CoreShop/pull/1076) + - [ResourceBundle] fix resource-select options (https://github.com/coreshop/CoreShop/pull/1077) + - [Tests] fix stan and travis tests (https://github.com/coreshop/CoreShop/pull/1078) + - [Docs] Fix extend docs (https://github.com/coreshop/CoreShop/pull/1082) + - [PimcoreBundle] embedd CoreExtension - Protected members are available only via + getters (https://github.com/coreshop/CoreShop/pull/1089) @rishadomar + - [IndexBundle] fix order-direction now serialized properly (https://github.com/coreshop/CoreShop/pull/1097) + - [All] Fixing Configuration Keys (https://github.com/coreshop/CoreShop/pull/1100) @khusseini + - [FrontendBundle] CategoryController perPage Configuration fix (https://github.com/coreshop/CoreShop/pull/1105) + +- Features: + - [All] make CoreShop stores more async, don't load them initially (https://github.com/coreshop/CoreShop/pull/1025) + - [Order] introduce checkout events (https://github.com/coreshop/CoreShop/pull/1043) + - [CoreShop] Update CI (https://github.com/coreshop/CoreShop/pull/1056) + - [CoreShop] Smaller CI changes (https://github.com/coreshop/CoreShop/pull/1060) + +### 2.0.8 + +- Bug: + - [Pimcore] Make CoreShop compatible with Pimcore 5.8.0 (https://github.com/coreshop/CoreShop/pull/977) + - [Order] remove wrong type hints (https://github.com/coreshop/CoreShop/pull/978) + - [Core] fix setting customer and persisting cart on user login (https://github.com/coreshop/CoreShop/pull/980) + +### 2.0.7 + +- Bug: + - [Taxation] Wrong Tax Calculation when using Store Gross Values (https://github.com/coreshop/CoreShop/issues/971) + - [Core] remove unused Helper Classes (https://github.com/coreshop/CoreShop/pull/966) + - [Core] add index to StorePrice Table for better performance (https://github.com/coreshop/CoreShop/pull/962) + - [Core] remove result cache for Store Price due to issues with + inheritance (https://github.com/coreshop/CoreShop/pull/961) + - [Core] strip_tags for meta description in Category (https://github.com/coreshop/CoreShop/pull/959) + - [Currency] MoneyCurrency fixes and improvements (https://github.com/coreshop/CoreShop/pull/958) + - [Purchasable] When using custom purchasable, CoreShop always assumed that your class has a weight, even though it + didn't had to. That's why we moved all weight related fields to the Core Component and CoreBundle. + - [Core] prevent empty carts from being persisted (https://github.com/coreshop/CoreShop/issues/920) + - [Core] move weight/total weight to Core Component (https://github.com/coreshop/CoreShop/pull/938) + - [Address] use isoCode as fallback if no language value is set (https://github.com/coreshop/CoreShop/pull/939) + +- Features + - [JMS Serializer] Updated JMS Serializer to 2.0 (https://github.com/coreshop/CoreShop/pull/955) + +### 2.0.6: + +- Bug: + - [Adjustments] in the classes "CoreShopOrderItem", "CoreShopQuoteItem", was a typo `basePdjustmentItems` instead + of `baseAdjustmentItems`. Please manually rename them to `baseAdjustmentItems` + - [ProductBundle] Fix extjs layout crash price rule is inactive (https://github.com/coreshop/CoreShop/pull/908) + - [FrontendBundle] fix address creation redirect (https://github.com/coreshop/CoreShop/pull/910) + - [StorageList] Storage List and Storage List Item is not a Pimcore + Object (https://github.com/coreshop/CoreShop/pull/907) + - [Order] fix typo in OrderItem and QuoteItem (https://github.com/coreshop/CoreShop/pull/906) + - [NotificationBundle] fix typo in serializer namespace declaration (https://github.com/coreshop/CoreShop/pull/901) + - [CoreBundle] fix notification rule setting for order mail action (https://github.com/coreshop/CoreShop/pull/886) + - [Core] use PriceCalculatorInterface in product tracking extractor (https://github.com/coreshop/CoreShop/pull/892) + - [Core] fix not passing full configuration in store based email (https://github.com/coreshop/CoreShop/pull/917) + - [Core] fix copying object brick data from cart to sale (https://github.com/coreshop/CoreShop/pull/918) + - [CoreBundle/OrderBundle] KernelResponse Event should ignore Profile + Toolbar (https://github.com/coreshop/CoreShop/pull/919) + - [Pimcore] Make CoreShop compatible with Pimcore 5.7.2 (https://github.com/coreshop/CoreShop/pull/914) + +- Features: + - [FrontendBundle] make private method protected (https://github.com/coreshop/CoreShop/pull/890) + - [AddressBundle] introduce + address-identifiers (https://github.com/coreshop/CoreShop/issues/830 & https://github.com/coreshop/CoreShop/pull/913) + +### 2.0.5: + +- Deprecations: + - [WorkflowBundle] refactor state change logging (https://github.com/coreshop/CoreShop/pull/835) + - `CoreShop\Bundle\OrderBundle\Workflow\OrderHistoryLogger` has been deprecated, + use `CoreShop\Bundle\WorkflowBundle\History\HistoryLoggerInterface` instead + - `CoreShop\Bundle\OrderBundle\Workflow\OrderStateHistoryLogger` has been deprecated, + use `CoreShop\Bundle\WorkflowBundle\History\StateHistoryLoggerInterface` instead + - `CoreShop\Bundle\OrderBundle\Workflow\WorkflowStateManager` has been deprecated, + use `CoreShop\Bundle\WorkflowBundle\StateManager\WorkflowStateInfoManagerInterface` instead +- Bugs + - [PimcoreBundle] Make embedded classes work for Pimcore 5.6 (https://github.com/coreshop/CoreShop/pull/867) + - [All] Make CoreShop 2.0.x compatible with Pimcore 5.7 (https://github.com/coreshop/CoreShop/pull/869) + - [All] fix PHP5 sort issues by removing them (https://github.com/coreshop/CoreShop/issues/840) + - [Shipping] if cart has no shippables, don't force carriage + calculation (https://github.com/coreshop/CoreShop/pull/863) + - [Checkout] validate cart before submitting the order (https://github.com/coreshop/CoreShop/pull/858) + - [Frontend] remove unused property in templates (https://github.com/coreshop/CoreShop/pull/859) + - [Permissions] prefix permission labels (https://github.com/coreshop/CoreShop/pull/855) + - [Order] refactor creation of + invoices/shipments (https://github.com/coreshop/CoreShop/pull/852 + https://github.com/coreshop/CoreShop/pull/849) + - [Order] introduce options for order-document-items (https://github.com/coreshop/CoreShop/pull/848) + - [Autoloading] fix paths (https://github.com/coreshop/CoreShop/pull/846) + - [ResourceBundle] Introduce more basic + resource-types (https://github.com/coreshop/CoreShop/pull/838 + https://github.com/coreshop/CoreShop/pull/845) + - [AddressBundle] add missing translations (https://github.com/coreshop/CoreShop/pull/836) + +- Features + - [Index] Introduce advanced sorting for indexes (https://github.com/coreshop/CoreShop/pull/856) + +### 2.0.4 + +- Features: + - [Reports] Reports Grid Sorting (https://github.com/coreshop/CoreShop/pull/828) + - [Reports] Add Paginator To All Reports (https://github.com/coreshop/CoreShop/pull/826) + - [Pimcore] introduce twig placeholder (https://github.com/coreshop/CoreShop/pull/827) + - [Resource] add serialization for pimcore types (https://github.com/coreshop/CoreShop/pull/818) + - [Resource] add more doctrine-pimcore-types (https://github.com/coreshop/CoreShop/pull/816) + +- Bugs: + - [Order] fix code-generator length (https://github.com/coreshop/CoreShop/pull/833) + - [JS] Split JS Helpers into several regions of usability (https://github.com/coreshop/CoreShop/pull/829) + - [Core] fix for cart-item digital product never set (https://github.com/coreshop/CoreShop/pull/821) + - [Docs] Fix dead link (https://github.com/coreshop/CoreShop/pull/822) + - [Resource] move settings icon to resource-bundle (https://github.com/coreshop/CoreShop/pull/815) + - [Tracker] Update CompositeTracker::trackCheckoutStep (https://github.com/coreshop/CoreShop/pull/810) + +### 2.0.3 + +- Features: + - [All] Replace intval with int cast (https://github.com/coreshop/CoreShop/pull/805) + - [Core] Store Price Dirty Detection if installed Pimcore Version >= + 5.5 (https://github.com/coreshop/CoreShop/pull/807) + - [Core] Allow Variants in Product Rule Conditions (https://github.com/coreshop/CoreShop/pull/794) + - [Core] Add Event for Settings (https://github.com/coreshop/CoreShop/pull/785) + - [Core] Extract CartItem Processor (https://github.com/coreshop/CoreShop/pull/784) + - [Core] Decouple Shipping Calculator from Cart (https://github.com/coreshop/CoreShop/pull/783) + - [Order] extract DataLoader into Pimcore Component (https://github.com/coreshop/CoreShop/pull/782) + - [Order] rename Pimcore Grid Operators to be more CoreShop specific (https://github.com/coreshop/CoreShop/pull/787) + - [Order] Check also for CurrencyAwareInterface in PriceFormatter Gird + Operator (https://github.com/coreshop/CoreShop/pull/788) + - [Index] Introduce Iterator Interpreter (https://github.com/coreshop/CoreShop/pull/802) + - [Index] Introduce new Abstract function in AbstractWorker to allow handling of array + data (https://github.com/coreshop/CoreShop/pull/803) + - [Pimcore] add object_method twig function (https://github.com/coreshop/CoreShop/pull/809) +- Bugs: + - [Core] Fix Gift Cart Price Rule Action (https://github.com/coreshop/CoreShop/pull/796) + - [Core] Fix Invoice WKHTML Settings (https://github.com/coreshop/CoreShop/pull/786) + - [Core] Rule Conditions: Check on type (https://github.com/coreshop/CoreShop/pull/779) + - [Core] Add Translation for Adjustments (https://github.com/coreshop/CoreShop/pull/774) + - [Pimcore] allow spaces in DynamicDropdown (https://github.com/coreshop/CoreShop/pull/781) + +### 2.0.2 + +- Pimcore: + - This release makes CoreShop compatible with Pimcore 5.6.0 (https://github.com/coreshop/CoreShop/pull/762) +- Features: + - [Core] Adds a new CoreShop JS Event to add custom Menu Items to the CoreShop + Menu (https://github.com/coreshop/CoreShop/pull/765) + - [Resource] [ResourceBundle] add JMS Serializer Handler for Pimcore + Objects (https://github.com/coreshop/CoreShop/pull/766) +- Bugs: +- [Tracking] Fixes a Bug in the Tracking Manager when a Product does not have any categories + applied (https://github.com/coreshop/CoreShop/pull/767) + +### 2.0.1 + +- Features: + - [Core] Remove login customer after successfully registration (https://github.com/coreshop/CoreShop/pull/735) +- Bugs: + - [Core] Countries are removed when removing Store (https://github.com/coreshop/CoreShop/pull/746) + - [Core] order Document State Resolver when a Document is cancelled (https://github.com/coreshop/CoreShop/pull/738) + - [Core] safe path for folders (https://github.com/coreshop/CoreShop/pull/742) + - [Core] Fix for StoreMailActionProcessor exception in Notification + Rule (https://github.com/coreshop/CoreShop/pull/740) + - [Shipping] is invalid when no Shipping Rules are given (https://github.com/coreshop/CoreShop/pull/741) + - [Frontend] Inaccurate Store Filter Query in Category Controller (https://github.com/coreshop/CoreShop/pull/744) + +### 2.0.0 + +- CoreShop\Component\Index\Condition\RendererInterface has been deprecated in favor of + CoreShop\Component\Index\Condition\DynamicRendererInterface to allow dynamic registration of condition renderers + +### 2.0.0-RC.1 + +- Flash Messages are translated in the Controllers now, not in views anymore. If you have custom Flash Messages, + translate them in your Controller instead of the view. + +### 2.0.0-beta.4 + +- Completely remove FOSRestBundle, you still can use it, but you need to install it yourself. CoreShop only used the + BodyListener to decode POST/PUT Requests, this Listener is now added by CoreShop if FOSRestBundle is not installed. + +## 2.0.0-beta.3 to 2.0.0-beta.4 + +- **BC break**: All occurrences of + parameters `coreshop.all.stack.pimcore_class_ids`, `"application".model."class".pimcore_class_id`, `coreshop.all.pimcore_classes.ids` + have been removed. Inject the corresponding Repository and use `classId` function instead +- **Pimcore**: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order + to use/update CoreShop. + +### Product Price Calculation + +In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by +introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a +Live context, instead it gets passed via API. + +Following interfaces have changed: + +- ```CoreShop\Component\Core\Product\TaxedProductPriceCalculatorInterface``` +- ```CoreShop\Component\Order\Calculator\PurchasableDiscountCalculatorInterface``` +- ```CoreShop\Component\Order\Calculator\PurchasableDiscountPriceCalculatorInterface``` +- ```CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface``` +- ```CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface``` +- ```CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface``` +- ```CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface``` +- ```CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface``` +- ```CoreShop\Component\Product\Calculator\ProductRetailPriceCalculatorInterface``` +- ```CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface``` +- ```CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface``` +- ```CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface``` +- ```CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface``` +- ```CoreShop\Component\Product\Rule\Fetcher\ValidRulesFetcherInterface``` + +If you have anything customized with those classes, please change them accordingly. + +If you use the PriceCalculator Service directly, you also need to change the call from + +``` +$this->priceCalculator->getPrice($object, true) +``` + +to + +``` +$this->priceCalculator->getPrice($object, [ + 'store' => $store, + 'country' => $country, + 'customer' => $customer, + 'currency' $currency, + 'cart' => $cart +], true) +``` + +The new second argument, is the Context for which you want to get the Price. This is highly depends on your +need. On a default CoreShop setup, the context can be fetched form the `ShopperContext` Service like this: + +``` +return [ + 'store' => $this->shopperContext->getStore(), + 'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null, + 'currency' => $this->shopperContext->getCurrency(), + 'country' => $this->shopperContext->getCountry(), + 'cart' => $this->shopperContext->getCart() +]; +``` + +CoreShop makes that easier for you, you can just use ```$this->shoppperContext->getContext()```. But be aware, the +Shopper Context is only in a Web Request available. +When you work on a CLI Level, you have to define the context yourself. + +If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it +resolves from the cart + +``` +$context = [ + 'store' => $cart->getStore(), + 'customer' => $cart->getCustomer() ?: null, + 'currency' => $cart->getCurrency(), + 'country' => $cart->getStore()->getBaseCountry(), + 'cart' => $cart +]; +``` + +### Taxation + +Tax Rule Store relation has been removed as it makes currently no sense. + +### Tracking + +Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any +customizations made, please check the current implementation to adapt your changes. + +### Order Invoice + +Due to changes in adjustments, we also need to change OrderInvoice/OrderInvoiceItem. + +After you have migrated to the latest version you also have to remove some fields: + +#### CoreShopOrderInvoice + +- totalTax +- baseTotalTax +- subtotalTax +- baseSubtotalTax +- shippingTax +- baseShippingTax +- taxes +- baseTaxes +- discountTax +- baseDiscountTax +- discountNet +- discountGross +- baseDiscountNet +- baseDiscountGross +- shippingNet +- shippingGross +- baseShippingNet +- baseShippingGross +- shippingTaxRate + +#### CoreShopOrderInvoiceItem + +- totalTax +- baseTotalTax +- taxes +- baseTaxes + +### Adjustments + +> **BC break / New Feature** + +There are several deprecated class fields. +After you have migrated to the latest version you also have to remove them: + +#### CoreShopOrder / CoreShopQuote + +- shippingGross +- shippingNet +- shippingTax +- discountGross +- discountNet +- discountTax +- baseShippingNet +- baseShippingGross +- baseShippingTax +- baseDiscountNet +- baseDiscountGross +- totalTax +- baseTotalTax +- subTotalTax +- baseSubtotalTax + +#### CoreShopOrderItem / CoreShopQuoteItem + +- totalTax +- baseTotalTax + +#### CoreShopCart + +- shippingGross +- shippingNet +- discountGross +- discountNet + +## 2.0.0-beta.2 to 2.0.0-beta.3 + +- **BC break** Signature of following interfaces changed: + - `CoreShop\Component\Index\Interpreter\InterpreterInterface`: `public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);` + - `CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface`: `public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);` + - `CoreShop\Component\Index\Interpreter\RelationInterpreterInterface`: `public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []);` + - `CoreShop\Component\Customer\Model\UserInterface::ROLE_DEFAULT` + renamed `CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_DEFAULT` + - `CoreShop\Component\Customer\Model\UserInterface::ROLE_SUPER_ADMIN` + renamed `CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_SUPER_ADMIN` + +- **BC break** Shipment / Invoice Creation via API changed + - Before adding a new Shipment / Invoice you need to dispatch a request state to your order. Read more about + it [here](../03_Development/06_Order/18_Invoice/01_Invoice_Creation.md) + and [here](../03_Development/06_Order/19_Shipment/01_Shipment_Creation.md). +- **BC break** getName in `CoreShop\Component\Index\Model\IndexableInterface` has been changed to `getIndexableName` + as `getName` could eventually conflict with a non localized Pimcore Field +- **BC break** getEnabled in `CoreShop\Component\Index\Model\IndexableInterface` has been changed + to `getIndexableEnabled` as `getEnabled` could eventually conflict with a localized Pimcore Field + +## 2.0.0-beta.1 to 2.0.0-beta.2 + +- Link Generator implemented. If you want to use nice urls, you need to add the link generator service: + - CoreShopProduct: add `@coreshop.object.link_generator.product` as Link Provider + - CoreShopCategory: add `@coreshop.object.link_generator.category` as Link Provider + - Change `{{ path('') }}` to `{{ coreshop_path('') }}`. You may want to checkout the FrontendBundle to get a deeper + insight. +- Deprecated Field Names in - CoreShop\Component\Payment\Model\PaymentInterface`: + - getName is now getTitle + - getOrderId is now getOrder and directly returns a OrderInterface +- Deprecated Field Names in - `CoreShop\Component\Shipping\Model\CarrierInterface`: + - getLabel is not getTitle + - getName is now getIdentifier + +## 2.0.0-alpha.4 to 2.0.0-beta.1 + +- **BC break** Signature of following interfaces changed: + - `CoreShop\Component\Index\Interpreter\InterpreterInterface`: `public function interpret($value, IndexableInterface $object, IndexColumnInterface $config);` + - `CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface`: `public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config);` + - `CoreShop\Component\Index\Interpreter\RelationInterpreterInterface`: `public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config);` + +- **BC break** CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, + all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. + To solve the issues, check following things: + - remove `RegisterBundles` entry from `app/AppKernel.php` + - remove loading CoreShopCoreBundle Configuration in `app/config.yml` + - enable CoreShopCoreBundle via CLI or manually + in `var/config/extensions.php`: `"CoreShop\\Bundle\\CoreBundle\\CoreShopCoreBundle" => TRUE` +- **BC break** Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override + certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade. + +## 2.0.0-alpha.4 to 2.0.0-alpha.5 + +- **BC break** added Component\Core\Model\OrderItem and Component\Core\Model\QuoteItem. If you already customized them, + inherit them from the Core Models. +- **BC break** changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit + from `CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker` and implement `isCartRuleValid` instead + of `isValid` +- Deprecated: remove `cart/add-price-rule/` static route. + +## 2.0.0-alpha.3 to 2.0.0-alpha.4 + +- **BC break** decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the + CurrencyBundle. Therefore the name of that extension was renamed from + **coreshop_convert_money** to **coreshop_convert_currency**. If you use it directly in your code, please rename all of + them. +- Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources + like JS and CSS files. + * Installation has been moved to CoreShopCoreBundle + * Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop + Bundles without handling resources yourself. + +## 2.0.0-alpha.2 to 2.0.0-alpha.3 + +- **BC break** getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new + coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple + currencies way more elegant. + + If you still want to use the old getPrice, create a new Subclass of \CoreShop\Component\Core\Model\Product, implement + \CoreShop\Component\Order\Model\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents. + +# V1 to V2 + +- CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If + you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to + V2. +- [Export from CoreShop1](https://github.com/coreshop/CoreShopExport) +- [Import into CoreShop2](https://github.com/coreshop/ImportBundle) + +# Within V1 + +- Nothing available diff --git a/docs/01_Getting_Started/03_Demo.md b/docs/01_Getting_Started/03_Demo.md new file mode 100644 index 0000000000..b37858154f --- /dev/null +++ b/docs/01_Getting_Started/03_Demo.md @@ -0,0 +1,26 @@ +# Demo + +Discover the full potential of CoreShop through our interactive demos. Explore our Open-Source version for a +comprehensive insight into CoreShop's foundational features and capabilities. This demo provides a hands-on experience, +allowing you to witness the power and flexibility of CoreShop in real-world scenarios. Whether you’re a developer, +business owner, or eCommerce enthusiast, our demos offer a valuable glimpse into what CoreShop can do for you. + +## Frontend Demo + +:::info +[https://demo4.coreshop.org](https://demo4.coreshop.org) +::: + +## Backend Demo + +:::info +[https://demo4.coreshop.org/admin](https://demo4.coreshop.org/admin) + +Username: admin / Password: coreshop +::: + + +:::tip +You can also setup this demo locally by running `bin/console coreshop:install:demo` +::: + diff --git a/docs/01_Getting_Started/04_Tests.md b/docs/01_Getting_Started/04_Tests.md new file mode 100644 index 0000000000..cc5edb03ab --- /dev/null +++ b/docs/01_Getting_Started/04_Tests.md @@ -0,0 +1,48 @@ +# Tests + +CoreShop comes with a full test-suite. We use [Behat](https://docs.behat.org/en/latest/) for our Domain-Tests and +Frontend Tests. It also comes with [Psalm](https://psalm.dev/) and [PHPStan](https://phpstan.org/) for Static Analysis. + +## Running Tests Locally + +### Psalm + +``` +vendor/bin/psalm +``` + +### PHPStan + +``` +SYMFONY_ENV=test vendor/bin/phpstan analyse -c phpstan.neon src -l 3 --memory-limit=-1 +``` + +### BEHAT + +- create database `coreshop4__behat` + +#### Install Pimcore and CoreShop in Test Env + +``` +APP_ENV=test PIMCORE_TEST_DB_DSN=mysql://root:ROOT@coreshop-4/coreshop4___behat PIMCORE_INSTALL_ADMIN_USERNAME=admin PIMCORE_INSTALL_ADMIN_PASSWORD=admin PIMCORE_INSTALL_MYSQL_HOST_SOCKET=coreshop-4 PIMCORE_INSTALL_MYSQL_USERNAME=root PIMCORE_INSTALL_MYSQL_PASSWORD=ROOT PIMCORE_INSTALL_MYSQL_DATABASE=coreshop4___behat PIMCORE_INSTALL_MYSQL_PORT=3306 PIMCORE_KERNEL_CLASS=Kernel vendor/bin/pimcore-install --env=test --skip-database-config -n +APP_ENV=test PIMCORE_TEST_DB_DSN=mysql://root:ROOT@coreshop-4/coreshop4___behat bin/console coreshop:install +``` + +#### BEHAT Domain + +``` +CORESHOP_SKIP_DB_SETUP=1 PIMCORE_TEST_DB_DSN=mysql://root:ROOT@coreshop-4/coreshop4___behat vendor/bin/behat -c behat.yml.dist -p default +``` + +#### BEHAT UI + +``` +vendor/bin/bdi detect drivers + +# OUTSIDE CONTAINER +# Run Symfony Server +APP_ENV=test PIMCORE_TEST_DB_DSN=mysql://root:ROOT@127.0.0.1:3306/coreshop4___behat symfony server:start --port=9080 --dir=public --no-tls + +# Run Behat +CORESHOP_SKIP_DB_SETUP=1 PANTHER_EXTERNAL_BASE_URI=http://127.0.0.1:9080/index_test.php PANTHER_NO_HEADLESS=0 PIMCORE_TEST_DB_DSN=mysql://root:ROOT@127.0.0.1:3306/coreshop4___behat php -d memory_limit=-1 vendor/bin/behat -c behat.yml.dist -p ui -vvv +``` \ No newline at end of file diff --git a/docs/docs/01_Getting_Started/img/architecture.png b/docs/01_Getting_Started/img/architecture.png similarity index 100% rename from docs/docs/01_Getting_Started/img/architecture.png rename to docs/01_Getting_Started/img/architecture.png diff --git a/docs/01_Getting_Started/index.md b/docs/01_Getting_Started/index.md new file mode 100644 index 0000000000..901a932e4b --- /dev/null +++ b/docs/01_Getting_Started/index.md @@ -0,0 +1,9 @@ +# Getting Started + +This section provides a quick tutorial to get started with CoreShop. It covers the following topics: + +1. **Installation of Pimcore**: [Installation Guide](./00_Installation.md) +2. **Architecture Overview**: [Architecture Overview](./01_Architecture_Overview.md) +3. **Upgrade Notes**: [Upgrade Notes](./02_Upgrade_Notes.md) +4. **UI Documentation**: [User Interface Documentation](../02_User_Documentation/index.md) +5. **Developer Documentation**: [Developer Documentation](../03_Development/index.md) diff --git a/docs/02_User_Documentation/01_Stores.md b/docs/02_User_Documentation/01_Stores.md new file mode 100644 index 0000000000..67dd0465c1 --- /dev/null +++ b/docs/02_User_Documentation/01_Stores.md @@ -0,0 +1,45 @@ +# Stores + +In CoreShop, each installation is linked to a default store, typically associated with a Pimcore site. Understanding how +stores function is crucial for managing different aspects of your e-commerce platform. + +![Stores](img/stores.png) + +## Domain-Based Store Setup + +CoreShop's default setup involves one store per domain. This means your main website domain corresponds to your default +store. If your platform operates across multiple domains, you can assign a separate store to each. + +> **Tip:** For more information on managing multiple sites with Pimcore, +> see [Pimcore Sites](https://pimcore.com/docs/platform/Pimcore/MVC/Routing_and_URLs/Working_with_Sites/). + +## Custom Store Locator + +In scenarios where you have a single site but require different stores (for example, `/de-at` for an Austrian store +and `/de-de` for a German store), you'll need a custom store locator. Detailed guidance on creating a custom store +locator is available in the development section. + +## Setting Up CoreShop Stores + +To configure stores in CoreShop: + +1. Navigate to CoreShop Menu -> "Stores". +2. You'll see the default store linked to your main domain. +3. To add a new store, click on the "Add" button and proceed with the setup. + +## Utilizing Stores Effectively + +Stores in CoreShop can be leveraged in various ways depending on your business needs: + +### Global Store + +- **Use Case**: Managing multiple currencies, countries, and tax calculations within a single store. +- **Advantage**: Suitable for a unified product and price strategy across different regions. + +### Country Store + +- **Use Case**: Setting up a store for each country, allowing for country-specific restrictions and customizations. +- **Advantage**: Ideal for businesses targeting specific national markets. + +By understanding and utilizing the store configurations in CoreShop, you can tailor your e-commerce experience to meet +diverse regional requirements and customer preferences. diff --git a/docs/02_User_Documentation/02_Settings.md b/docs/02_User_Documentation/02_Settings.md new file mode 100644 index 0000000000..2f315909d1 --- /dev/null +++ b/docs/02_User_Documentation/02_Settings.md @@ -0,0 +1,64 @@ +# Settings + +CoreShop's settings are categorized into individual shop settings and overarching system settings. These configurations +are crucial for tailoring the functionality and behavior of your e-commerce store. + +## Shop-Specific Settings + +Each store in CoreShop can have its unique settings. + +![Settings](img/settings-shop.png) + +### Base Settings + +- **Catalog-Mode**: Enable to view products without cart and checkout functionalities. +- **Guest-Checkout**: Toggle the guest-checkout feature. + +### Customer Service Settings + +- **Customer Email Documents**: Define email templates for customer communication. +- **Contact Sales**: Set default contacts for sales-related inquiries. +- **Contact Technology**: Set default contacts for technology-related inquiries. + +### Stock Settings + +- **Default Stock Behaviour**: Set the general stock behavior for products. + +### Tax Settings + +- **Validate VAT**: Toggle VAT number validation for European countries. +- **Disable VAT for Base Country**: Enable or disable VAT-Free shopping for eligible customers in the base country. +- **Taxation Address**: Determine which address is used for taxation purposes. + +### Price Settings + +- **Prices are gross prices**: Specify whether prices entered in CoreShop include tax. + +### Shipping Settings + +- **Free Shipping Options**: Set conditions for free shipping based on weight or cart value. +- **Carrier Sort**: Define the sorting order for carriers. + +### Product Settings + +- **Default Image**: Set a default image for products without images. +- **Number of days as new**: Define the duration for marking a product as new. + +### Category Settings + +- **Default Image**: Set a default image for categories without images. + +### Invoice Settings + +- **Invoice Creation**: Set conditions for automatic invoice creation. +- **Invoice Number Formatting**: Define prefixes and suffixes for order and invoice numbers. +- **WKHTMLTOPDF Parameters**: Specify parameters for the WKHTMLTOPDF tool. + +### Mail Settings + +- **Order Notification Emails**: Define admin email addresses for order notifications. +- **Send OrderStates as BCC**: Choose whether to send order-state emails to admin-emails. + +### Cart Settings + +- **Automatic Cart Cleanup**: Toggle the automatic cleanup of inactive and empty carts. diff --git a/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md new file mode 100644 index 0000000000..71164c6cd7 --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md @@ -0,0 +1,37 @@ +# Cart Price Rules Documentation + +CoreShop provides a versatile framework for offering discounts and promotions in your e-commerce store using the Pimcore +platform. Cart price rules can be customized based on a variety of factors, including cart subtotal, specific products, +customer groups, and more. This documentation aims to guide you through the process of creating and managing cart price +rules in CoreShop. + +![Cart Price Rules](img/cart-pricerule.png) + +## Crafting Your Cart Price Rules + +### Available Actions + +Enhance your cart with these actions: + +- [Free Shipping](./06_Actions.md#free-shipping): Offer free shipping as an incentive. +- [Gift Product](./06_Actions.md#gift-product): Add a complimentary product to the cart. +- [Discount Amount](./06_Actions.md#discount-amount): Apply a fixed discount to the cart total. +- [Discount Percent](./06_Actions.md#discount-percent): Reduce cart total by a percentage. + +### Available Conditions + +Tailor your rules with these conditions: + +- [Customers](./07_Conditions.md#customers): Specific rules for individual customers. +- [Customer Groups](./07_Conditions.md#customer-groups): Target different customer segments. +- [Time Span](./07_Conditions.md#time-span): Rules active during selected time periods. +- [Voucher](./07_Conditions.md#voucher): Implement rules with vouchers. +- [Amount](./07_Conditions.md#amount): Rules based on cart amount. +- [Countries](./07_Conditions.md#countries): Geographically targeted rules. +- [Zones](./07_Conditions.md#zones): Rules for specific zones. +- [Stores](./07_Conditions.md#stores): Store-specific rules. +- [Currencies](./07_Conditions.md#currencies): Currency-based rules. +- [Carriers](./07_Conditions.md#carriers): Rules based on shipping carriers. +- [Nested Rules](./07_Conditions.md#nested-rules): Combine rules for complex scenarios. +- [Products](./07_Conditions.md#products): Product-specific rules. +- [Categories](./07_Conditions.md#categories): Category-specific rules. diff --git a/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md new file mode 100644 index 0000000000..c5f5f8b0a8 --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md @@ -0,0 +1,33 @@ +# Product Price Rules Documentation + +CoreShop provides a dynamic and flexible approach to implementing discounts and special pricing for products in your +e-commerce store, leveraging the capabilities of the Pimcore platform. These product price rules can be tailored based +on a variety of conditions, allowing you to apply them to specific products, categories, or customer groups. This guide +will help you navigate the process of creating and managing these rules in CoreShop. + +![Product Price Rules](img/product-pricerule.png) + +## Available Actions + +Choose from a range of actions to apply as price rules: + +- [Price](./06_Actions.md#new-price): Set a new price for products. +- [Discount Price](./06_Actions.md#discount-price): Apply a discounted price. +- [Discount Amount](./06_Actions.md#discount-amount): Reduce by a specific amount. +- [Discount Percent](./06_Actions.md#discount-percent): Apply a percentage-based discount. + +## Available Conditions + +Set up price rules based on various conditions: + +- [Customers](./07_Conditions.md#customers): Target individual customers. +- [Customer Groups](./07_Conditions.md#customer-groups): Target specific customer groups. +- [Time Span](./07_Conditions.md#time-span): Apply rules within a certain time frame. +- [Voucher](./07_Conditions.md#voucher): Use in conjunction with vouchers. +- [Countries](./07_Conditions.md#countries): Target customers in specific countries. +- [Zones](./07_Conditions.md#zones): Apply to certain geographical zones. +- [Stores](./07_Conditions.md#stores): Specific to certain stores. +- [Currencies](./07_Conditions.md#currencies): Apply based on currency. +- [Nested Rules](./07_Conditions.md#nested-rules): Combine multiple rules. +- [Products](./07_Conditions.md#products): Specific to certain products. +- [Categories](./07_Conditions.md#categories): Apply to specific categories. diff --git a/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md new file mode 100644 index 0000000000..3541c5b37d --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md @@ -0,0 +1,30 @@ +# Specific Price Rules Documentation + +CoreShop's specific price rules enable a high level of flexibility in offering targeted discounts and special pricing +for individual products or variants in your e-commerce store on the Pimcore platform. These rules can be tailored based +on customer groups, currencies, or countries, ensuring precise application of discounts. This guide will assist you in +the creation and management of specific price rules in CoreShop. + +![Specific Price Rules](img/specific-price-rules.png) + +## Available Actions + +You can use a variety of actions for setting specific prices: + +- [Price](./06_Actions.md#new-price): Set a new, specific price. +- [Discount Price](./06_Actions.md#discount-price): Implement a discounted price. +- [Discount Amount](./06_Actions.md#discount-amount): Reduce the price by a fixed amount. +- [Discount Percent](./06_Actions.md#discount-percent): Apply a percentage-based discount. + +## Available Conditions + +Design rules based on a range of conditions: + +- [Customers](./07_Conditions.md#customers): Target individual customers. +- [Customer Groups](./07_Conditions.md#customer-groups): Apply rules to specific customer groups. +- [Time Span](./07_Conditions.md#time-span): Restrict rules to a specific time period. +- [Countries](./07_Conditions.md#countries): Limit to customers in certain countries. +- [Zones](./07_Conditions.md#zones): Apply within designated zones. +- [Stores](./07_Conditions.md#stores): Specific to certain stores. +- [Currencies](./07_Conditions.md#currencies): Target specific currencies. +- [Nested Rules](./07_Conditions.md#nested-rules): Combine multiple rules for layered pricing strategies. diff --git a/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md new file mode 100644 index 0000000000..35a659673b --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md @@ -0,0 +1,22 @@ +# Quantity Price Rules Documentation + +CoreShop Quantity Price Rules offer a dynamic way to incentivize bulk purchases in your e-commerce store with CoreShop. +These rules enable you to apply volume-based discounts to specific products, with tiered pricing that varies based on +the quantity purchased. This guide will help you in effectively creating and managing quantity price rules within +CoreShop. + +![Quantity Price Rules](img/quantity-price-rules.png) + +## Implementing Quantity Price Rules + +These rules can be applied under various conditions to best suit your sales strategy: + +- [Customers](./07_Conditions.md#customers): Target specific individual customers. +- [Customer Groups](./07_Conditions.md#customer-groups): Apply rules to designated customer groups. +- [Time Span](./07_Conditions.md#time-span): Restrict or activate rules within certain time frames. +- [Countries](./07_Conditions.md#countries): Make rules applicable in selected countries. +- [Zones](./07_Conditions.md#zones): Define rules for specific geographical zones. +- [Stores](./07_Conditions.md#stores): Implement rules in certain stores. +- [Currencies](./07_Conditions.md#currencies): Apply rules based on the currency used. +- [Nested Rules](./07_Conditions.md#nested-rules): Create complex rules by combining multiple conditions. + diff --git a/docs/02_User_Documentation/03_Price_Rules/05_Vouchers.md b/docs/02_User_Documentation/03_Price_Rules/05_Vouchers.md new file mode 100644 index 0000000000..2bf32f73ba --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/05_Vouchers.md @@ -0,0 +1,59 @@ +# Vouchers + +> **Info**: In CoreShop, vouchers are a type of Price Rule. +> To utilize or generate Vouchers, you need to create a Cart Price Rule. + +## How to Create Vouchers + +To create a voucher, start by making a new [cart price rule](./01_Cart_Price_Rules.md) and activate the "Is Voucher +Rule" option. This will enable the "Voucher Codes" tab. + +![Voucher](./img/vouchers-1.png) + +### Voucher Condition + +For more control over Voucher handling, add the "Voucher" condition. + +![Voucher](./img/vouchers-2.png) + +| Name | Description | +|:--------------------------------|:------------------------------------------------| +| Max. Usage per Code | Define the maximum usage for each voucher code. | +| Allow only one Voucher per Code | Limit to one voucher per cart if checked. | + +### Voucher Codes + +Manage your voucher codes in the "Voucher Codes" tab, where you can also export codes to a CSV file. + +![Voucher](./img/vouchers-3.png) + +> For global statistics about vouchers, refer to the [voucher report](../09_Reports/09_Vouchers.md). + +| Name | Description | +|:--------------|:--------------------------------------------------------| +| Code | The generated voucher code. | +| Creation Date | The date when the voucher was created. | +| Used | Indicates if the voucher has been used (true or false). | +| Uses | The number of times each code has been used. | +| Action | Option to delete codes not in use. | + +### Creating Voucher Codes + +There are two methods for generating voucher codes: + +#### Single Voucher Code + +Create an individual voucher code. Note that duplicate strings are not allowed and will trigger an error message. + +#### Voucher Codes Generator + +For bulk generation, use the Voucher Codes Generator: + +| Name | Description | +|:---------------------------|:-------------------------------------------------------------| +| Amount | Number of voucher codes to generate. | +| Length | Length of each voucher code. | +| Format | Format of the code: `Alphanumeric`, `Alphabetic`, `Numeric`. | +| Prefix | A prefix for each code, e.g., `SHOP-`. | +| Suffix | A suffix for each code, e.g., `-SHOP`. | +| Hyphens every X characters | Inserts a dash (`-`) after every X characters. | diff --git a/docs/02_User_Documentation/03_Price_Rules/06_Actions.md b/docs/02_User_Documentation/03_Price_Rules/06_Actions.md new file mode 100644 index 0000000000..20f97cb6ac --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/06_Actions.md @@ -0,0 +1,78 @@ +# Price Rule Actions + +Get a brief overview of all the available *Price Rule Actions* in CoreShop. + +## Free Shipping + +> **Available for**: Cart Price Rules + +This action allows free shipping when added to a cart price rule. + +## Gift Product + +> **Available for**: Cart Price Rules + +Add a gift to the customer's cart with this action. + +#### Options + +| Name | Description | +|:-------------|:----------------------------------------------------------| +| Gift Product | The product must be a registered CoreShop product object. | + +## Discount Amount + +> **Available for**: Cart Price Rules, Specific Product Price, Product Price + +Apply a fixed amount of discount. + +#### Options + +| Name | Description | +|:---------|:------------------------------------------------------------------------------------------| +| Amount | Define the discount amount. | +| Gross | Check if the amount includes VAT. | +| Currency | Specify the currency for the amount. | +| Apply On | Choose between `total` and `subtotal`. **Note:** Only available in the cart rule context. | + +## Discount Percent + +> **Available for**: Cart Price Rules, Specific Product Price, Product Price + +Set a percentage-based discount. + +#### Options + +| Name | Description | +|:---------|:------------------------------------------------------------------------------------------| +| Percent | Define the discount percentage. | +| Apply On | Choose between `total` and `subtotal`. **Note:** Only available in the cart rule context. | + +## New Price + +> **Available for**: Specific Product Price, Product Price + +Set a new price for a product. + +> **Note**: This is used as the new sale price in the frontend, without special discount labelling. For a highlighted +> discount price, use the `Discount Price` action. + +#### Options + +| Name | Description | +|:---------|:----------------------| +| Price | Set the new price. | +| Currency | Specify the currency. | + +## Discount Price + +> **Available for**: Specific Product Price, Product Price + +Define a discounted price for a product. + +#### Options + +| Name | Description | +|:---------|:--------------------------| +| Price | Set the discounted price. | +| Currency | Specify the currency. | diff --git a/docs/02_User_Documentation/03_Price_Rules/07_Conditions.md b/docs/02_User_Documentation/03_Price_Rules/07_Conditions.md new file mode 100644 index 0000000000..a341868be3 --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/07_Conditions.md @@ -0,0 +1,162 @@ +# Price Rules Conditions + +Get a brief overview of all the available *Price Rule Conditions* in CoreShop. + +## Customers + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Target specific customers with the price rule. + +#### Options + +| Name | Description | +|:----------|:---------------------------------------------| +| Customers | Select one or more CoreShop Customer Objects | + +## Customer Groups + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Target specific customer groups. + +#### Options + +| Name | Description | +|:-------|:---------------------------------------------------| +| Groups | Select one or more CoreShop Customer Group Objects | + +## Time Span + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Set the validity period for the price rule. + +#### Options + +| Name | Description | +|:----------|:----------------| +| Date From | Start Date/Time | +| Date To | End Date/Time | + +## Voucher + +> **Available for**: Cart Price Rules + +Configure Voucher conditions. See the [Voucher Section](./05_Vouchers.md) for more details. + +#### Options + +| Name | Description | +|:--------------------------------|:------------------------------------------| +| Max. Usage per Code | Maximum usage for each voucher code. | +| Allow only one Voucher per Code | Limit to one voucher per cart if checked. | + +## Amount + +> **Available for**: Cart Price Rules + +Define the cart amount range for rule application. + +#### Options + +| Name | Description | +|:-----------|:---------------------| +| Min Amount | Minimum cart amount. | +| Max Amount | Maximum cart amount. | + +## Countries + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Link the rule to specific countries. + +#### Options + +| Name | Description | +|:----------|:----------------------------------| +| Countries | Select one or multiple Countries. | + +## Zones + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Associate the rule with specific zones. + +#### Options + +| Name | Description | +|:------|:------------------------------| +| Zones | Select one or multiple Zones. | + +## Stores + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Bind the rule to specific stores. + +#### Options + +| Name | Description | +|:-------|:-------------------------------| +| Stores | Select one or multiple Stores. | + +## Currencies + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Define applicable currencies for the rule. + +#### Options + +| Name | Description | +|:-----------|:-----------------------------------| +| Currencies | Select one or multiple Currencies. | + +## Carriers + +> **Available for**: Cart Price Rules + +Set carrier-based conditions for the rule. + +#### Options + +| Name | Description | +|:---------|:---------------------------------| +| Carriers | Select one or multiple Carriers. | + +## Nested Rules + +> **Available for**: Cart Price Rules, Specific Product Prices, Product Price + +Create complex conditions with `AND`, `OR`, and `NOT` operators. + +#### Options + +| Name | Description | +|:---------|:------------------------------| +| Operator | Choose `AND`, `OR`, or `NOT`. | + +## Products + +> **Available for**: Cart Price Rules, Product Price + +Apply the rule to specific products. + +#### Options + +| Name | Description | +|:---------|:--------------------------------------------| +| Products | Select one or more CoreShop Product Objects | + +## Categories + +> **Available for**: Cart Price Rules, Product Price + +Target products within specific categories. + +#### Options + +| Name | Description | +|:-----------|:---------------------------------------------| +| Categories | Select one or more CoreShop Category Objects | diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/cart-pricerule.png b/docs/02_User_Documentation/03_Price_Rules/img/cart-pricerule.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/cart-pricerule.png rename to docs/02_User_Documentation/03_Price_Rules/img/cart-pricerule.png diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/product-pricerule.png b/docs/02_User_Documentation/03_Price_Rules/img/product-pricerule.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/product-pricerule.png rename to docs/02_User_Documentation/03_Price_Rules/img/product-pricerule.png diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/quantity-price-rules.png b/docs/02_User_Documentation/03_Price_Rules/img/quantity-price-rules.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/quantity-price-rules.png rename to docs/02_User_Documentation/03_Price_Rules/img/quantity-price-rules.png diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/specific-price-rules.png b/docs/02_User_Documentation/03_Price_Rules/img/specific-price-rules.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/specific-price-rules.png rename to docs/02_User_Documentation/03_Price_Rules/img/specific-price-rules.png diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/vouchers-1.png b/docs/02_User_Documentation/03_Price_Rules/img/vouchers-1.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/vouchers-1.png rename to docs/02_User_Documentation/03_Price_Rules/img/vouchers-1.png diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/vouchers-2.png b/docs/02_User_Documentation/03_Price_Rules/img/vouchers-2.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/vouchers-2.png rename to docs/02_User_Documentation/03_Price_Rules/img/vouchers-2.png diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/img/vouchers-3.png b/docs/02_User_Documentation/03_Price_Rules/img/vouchers-3.png similarity index 100% rename from docs/docs/02_User_Documentation/03_Price_Rules/img/vouchers-3.png rename to docs/02_User_Documentation/03_Price_Rules/img/vouchers-3.png diff --git a/docs/02_User_Documentation/03_Price_Rules/index.md b/docs/02_User_Documentation/03_Price_Rules/index.md new file mode 100644 index 0000000000..05444f9d06 --- /dev/null +++ b/docs/02_User_Documentation/03_Price_Rules/index.md @@ -0,0 +1,60 @@ +# Price Rules + +CoreShop Price Rules are powerful tools for price calculation. This section provides a detailed overview of how price +calculation works in CoreShop. + +## Types of Price Rules + +There are three types of Price Rules in CoreShop: + +#### 1. Cart Price Rules + +Apply a Price Rule to the customer's cart. + +#### 2. Product Price Rules + +Apply a Price Rule globally to products. + +#### 3. Specific Product Prices + +Apply Price Rules to specific products. + +## Global Priority + +The order of priority for price rules is as follows: + +1. **Product Price Rules** are applied first. +2. **Specific Product Prices** are applied second. + +### Example 1: + +- Given: Product A with a price of 100,- +- Product Price Rule for Product A: New Price 50,- +- Specific Price Rule for Product A: New Price 20,- +- Resulting Price: 20,- + +### Example 2: + +- Given: Product A with a price of 100,- +- Product Price Rule for Product A: Discount Percentage 50% +- Specific Price Rule for Product A: New Price 50,- +- Resulting Price: 25,- + +## Specific Price Priority + +It's possible to add multiple Specific Price Rules per Product. The priority can be adjusted using the priority number +field. + +## Automatic Rule Availability Checker + +Rules with time-span elements included on the root level will be disabled automatically if they're outdated. Read more +about automation [here](../10_Automation/index.md). + +## More Information + +- [Cart Price Rules](./01_Cart_Price_Rules.md) +- [Product Price Rules](./02_Product_Price_Rules.md) +- [Specific Product Prices](./03_Specific_Price_Rules.md) +- [Vouchers](./05_Vouchers.md) +- [Available Actions](./06_Actions.md) +- [Available Conditions](./07_Conditions.md) diff --git a/docs/02_User_Documentation/04_Localization/01_Countries.md b/docs/02_User_Documentation/04_Localization/01_Countries.md new file mode 100644 index 0000000000..ab651057e3 --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/01_Countries.md @@ -0,0 +1,14 @@ +# Country Configuration + +In CoreShop, each country is defined by a set of attributes that determine how it interacts with your store. Here's what +each attribute represents: + +- **Name**: The official name of the country. +- **ISO-Code**: The standardized international code for the country. +- **Active**: This flag determines if customers from this country can make purchases from your store. +- **Use Store Default Currency**: When checked, transactions from this country will use your store's default currency. +- **Currency**: The specific currency associated with the country. +- **Zone**: The geographical or commercial zone to which the country belongs. +- **Stores**: Specifies which of your stores the country settings apply to. + +![Countries](img/countries.png) diff --git a/docs/02_User_Documentation/04_Localization/02_States.md b/docs/02_User_Documentation/04_Localization/02_States.md new file mode 100644 index 0000000000..267e892e31 --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/02_States.md @@ -0,0 +1,11 @@ +# State Configuration + +In CoreShop, a State (or County) is defined by several key attributes essential for regional management within your +store. These attributes include: + +- **Name**: The name of the state or county. +- **ISO Code**: A unique code that follows international standards for identifying the state. +- **Active**: Indicates whether the state is active for transactions and operations in your store. +- **Country**: The country to which the state belongs. + +![States](img/states.png) diff --git a/docs/02_User_Documentation/04_Localization/03_Zones.md b/docs/02_User_Documentation/04_Localization/03_Zones.md new file mode 100644 index 0000000000..c1422888bf --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/03_Zones.md @@ -0,0 +1,9 @@ +# Zone Configuration + +In CoreShop, a 'Zone' functions as a group of countries and is defined by a set of attributes. Zones are primarily used +for configuring Price Rules and Shipping Rules. Here's an overview of the attributes for a Zone: + +- **Name**: The designated name of the zone. +- **Active**: Indicates whether the zone is active and can be used in the store's operational settings. + +![Zones](img/zones.png) diff --git a/docs/02_User_Documentation/04_Localization/04_Currencies.md b/docs/02_User_Documentation/04_Localization/04_Currencies.md new file mode 100644 index 0000000000..280bed2ecc --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/04_Currencies.md @@ -0,0 +1,19 @@ +# Currencies + +In CoreShop, the configuration of a currency involves several key attributes essential for international transactions +and currency management. + +- **Name**: The official name of the currency. +- **ISO Code**: The standardized international three-letter code representing the currency. +- **Numeric ISO Code**: The numerical code assigned to the currency, as per international standards. +- **Symbol**: The graphical symbol or abbreviation used to denote the currency (e.g., $ for USD, € for EUR). + +![Currencies](img/currencies.png) + +## Exchange Rates + +CoreShop supports automated calculation of exchange rates, simplifying the process of maintaining current and accurate +currency information. This feature is particularly useful for stores that handle transactions in multiple currencies and +need to ensure consistent and fair pricing across different regions. + +> **Important**: Regular updates of exchange rates are necessary for accurate currency conversion. \ No newline at end of file diff --git a/docs/02_User_Documentation/04_Localization/05_Taxes.md b/docs/02_User_Documentation/04_Localization/05_Taxes.md new file mode 100644 index 0000000000..3fd1d73751 --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/05_Taxes.md @@ -0,0 +1,11 @@ +# Taxes Configuration + +In CoreShop, tax rates are crucial for accurately calculating the applicable taxes on products and services. Each tax +rate is defined by the following attributes: + +- **Localized Name**: The name of the tax rate as it appears in the shopping cart and on invoices. It can be localized + to match the language preferences of different regions. +- **Rate**: The percentage value of the tax, such as 20%. +- **Active**: Indicates whether the tax rate is currently active and applicable. + +![Taxes](img/taxes.png) diff --git a/docs/02_User_Documentation/04_Localization/06_TaxRules.md b/docs/02_User_Documentation/04_Localization/06_TaxRules.md new file mode 100644 index 0000000000..9988025507 --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/06_TaxRules.md @@ -0,0 +1,16 @@ +# Tax Rules + +Tax Rules in CoreShop are instrumental in determining the appropriate Tax Rate based on the customer's country or state. +These rules ensure that the correct tax is applied to products during transactions. + +## Key Components of a Tax Rule + +Each Tax Rule is characterized by several important attributes: + +- **Name**: The identifier for the Tax Rule. +- **Active**: Indicates whether the Tax Rule is currently in use. +- **Stores**: Specifies which stores can apply this Tax Rule. +- **Rules**: Defines the relationship between Countries/States and Tax Rates, and the handling of scenarios where + multiple Tax Rates are applicable. + +![Tax Rules](img/taxrules.png) diff --git a/docs/docs/02_User_Documentation/04_Localization/img/countries.png b/docs/02_User_Documentation/04_Localization/img/countries.png similarity index 100% rename from docs/docs/02_User_Documentation/04_Localization/img/countries.png rename to docs/02_User_Documentation/04_Localization/img/countries.png diff --git a/docs/docs/02_User_Documentation/04_Localization/img/currencies.png b/docs/02_User_Documentation/04_Localization/img/currencies.png similarity index 100% rename from docs/docs/02_User_Documentation/04_Localization/img/currencies.png rename to docs/02_User_Documentation/04_Localization/img/currencies.png diff --git a/docs/docs/02_User_Documentation/04_Localization/img/states.png b/docs/02_User_Documentation/04_Localization/img/states.png similarity index 100% rename from docs/docs/02_User_Documentation/04_Localization/img/states.png rename to docs/02_User_Documentation/04_Localization/img/states.png diff --git a/docs/docs/02_User_Documentation/04_Localization/img/taxes.png b/docs/02_User_Documentation/04_Localization/img/taxes.png similarity index 100% rename from docs/docs/02_User_Documentation/04_Localization/img/taxes.png rename to docs/02_User_Documentation/04_Localization/img/taxes.png diff --git a/docs/docs/02_User_Documentation/04_Localization/img/taxrules.png b/docs/02_User_Documentation/04_Localization/img/taxrules.png similarity index 100% rename from docs/docs/02_User_Documentation/04_Localization/img/taxrules.png rename to docs/02_User_Documentation/04_Localization/img/taxrules.png diff --git a/docs/docs/02_User_Documentation/04_Localization/img/zones.png b/docs/02_User_Documentation/04_Localization/img/zones.png similarity index 100% rename from docs/docs/02_User_Documentation/04_Localization/img/zones.png rename to docs/02_User_Documentation/04_Localization/img/zones.png diff --git a/docs/02_User_Documentation/04_Localization/index.md b/docs/02_User_Documentation/04_Localization/index.md new file mode 100644 index 0000000000..2d336784b6 --- /dev/null +++ b/docs/02_User_Documentation/04_Localization/index.md @@ -0,0 +1,13 @@ +# Localization + +CoreShop provides comprehensive options for localization, ensuring that your e-commerce store can cater to a global +audience with region-specific settings. Below are the key components of CoreShop's localization system, each linked to +detailed documentation: + +- **Countries**: Configure countries. [Learn More](./01_Countries.md) +- **States**: Manage state or county settings within each country. [Learn More](./02_States.md) +- **Zones**: Group countries or regions for targeted rules and pricing. [Learn More](./03_Zones.md) +- **Currencies**: Set up and manage multiple currencies for international transactions. [Learn More](./04_Currencies.md) +- **Taxes**: Define tax rates and rules applicable to different regions. [Learn More](./05_Taxes.md) +- **Tax Rules**: Determine how taxes are applied based on customer location. [Learn More](./06_TaxRules.md) + diff --git a/docs/02_User_Documentation/05_Shipping/01_Carriers.md b/docs/02_User_Documentation/05_Shipping/01_Carriers.md new file mode 100644 index 0000000000..3562df676b --- /dev/null +++ b/docs/02_User_Documentation/05_Shipping/01_Carriers.md @@ -0,0 +1,31 @@ +# Carriers + +CoreShop Carriers play a pivotal role in the shipping process of the CoreShop e-commerce framework, enabling you to +integrate various shipping providers like UPS, FedEx, or DHL. This guide outlines the steps for creating and managing +carriers within the CoreShop environment on the Pimcore platform. + +## Creating a Carrier + +Follow these steps to set up a new carrier: + +1. **Access Admin Interface**: Log in to the Pimcore admin interface. +2. **Navigate to Shipping**: Go to the "CoreShop Menu" -> "Shipping" tab and select "Carriers." +3. **Add New Carrier**: Click on "Add new" to initiate a new carrier setup. +4. **Configure Carrier**: Enter the carrier's name and adjust the settings as required. + +## Carrier Configuration Options + +Each carrier in CoreShop can be customized with various options: + +- **Name**: Assign a descriptive name (e.g., UPS, FedEx, or DHL). +- **Tracking URL**: Provide a URL for tracking shipments. +- **Tax Rule Group**: Select a tax rule group for applying taxes to shipping costs. This requires the prior setup of an + appropriate tax rule group. +- **Shipping Rules**: Define shipping costs and conditions. You can link multiple shipping rules with different + priorities to determine the final shipping cost. + +## Summary + +Carriers in CoreShop are essential for offering diverse and customized shipping options. Through careful configuration +of carriers and their associated shipping rules, you can provide a seamless and efficient shipping experience, catering +to various customer preferences and logistics requirements in your e-commerce store. diff --git a/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md b/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md new file mode 100644 index 0000000000..ef15b69e6a --- /dev/null +++ b/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md @@ -0,0 +1,62 @@ +# Shipping Rules + +CoreShop Shipping Rules are a key feature within the CoreShop e-commerce framework on the Pimcore platform, enabling you +to define shipping costs through customizable rules. These rules can be based on various conditions such as weight, +price, dimensions, and shipping destination. + +## Overview + +Shipping rules in CoreShop are composed of conditions and actions: + +- **Conditions**: Determine the applicability of a rule. +- **Actions**: Define the adjustments to shipping costs when a rule is applied. + +You can create a variety of rules, each tailored to specific shipping scenarios. + +## Creating Shipping Rules + +1. **Access Shipping Rules**: Navigate to the "Shipping" tab and select "Shipping Rules." +2. **Add New Rule**: Click "Add new" to start creating a rule. +3. **Configure Rule**: Name the rule and adjust settings according to your requirements. + +## Configuring Conditions + +Conditions are criteria that must be met for a shipping rule to apply. CoreShop supports multiple conditions per rule, +including: + +- **Weight**: Based on the total weight of the order. +- **Price**: Based on the total price of the order. +- **Dimension**: Based on order dimensions (length, width, height). +- **Quantity**: Based on the total quantity of items. +- **Countries**: Targeting specific shipping destinations. +- **Zones**: Focusing on particular geographic zones. + +### Setting Up a Condition + +- Click "Add Condition" in the rule's "Conditions" section. +- Select a condition type and configure its parameters. + +Example: For orders over 10kg, add a weight condition with a minimum weight of 10kg. + +## Configuring Actions + +Actions determine how shipping costs are modified when a rule is triggered. CoreShop allows for multiple actions per +rule, such as: + +- **Discount Amount**: A fixed discount on shipping costs. +- **Discount Percentage**: A percentage discount on shipping costs. +- **Add Amount**: An additional fixed amount to the shipping costs. +- **Add Percentage**: An extra percentage to the shipping costs. + +### Setting Up an Action + +- Click "Add Action" in the rule's "Actions" section. +- Choose an action type and set the necessary parameters. + +Example: For a 20% shipping discount, add a discount percentage action and set it to 20%. + +## Summary + +CoreShop Shipping Rules provide a versatile and robust mechanism to manage shipping costs in your e-commerce store. By +leveraging various conditions and actions, you can tailor shipping costs to meet diverse requirements and offer precise +shipping estimates to your customers. diff --git a/docs/docs/02_User_Documentation/05_Shipping/img/carriers.png b/docs/02_User_Documentation/05_Shipping/img/carriers.png similarity index 100% rename from docs/docs/02_User_Documentation/05_Shipping/img/carriers.png rename to docs/02_User_Documentation/05_Shipping/img/carriers.png diff --git a/docs/docs/02_User_Documentation/05_Shipping/img/example1-conditions.png b/docs/02_User_Documentation/05_Shipping/img/example1-conditions.png similarity index 100% rename from docs/docs/02_User_Documentation/05_Shipping/img/example1-conditions.png rename to docs/02_User_Documentation/05_Shipping/img/example1-conditions.png diff --git a/docs/docs/02_User_Documentation/05_Shipping/img/example2-action.png b/docs/02_User_Documentation/05_Shipping/img/example2-action.png similarity index 100% rename from docs/docs/02_User_Documentation/05_Shipping/img/example2-action.png rename to docs/02_User_Documentation/05_Shipping/img/example2-action.png diff --git a/docs/02_User_Documentation/05_Shipping/index.md b/docs/02_User_Documentation/05_Shipping/index.md new file mode 100644 index 0000000000..b239b9f771 --- /dev/null +++ b/docs/02_User_Documentation/05_Shipping/index.md @@ -0,0 +1,7 @@ +# Shipping + +CoreShop provides a comprehensive shipping management system that allows you to define and configure various aspects of +shipping, such as carriers, shipping rules, and carrier services. + +* [Carriers](./01_Carriers.md) +* [Shipping Rules](./02_Shipping_Rules.md) \ No newline at end of file diff --git a/docs/02_User_Documentation/06_Cart/index.md b/docs/02_User_Documentation/06_Cart/index.md new file mode 100644 index 0000000000..f602108cd6 --- /dev/null +++ b/docs/02_User_Documentation/06_Cart/index.md @@ -0,0 +1,21 @@ +# Cart + +## Inventory Check on Cart Addition + +When a customer adds an item to their cart, CoreShop verifies product stock availability. In cases where stock is +insufficient, the customer is informed through a form error. + +## Auto-Removal of Disabled or Deleted Products + +Should a product be disabled or deleted from the backend, CoreShop will automatically remove it from all active carts. +Customers with modified carts will receive a form error notification in the frontend. + +## Handling Abandoned Carts + +By default, carts are not deleted in CoreShop. This approach allows for: + +- Analysis of abandoned cart statistics. +- Development of customized follow-up strategies, such as email notifications to customers. + +For managing abandoned carts, including their removal, refer to +the [expire cart command](../../03_Development/06_Order/20_Commands.md) in the development section. diff --git a/docs/02_User_Documentation/06_Order/01_Orders.md b/docs/02_User_Documentation/06_Order/01_Orders.md new file mode 100644 index 0000000000..395afce732 --- /dev/null +++ b/docs/02_User_Documentation/06_Order/01_Orders.md @@ -0,0 +1,29 @@ +# Orders + +## Utilizing Grid View for Order Management + +CoreShop's order management leverages Pimcore's grid view, providing a robust and customizable interface. + +### Default Column Configuration + +To access the default column setup: + +1. Click on "Column configuration" located on the right side. +2. Select "Order Overview" from the options. +3. To set this as your preferred view, click the "Column configuration" button again and choose "Set as favorite". + +## Customizing Filters in Grid View + +For project-specific needs, CoreShop allows the addition of custom filter definitions: + +- These customizations require configuration through a PHP service. +- Detailed instructions and guidelines can be + found [here](../../03_Development/06_Order/14_Backend_Management/01_OrderList_Filter.md). + +## Implementing Bulk Actions in Grid View + +CoreShop supports the application of custom bulk actions for selected orders: + +- Similar to filters, these actions are set up via a PHP service. +- For more information on creating and applying these actions, + visit [here](../../03_Development/06_Order/14_Backend_Management/02_OrderList_Action.md). diff --git a/docs/02_User_Documentation/06_Order/02_Order_Detail.md b/docs/02_User_Documentation/06_Order/02_Order_Detail.md new file mode 100644 index 0000000000..e8cd24c68b --- /dev/null +++ b/docs/02_User_Documentation/06_Order/02_Order_Detail.md @@ -0,0 +1,81 @@ +# Order Detail + +The Order Detail section in CoreShop provides comprehensive information about individual orders, including their states, +price overview, and other relevant details. + +## State and Price Overview + +For an in-depth understanding of the order workflow process, refer to +the [Order Workflow documentation](./03_Order_Workflow.md). + +### Key Information + +- **Order Store**: Indicates the store where the order was placed. +- **Total Order Amount**: The complete amount for the order. + +### Order States + +#### Main State + +The primary state summarizing the overall status of the order. + +| Name | Description | +|:----------|:----------------------------| +| new | Newly placed order. | +| confirmed | Order successfully created. | +| cancelled | Order has been cancelled. | +| complete | Order is complete. | + +#### Payment State + +Reflects the overall payment status of the order. + +| Name | Description | +|:-------------------|:-------------------------------| +| new | New payment initiated. | +| awaiting_payment | Awaiting payment confirmation. | +| partially_paid | Partial payment received. | +| paid | Full payment received. | +| cancelled | Payment cancelled. | +| partially_refunded | Partial refund processed. | +| refunded | Full refund processed. | + +#### Shipment State + +Indicates the shipping status of the order. + +| Name | Description | +|:------------------|:----------------------------| +| new | New shipment initiated. | +| cancelled | Shipment cancelled. | +| partially_shipped | Partial shipment completed. | +| shipped | Full shipment completed. | + +#### Invoice State + +Summarizes the invoicing status of the order. + +| Name | Description | +|:-------------------|:-----------------------------| +| new | New invoice created. | +| cancelled | Invoice cancelled. | +| partially_invoiced | Partial invoicing completed. | +| invoiced | Full invoicing completed. | + +## Carrier and Payment Provider Information + +- **Currency**: The currency used for the order. +- **Total Weight**: The cumulative weight of all order items. +- **Carrier**: The shipping provider used. +- **Total Amount**: The total amount for the order. + +## Additional Sections + +- **Order History**: Tracks changes in order states. +- **Payments**: Details about payment transactions. +- **Shipments**: Information on shipment progress. +- **Invoices**: Records of invoicing. +- **Mail Correspondence**: Log of emails related to the order. +- **Customer**: Customer details. +- **Comments**: Any comments or notes on the order. +- **Products**: List of products included in the order. diff --git a/docs/02_User_Documentation/06_Order/03_Order_Workflow.md b/docs/02_User_Documentation/06_Order/03_Order_Workflow.md new file mode 100644 index 0000000000..58c026e7c6 --- /dev/null +++ b/docs/02_User_Documentation/06_Order/03_Order_Workflow.md @@ -0,0 +1,77 @@ +# Order Workflow + +CoreShop provides a comprehensive workflow system for managing various states of orders, payments, shipments, and +invoices. For a technical overview, refer to +the [State Management documentation](../../03_Development/06_Order/16_State_Management/index.md). + +## Changing States + +States can be changed for Orders, Payments, Shipments, and Invoices. If a transition is available, a colored state +button will be displayed. Click this button to change the state. + +## Order Completion + +In CoreShop, an order is considered complete when the payment state reaches `paid` and the shipment state +reaches `shipped`. If you wish to include the invoice state `invoiced` in the order completion criteria, this can be +enabled via the config like this: + +```yml +## app/config/config.yml +parameters: + coreshop.workflow.include_invoice_state_to_complete_order: true +``` + +#### Order Cancellation + +Orders are rarely cancelled in CoreShop, except under specific circumstances: + +- **Front-End Review**: After a customer cancels their payment, they reach a review page where they can restart the + payment process or cancel the order and restore their cart. +- **Back-End Review**: Similar to the front-end, but the customer cannot restore a cart since the order was created in + the back-end. + +More details on the cancellation process can be +found [here](../../03_Development/06_Order/16_State_Management/03_Things_To_Know.md). + +## Payment Workflow + +### Creating a Payment + +Create a payment using the green button in the top-right corner. Payment state changes are typically managed by the +frontend payment gateway. + +### Workflow Rules + +- Payments enter the `new` state upon creation. +- Payments can be cancelled as long as they are in the `new` or `processing` state. +- Once a payment reaches the `completed` state, it can only be refunded. + +> **Attention**: The refund process is not yet implemented in CoreShop! + +## Shipment Workflow + +### Creating a Shipment + +Create a shipment using the green button in the top-right corner, provided there are enough shippable items. + +### Workflow Rules + +- Shipments enter the `ready` state after creation. +- Shipments can be cancelled as long as they are in the `ready` state. +- Once the `ship` state is triggered, a shipment cannot be cancelled anymore. + +## Invoice Workflow + +### Creating an Invoice + +Create an invoice using the green button in the top-right corner, if there are enough invoiceable items. + +### Workflow Rules + +- Invoices enter the `ready` state after creation. +- Invoices can be cancelled as long as they are in the `ready` state. **Note**: Cancelling an invoice is not a refund + action. You are allowed to create another invoice after cancelling the previous one. +- Once the `complete` state is triggered, an invoice cannot be cancelled anymore, which means the invoice has been + finally captured. After that, a refund process must be initiated. + +> **Attention**: The refund process is not yet implemented in CoreShop! diff --git a/docs/02_User_Documentation/06_Order/04_Order_Comments.md b/docs/02_User_Documentation/06_Order/04_Order_Comments.md new file mode 100644 index 0000000000..67026f3134 --- /dev/null +++ b/docs/02_User_Documentation/06_Order/04_Order_Comments.md @@ -0,0 +1,21 @@ +# Order Comments + +CoreShop features a straightforward comment interface, enabling you to add notes to any order. This functionality +facilitates efficient communication and record-keeping within order management. + +![Comment](img/comment2.png) +![Comment](img/comment1.png) + +## Adding and Managing Comments + +You can easily append simple notes or comments to an order through this interface. These comments can serve as internal +reminders or clarifications regarding the order's processing or specific customer requests. + +## Sharing Comments with Customers + +For enhanced customer interaction, CoreShop allows you to share these comments directly with the customer. To do this: + +- Check the option "Submit Comment to Customer" when adding a comment. + +> **Important Note:** Ensure you have a valid Notification Rule set up in CoreShop to successfully send comments to +> customers. This rule is necessary for the system to deliver comment notifications appropriately. diff --git a/docs/docs/02_User_Documentation/06_Order/img/comment1.png b/docs/02_User_Documentation/06_Order/img/comment1.png similarity index 100% rename from docs/docs/02_User_Documentation/06_Order/img/comment1.png rename to docs/02_User_Documentation/06_Order/img/comment1.png diff --git a/docs/docs/02_User_Documentation/06_Order/img/comment2.png b/docs/02_User_Documentation/06_Order/img/comment2.png similarity index 100% rename from docs/docs/02_User_Documentation/06_Order/img/comment2.png rename to docs/02_User_Documentation/06_Order/img/comment2.png diff --git a/docs/docs/02_User_Documentation/06_Order/img/orderstates.png b/docs/02_User_Documentation/06_Order/img/orderstates.png similarity index 100% rename from docs/docs/02_User_Documentation/06_Order/img/orderstates.png rename to docs/02_User_Documentation/06_Order/img/orderstates.png diff --git a/docs/02_User_Documentation/06_Order/index.md b/docs/02_User_Documentation/06_Order/index.md new file mode 100644 index 0000000000..f1469d409c --- /dev/null +++ b/docs/02_User_Documentation/06_Order/index.md @@ -0,0 +1,6 @@ +# Order + +* [Orders](./01_Orders.md) +* [Order Detail](./02_Order_Detail.md) +* [Order Workflow](./03_Order_Workflow.md) +* [Order Comments](./04_Order_Comments.md) \ No newline at end of file diff --git a/docs/02_User_Documentation/07_Catalog/index.md b/docs/02_User_Documentation/07_Catalog/index.md new file mode 100644 index 0000000000..b15e20df7d --- /dev/null +++ b/docs/02_User_Documentation/07_Catalog/index.md @@ -0,0 +1,56 @@ +# Products + +At the heart of any e-commerce store built on the Pimcore platform are its products. CoreShop offers a robust and +versatile system for product management, designed to accommodate the diverse needs of modern e-commerce platforms. + +## Key Features of CoreShop Product Management + +CoreShop’s product management system is equipped with a range of features to effectively handle various aspects of your +e-commerce products: + +- **Product Variants**: Manage different variations of a product, such as size, color, or material, providing customers + with a range of options. +- **Attributes and Specifications**: Define and manage a wide array of product attributes to provide detailed + information to your customers. +- **Product Images and Media**: Easily upload and manage product images and other media, enhancing the visual appeal and + informational value of your products. +- **Pricing and Stock Management**: Set up flexible pricing strategies and keep track of inventory levels to ensure + efficient stock management. +- **Categories and Collections**: Organize products into categories and collections for easier navigation and discovery + by customers. + +### Streamlined Product Handling + +CoreShop’s intuitive interface allows for seamless management of products, ensuring that adding, updating, or removing +products is straightforward and efficient. + +### Customization and Integration + +With its flexible architecture, CoreShop enables extensive customization to meet specific business requirements and +seamless integration with other modules and third-party systems. + +Embracing these powerful features and capabilities will enhance your e-commerce store’s functionality, providing an +enriched shopping experience for your customers and streamlined operations for your business. + +## Variants + +CoreShop incorporates the Variant Bundle to effectively manage product variants. This bundle offers the tools and +features needed to handle different versions of a product, such as size, color, or material variations. + +For detailed information on using the Variant Bundle in CoreShop, refer to +the [Variant Bundle documentation](./../../03_Bundles/Variant_Bundle.md). + +## Categories + +Categories play a crucial role in CoreShop by helping you organize and structure the products in your e-commerce store +on the Pimcore platform. They enable the creation of a hierarchical navigation system, enhancing the shopping experience +by making it easy for customers to browse and find products. + +### Key Benefits of Using Categories + +- **Improved Navigation**: Categories facilitate a user-friendly and intuitive way for customers to navigate through + different sections of your store. +- **Better Organization**: They help in systematically categorizing products, making it easier for both store managers + and customers to locate specific items. +- **Enhanced User Experience**: A well-structured category system contributes to a seamless and enjoyable shopping + experience, encouraging customers to explore more products. diff --git a/docs/02_User_Documentation/08_Inventory/index.md b/docs/02_User_Documentation/08_Inventory/index.md new file mode 100644 index 0000000000..76a517861f --- /dev/null +++ b/docs/02_User_Documentation/08_Inventory/index.md @@ -0,0 +1,43 @@ +# Inventory + +Managing inventory in CoreShop is a critical aspect that involves understanding several key business logics to ensure +accurate stock tracking and order fulfillment. + +## Product Inventory Configuration + +Each product in CoreShop includes a "Stock" tab for inventory management. Here's a breakdown of the available +configurations: + +### Configuration Options + +| Name | Description | +|:-----------|:-------------------------------------------------------------------------------------| +| Is Tracked | Indicates whether the product's stock is tracked. | +| On Hand | The current available quantity of the product. | +| On Hold | The quantity currently reserved (locked) for orders. Do not modify unless necessary. | + +#### Is Tracked + +To activate inventory tracking for a product, enable the "Is Tracked" setting. With this enabled, the product becomes +unorderable in the frontend if the stock is insufficient. + +> **Note**: Inventory tracking is active only when "Is Tracked" is enabled. Without it, the product is considered always +> available, regardless of stock levels. + +#### On Hand + +This setting determines the available stock for each product. The stock decreases automatically with each successful +order. + +#### On Hold + +This setting requires further explanation: + +- After checkout completion, ordered items shift from "On Hand" to "On Hold" until payment is complete. +- If an unpaid order is cancelled, the "On Hold" quantity returns to "On Hand". +- If the order payment status changes to `paid`, the "On Hold" quantity is permanently deducted. + +## Cart and Checkout Process + +During the checkout process, if a product becomes out of stock, it will be removed from the customer's cart, and a form +error will be displayed. This ensures that customers are only able to purchase items that are available in stock. diff --git a/docs/02_User_Documentation/09_Reports/01_Sales.md b/docs/02_User_Documentation/09_Reports/01_Sales.md new file mode 100644 index 0000000000..5297f07a36 --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/01_Sales.md @@ -0,0 +1,40 @@ +# Sales Report Overview + +The CoreShop Sales Report provides a comprehensive analysis of sales data, enabling you to track and understand sales +trends over different time periods. + +![Sales Report](img/sales.png) + +## Report Format + +The Sales Report is presented in a Cartesian Chart format. + +| Type | Has Pagination | +|:----------------|:---------------| +| Cartesian Chart | No | + +## Filters for Tailored Analysis + +Customize your sales data view using a variety of filters: + +| Name | Description | +|:---------|:--------------------------------------------| +| Store | Filter sales by specific Store. | +| Day | Filter sales for the current Day. | +| Month | Filter sales for the current Month. | +| Year | Filter sales for the current Year. | +| Day -1 | Filter sales for the previous Day. | +| Month -1 | Filter sales for the previous Month. | +| Year -1 | Filter sales for the previous Year. | +| From | Start date for the sales filter period. | +| To | End date for the sales filter period. | +| Group By | Group sales data by `Day`, `Month`, `Year`. | + +## Chart Data Fields + +The sales chart includes the following data fields: + +| Name | Description | +|:-----|:--------------------| +| Y | Total Sales Amount. | +| X | Date of Sales. | diff --git a/docs/02_User_Documentation/09_Reports/02_Carts.md b/docs/02_User_Documentation/09_Reports/02_Carts.md new file mode 100644 index 0000000000..5297f07a36 --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/02_Carts.md @@ -0,0 +1,40 @@ +# Sales Report Overview + +The CoreShop Sales Report provides a comprehensive analysis of sales data, enabling you to track and understand sales +trends over different time periods. + +![Sales Report](img/sales.png) + +## Report Format + +The Sales Report is presented in a Cartesian Chart format. + +| Type | Has Pagination | +|:----------------|:---------------| +| Cartesian Chart | No | + +## Filters for Tailored Analysis + +Customize your sales data view using a variety of filters: + +| Name | Description | +|:---------|:--------------------------------------------| +| Store | Filter sales by specific Store. | +| Day | Filter sales for the current Day. | +| Month | Filter sales for the current Month. | +| Year | Filter sales for the current Year. | +| Day -1 | Filter sales for the previous Day. | +| Month -1 | Filter sales for the previous Month. | +| Year -1 | Filter sales for the previous Year. | +| From | Start date for the sales filter period. | +| To | End date for the sales filter period. | +| Group By | Group sales data by `Day`, `Month`, `Year`. | + +## Chart Data Fields + +The sales chart includes the following data fields: + +| Name | Description | +|:-----|:--------------------| +| Y | Total Sales Amount. | +| X | Date of Sales. | diff --git a/docs/02_User_Documentation/09_Reports/03_Abandoned_Carts.md b/docs/02_User_Documentation/09_Reports/03_Abandoned_Carts.md new file mode 100644 index 0000000000..62a52a1f51 --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/03_Abandoned_Carts.md @@ -0,0 +1,43 @@ +# Abandoned Carts Report + +The CoreShop Abandoned Carts Report is an essential tool for analyzing carts that were not converted into orders. This +report helps identify potential issues in the sales process and opportunities for re-engaging customers. + +## Report Format + +The report is presented in a list format with pagination enabled. + +| Type | Has Pagination | +|:-----|:---------------| +| List | Yes | + +## Applying Filters for Targeted Insights + +Customize the report using various filters to focus on specific data: + +| Name | Description | +|:---------|:----------------------------------| +| Store | Filter carts by Store. | +| Day | Filter for the current Day. | +| Month | Filter for the current Month. | +| Year | Filter for the current Year. | +| Day -1 | Filter for the previous Day. | +| Month -1 | Filter for the previous Month. | +| Year -1 | Filter for the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | + +## Key Grid Fields + +The report includes several crucial fields for detailed analysis: + +| Name | Description | +|:------------------|:---------------------------------------------------| +| Customer Name | Name of the customer (if available). | +| Email | Customer's email address (if available). | +| Selected Payment | Name of the payment method chosen. | +| Creation Date | Date when the cart was created. | +| Modification Date | Date when the cart was last modified. | +| Items in Cart | Total number of items in the cart. | +| Action | Option to open the cart object for further review. | + diff --git a/docs/02_User_Documentation/09_Reports/04_Products.md b/docs/02_User_Documentation/09_Reports/04_Products.md new file mode 100644 index 0000000000..b1ffa5ba6a --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/04_Products.md @@ -0,0 +1,54 @@ +# Products Report + +The CoreShop Products Report provides a comprehensive view of product performance, including sales, quantities, and +profits. This report is instrumental for analyzing product trends and making informed inventory decisions. + +![Products Report](img/products.png) + +## Report Format + +The Products Report is presented in a list format with pagination. + +| Type | Has Pagination | +|:-----|:---------------| +| List | Yes | + +## Customizing the Report with Filters + +Enhance your analysis by applying various filters: + +| Name | Description | +|:--------------|:-----------------------------------------------------------------| +| Store | Filter data by specific Store. | +| Day | Filter for the current Day. | +| Month | Filter for the current Month. | +| Year | Filter for the current Year. | +| Day -1 | Filter for the previous Day. | +| Month -1 | Filter for the previous Month. | +| Year -1 | Filter for the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | +| Product Types | Group data by `Main Products`, `Variants`, `Container Products`. | + +## Understanding Product Types + +Differentiate products based on their type for targeted analysis: + +| Name | Description | +|:-------------------|:---------------------------------------------------------------------------------------------------------------| +| Main Products | Displays only products without variant inclusion. | +| Variants | Shows only variant product types. | +| Container Products | Summarizes products and their child-products. Note: Ignored in report if the main pimcore objects are deleted. | + +## Key Grid Fields + +Analyze key metrics with the following data fields: + +| Name | Description | +|:------------|:----------------------------------------| +| Name | Product name. | +| Order Count | Total number of orders for the product. | +| Quantity | Total quantity sold. | +| Sale Price | Average sale price. | +| Sales | Total sales amount. | +| Profit | Total profit amount. | diff --git a/docs/02_User_Documentation/09_Reports/05_Categories.md b/docs/02_User_Documentation/09_Reports/05_Categories.md new file mode 100644 index 0000000000..900d03a418 --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/05_Categories.md @@ -0,0 +1,42 @@ +# Categories Report + +The CoreShop Categories Report offers valuable insights into the performance of different product categories within your +e-commerce store. This data can be instrumental in making informed decisions about inventory and marketing strategies. + +![Categories Report](img/categories.png) + +## Report Format + +The Categories Report is displayed in a list format. + +| Type | Has Pagination | +|:-----|:---------------| +| List | No | + +## Applying Filters for Detailed Analysis + +Customize the report for targeted insights using the following filters: + +| Name | Description | +|:---------|:------------------------------------| +| Store | Filter results by a specific Store. | +| Day | Filter for the current Day. | +| Month | Filter for the current Month. | +| Year | Filter for the current Year. | +| Day -1 | Filter for the previous Day. | +| Month -1 | Filter for the previous Month. | +| Year -1 | Filter for the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | + +## Key Grid Fields + +The report includes several essential fields for comprehensive category analysis: + +| Name | Description | +|:------------|:-------------------------------------------------| +| Name | The name of the product category. | +| Order Count | Total number of orders in the category. | +| Quantity | Total quantity of products sold in the category. | +| Sales | Total sales generated from the category. | +| Profit | Total profit from the category. | diff --git a/docs/02_User_Documentation/09_Reports/06_Customers.md b/docs/02_User_Documentation/09_Reports/06_Customers.md new file mode 100644 index 0000000000..a0316a8f6b --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/06_Customers.md @@ -0,0 +1,40 @@ +# Customers Report + +The CoreShop Customers Report provides an in-depth view of customer interactions within your e-commerce store. It offers +valuable insights into customer purchasing patterns, helping to tailor marketing and sales strategies effectively. + +![Customers Report](img/customers.png) + +## Report Format + +This report is formatted as a list, providing a detailed breakdown of customer activities. + +| Type | Has Pagination | +|:-----|:---------------| +| List | No | + +## Customizing the Report with Filters + +Enhance your analysis with various filters to focus on specific customer segments or timeframes: + +| Name | Description | +|:---------|:-----------------------------------------------| +| Store | Filter data by specific Store. | +| Day | Filter for transactions on the current Day. | +| Month | Filter for transactions in the current Month. | +| Year | Filter for transactions in the current Year. | +| Day -1 | Filter for transactions on the previous Day. | +| Month -1 | Filter for transactions in the previous Month. | +| Year -1 | Filter for transactions in the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | + +## Key Grid Fields + +The report includes critical fields to understand customer engagement: + +| Name | Description | +|:------------|:-----------------------------------------------| +| Name | The name of the customer. | +| Order Count | Total number of orders placed by the customer. | +| Sales | Total sales attributed to the customer. | diff --git a/docs/02_User_Documentation/09_Reports/07_Carrier_Distribution.md b/docs/02_User_Documentation/09_Reports/07_Carrier_Distribution.md new file mode 100644 index 0000000000..b25574a6b4 --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/07_Carrier_Distribution.md @@ -0,0 +1,38 @@ +# Carrier Distribution Report + +The CoreShop Carrier Distribution Report provides a visual representation of how different carriers are utilized for +shipping in your e-commerce store. This report, presented as a pie chart, is crucial for analyzing shipping preferences +and efficiency. + +![Carrier Distribution](img/carriers.png) + +## Report Format + +The report is displayed as a pie chart, offering a clear visual breakdown of carrier usage. + +| Type | Has Pagination | +|:----------|:---------------| +| Pie Chart | No | + +## Customizing the Report with Filters + +Apply various filters to refine your data analysis: + +| Name | Description | +|:---------|:-----------------------------------------------| +| Store | Filter by specific Store. | +| Day | Filter for transactions on the current Day. | +| Month | Filter for transactions in the current Month. | +| Year | Filter for transactions in the current Year. | +| Day -1 | Filter for transactions on the previous Day. | +| Month -1 | Filter for transactions in the previous Month. | +| Year -1 | Filter for transactions in the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | + +## Chart Fields + +The Carrier Distribution Report includes the following field: + +- **Carrier Distribution**: This field visualizes the proportion of each carrier used for shipping orders, helping you + to understand which carriers are most popular or efficient for your store. diff --git a/docs/02_User_Documentation/09_Reports/08_Payment_Distribution.md b/docs/02_User_Documentation/09_Reports/08_Payment_Distribution.md new file mode 100644 index 0000000000..ae8deedb3f --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/08_Payment_Distribution.md @@ -0,0 +1,38 @@ +# Payment Distribution Report + +The CoreShop Payment Distribution Report offers a detailed analysis of the various payment methods used in your +e-commerce store. Presented as a pie chart, this report is essential for understanding customer payment preferences and +optimizing your payment options. + +![Payment Distribution](img/payments.png) + +## Report Format + +This report utilizes a pie chart format to provide a visual overview of payment distribution. + +| Type | Has Pagination | +|:----------|:---------------| +| Pie Chart | No | + +## Applying Filters for Detailed Insights + +Customize your report using the following filters to focus on specific data points: + +| Name | Description | +|:---------|:-----------------------------------------------| +| Store | Filter data by specific Store. | +| Day | Filter for transactions on the current Day. | +| Month | Filter for transactions in the current Month. | +| Year | Filter for transactions in the current Year. | +| Day -1 | Filter for transactions on the previous Day. | +| Month -1 | Filter for transactions in the previous Month. | +| Year -1 | Filter for transactions in the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | + +## Chart Field + +The Payment Distribution Report includes the following field: + +- **Payment Provider Distribution**: This field visualizes the usage frequency of each payment provider, enabling you to + assess which payment methods are most popular among your customers. diff --git a/docs/02_User_Documentation/09_Reports/09_Vouchers.md b/docs/02_User_Documentation/09_Reports/09_Vouchers.md new file mode 100644 index 0000000000..718c5ee57f --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/09_Vouchers.md @@ -0,0 +1,40 @@ +# Voucher Report + +The CoreShop Voucher Report provides an analysis of voucher usage within your e-commerce store. This report is +particularly useful for tracking the effectiveness of promotional campaigns and understanding customer response to +vouchers. + +## Report Format + +The Voucher Report is presented in a list format with pagination available. + +| Type | Has Pagination | +|:-----|:---------------| +| List | Yes | + +## Customizing the Report with Filters + +Use the following filters to refine and target your analysis: + +| Name | Description | +|:---------|:------------------------------------------------| +| Store | Filter vouchers used in a specific Store. | +| Day | Filter for vouchers used on the current Day. | +| Month | Filter for vouchers used in the current Month. | +| Year | Filter for vouchers used in the current Year. | +| Day -1 | Filter for vouchers used on the previous Day. | +| Month -1 | Filter for vouchers used in the previous Month. | +| Year -1 | Filter for vouchers used in the previous Year. | +| From | Start date for the filter period. | +| To | End date for the filter period. | + +## Key Grid Fields + +The report includes essential data fields for a comprehensive overview of voucher use: + +| Name | Description | +|:-------------|:---------------------------------------------------| +| Code | The voucher code that was applied. | +| Discount | The amount of discount provided by the voucher. | +| Price Rule | The name of the price rule applied by the voucher. | +| Applied Date | The date when the voucher was applied. | diff --git a/docs/docs/02_User_Documentation/09_Reports/img/carriers.png b/docs/02_User_Documentation/09_Reports/img/carriers.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/carriers.png rename to docs/02_User_Documentation/09_Reports/img/carriers.png diff --git a/docs/docs/02_User_Documentation/09_Reports/img/carts.png b/docs/02_User_Documentation/09_Reports/img/carts.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/carts.png rename to docs/02_User_Documentation/09_Reports/img/carts.png diff --git a/docs/docs/02_User_Documentation/09_Reports/img/categories.png b/docs/02_User_Documentation/09_Reports/img/categories.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/categories.png rename to docs/02_User_Documentation/09_Reports/img/categories.png diff --git a/docs/docs/02_User_Documentation/09_Reports/img/customers.png b/docs/02_User_Documentation/09_Reports/img/customers.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/customers.png rename to docs/02_User_Documentation/09_Reports/img/customers.png diff --git a/docs/docs/02_User_Documentation/09_Reports/img/payments.png b/docs/02_User_Documentation/09_Reports/img/payments.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/payments.png rename to docs/02_User_Documentation/09_Reports/img/payments.png diff --git a/docs/docs/02_User_Documentation/09_Reports/img/products.png b/docs/02_User_Documentation/09_Reports/img/products.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/products.png rename to docs/02_User_Documentation/09_Reports/img/products.png diff --git a/docs/docs/02_User_Documentation/09_Reports/img/sales.png b/docs/02_User_Documentation/09_Reports/img/sales.png similarity index 100% rename from docs/docs/02_User_Documentation/09_Reports/img/sales.png rename to docs/02_User_Documentation/09_Reports/img/sales.png diff --git a/docs/02_User_Documentation/09_Reports/index.md b/docs/02_User_Documentation/09_Reports/index.md new file mode 100644 index 0000000000..b8dc311d91 --- /dev/null +++ b/docs/02_User_Documentation/09_Reports/index.md @@ -0,0 +1,28 @@ +# Reporting Tools Overview + +CoreShop provides a comprehensive suite of reporting tools designed to deliver valuable insights into various facets of +your e-commerce store. These reports are crucial for understanding sales trends, customer behaviors, and other key +metrics, helping you make informed decisions to drive your business forward. + +## Explore Our Range of Reports + +Each report in CoreShop is tailored to offer specific insights: + +- **Sales Reports**: Delve into your store's sales performance, including revenue and order volumes, to gauge your + business's success. [Access Sales Report](./01_Sales.md) +- **Cart/Order Conversion**: Analyze the rate at which carts are converted into completed orders, a vital metric for + understanding the effectiveness of your sales funnel. [Access Cart/Order Conversion Report](./02_Carts.md) +- **Abandoned Carts**: Identify and understand the carts that weren’t converted into orders, providing insights into + potential sales recovery strategies. [Access Abandoned Carts Report](./03_Abandoned_Carts.md) +- **Product Reports**: Evaluate individual product performances within your catalog, helping you make data-driven + inventory decisions. [Access Product Report](./04_Products.md) +- **Category Reports**: Gain insights into category performances, essential for strategic product placement and + marketing. [Access Category Report](./05_Categories.md) +- **Customer Analysis**: Dive deep into customer behaviors and purchasing patterns to tailor your marketing and sales + approaches. [Access Customer Analysis Report](./06_Customers.md) +- **Carrier Distribution**: Review how different carriers are used for order deliveries, an important aspect of your + shipping strategy. [Access Carrier Distribution Report](./07_Carrier_Distribution.md) +- **Payment Distribution**: Understand the distribution and popularity of various payment methods among your + customers. [Access Payment Distribution Report](./08_Payment_Distribution.md) +- **Voucher Usage**: Monitor how vouchers are used and their impact on sales, vital for optimizing promotional + strategies. [Access Voucher Report](./09_Vouchers.md) diff --git a/docs/02_User_Documentation/10_Automation/index.md b/docs/02_User_Documentation/10_Automation/index.md new file mode 100644 index 0000000000..19b211fb24 --- /dev/null +++ b/docs/02_User_Documentation/10_Automation/index.md @@ -0,0 +1,85 @@ +# Automation + +CoreShop implements several automated mechanisms to streamline operations and maintain order within the system. These +automations are executed daily via maintenance jobs. + +## Order Cancellation Automation + +**Execution Time**: Once per day. + +### Default Behavior + +CoreShop automatically cancels orders that are older than 20 days. + +### Customizing Order Expiration + +To change the expiration period for orders, modify the configuration as follows: + +```yml +core_shop_storage_list: + list: + order: + expiration: + params: + order: + days: 30 +``` + +## Expired Carts Cleanup + +**Execution Time**: Once per day. + +> **Note**: By default, cart cleanup is disabled (set to 0 days). + +Expired carts are not removed unless you enable and configure this feature. Set a specific timeframe after which +inactive carts should be cleaned up to manage cart data effectively. + +#### Enabling Cart Cleanup + +To activate and set a specific time frame for cart cleanup: + +```yml +core_shop_storage_list: + list: + order: + expiration: + params: + cart: + days: 20 + params: + anonymous: true + customer: false +``` + +## Expired Wishlists + +**Execution Time**: Once per day. +> **Note**: Wishlist expiration is disabled by default. + +Similar to carts, wishlists also do not expire by default. You can enable this feature and set an expiration period for +wishlists, helping to maintain a clean and current wishlist database. + +#### Setting Wishlist Expiration + +To enable and configure the expiration for wishlists: + +```yml +core_shop_storage_list: + list: + wishlist: + expiration: + service: ~ # use default service + enabled: true + days: 14 + params: + anonymous: true + customer: false +``` + +## Expired Rules Management + +**Execution Time**: Once per day. + +CoreShop automatically disables rules that are beyond their valid time-span. This feature helps in keeping your rule set +relevant and up-to-date. For more complex rule availability logic, CoreShop provides an +event (`coreshop.rule.availability_check`) that allows for custom implementation of rule availability criteria. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/img/settings-shop.png b/docs/02_User_Documentation/img/settings-shop.png similarity index 100% rename from docs/docs/02_User_Documentation/img/settings-shop.png rename to docs/02_User_Documentation/img/settings-shop.png diff --git a/docs/docs/02_User_Documentation/img/stores.png b/docs/02_User_Documentation/img/stores.png similarity index 100% rename from docs/docs/02_User_Documentation/img/stores.png rename to docs/02_User_Documentation/img/stores.png diff --git a/docs/02_User_Documentation/index.md b/docs/02_User_Documentation/index.md new file mode 100644 index 0000000000..5ef0c98824 --- /dev/null +++ b/docs/02_User_Documentation/index.md @@ -0,0 +1,50 @@ +# User Documentation + +Welcome to the CoreShop User Documentation! This section provides a comprehensive guide to get you started with +CoreShop, covering various key aspects of the platform. + +## Quick Start Topics + +Explore these topics to familiarize yourself with the CoreShop platform: + +1. **[Stores](./01_Stores.md)**: Understanding the store setup in CoreShop. +2. **[Settings](./02_Settings.md)**: Configuration options for each store and system-wide settings. +3. **Price Rules**: Comprehensive guide to pricing strategies. + - [Cart Price Rules](./03_Price_Rules/01_Cart_Price_Rules.md) + - [Product Price Rules](./03_Price_Rules/02_Product_Price_Rules.md) + - [Specific Product Price](./03_Price_Rules/03_Specific_Price_Rules.md) + - [Vouchers](./03_Price_Rules/05_Vouchers.md) + - [Available Actions](./03_Price_Rules/06_Actions.md) + - [Available Conditions](./03_Price_Rules/07_Conditions.md) +4. **Localization**: Managing geographical aspects. + - [Countries](./04_Localization/01_Countries.md) + - [States](./04_Localization/02_States.md) + - [Zones](./04_Localization/03_Zones.md) + - [Currencies](./04_Localization/04_Currencies.md) + - [Taxes](./04_Localization/05_Taxes.md) + - [Tax Rules](./04_Localization/06_TaxRules.md) +5. **Shipping**: Configuring shipping options and rules. + - [Carriers](./05_Shipping/01_Carriers.md) + - [Shipping Rules](./05_Shipping/02_Shipping_Rules.md) +6. **[Cart](./06_Cart/index.md)**: Overview of cart functionalities. +7. **Order Management**: Detailed guide on order processing. + - [Orders](./06_Order/01_Orders.md) + - [Order Detail](./06_Order/02_Order_Detail.md) + - [Order Workflow](./06_Order/03_Order_Workflow.md) + - [Order Comments](./06_Order/04_Order_Comments.md) +8. **Catalog Management**: Managing your product catalog. + - [Products](./07_Catalog/index.md) + - [Product Variants](./07_Catalog/index.md) + - [Categories](./07_Catalog/index.md) +9. **[Inventory](./08_Inventory/index.md)**: Inventory management insights. +10. **Reports**: Understanding reporting tools for data analysis. + - [Sales](./09_Reports/01_Sales.md) + - [Cart/Order Conversion](./09_Reports/02_Carts.md) + - [Abandoned Carts](./09_Reports/03_Abandoned_Carts.md) + - [Products](./09_Reports/04_Products.md) + - [Categories](./09_Reports/05_Categories.md) + - [Customers](./09_Reports/06_Customers.md) + - [Carrier Distribution](./09_Reports/07_Carrier_Distribution.md) + - [Payment Distribution](./09_Reports/08_Payment_Distribution.md) + - [Vouchers](./09_Reports/09_Vouchers.md) +11. **[Automation](./10_Automation/index.md)**: Automated processes in CoreShop. diff --git a/docs/03_Bundles/ClassDefinitionPatch_Bundle.md b/docs/03_Bundles/ClassDefinitionPatch_Bundle.md new file mode 100644 index 0000000000..6cba38cd04 --- /dev/null +++ b/docs/03_Bundles/ClassDefinitionPatch_Bundle.md @@ -0,0 +1,82 @@ +# Class Definition Patch Bundle + +The CoreShop Class Definition Patch Bundle provides a convenient way to modify class definitions from other bundles. +This is particularly useful for adding new properties to existing classes through a configuration setup. + +## Installation + +```bash +$ composer require coreshop/class-definitions-patch-bundle:^4.0 +``` + +### Adding required bundles to kernel + +You need to enable the bundle inside the kernel. + +```php +addBundles([ + new \CoreShop\Bundle\ClassDefinitionPatchBundle\CoreShopClassDefinitionPatchBundle(), + ]); +} +``` + +## Usage + +### Configuration for Patching + +To patch a Pimcore class definition, add a configuration like the following: + +```yaml +core_shop_class_definition_patch: + patches: + CoreShopCompany: + interface: 'blub' + fields: + name2: + before: 'addresses' + definition: + fieldtype: input + title: coreshop.company.name2 +``` + +### Patching CoreShop Classes + +For patching CoreShop classes, leverage the parameters provided by CoreShop: + +```yaml +core_shop_class_definition_patch: + patches: + %coreshop.model.order.pimcore_class_name%: + fields: + total2: + before: 'total' + definition: + fieldtype: coreShopMoney + title: Total 2 +``` + +### Preview Changes + +Before applying the changes, preview them using: + +```bash +bin/console coreshop:patch:classes --dump +``` + +### Applying the Patch + +Once you're satisfied with the preview, apply the patch: + +```bash +bin/console coreshop:patch:classes --force +``` + +> **Note** that the patch modifies your local definitions, which should be part of your version control (e.g., git +> repository). After applying the patch, commit these changes. There's no need to run the patch command during +> deployment. \ No newline at end of file diff --git a/docs/03_Bundles/Index_Bundle.md b/docs/03_Bundles/Index_Bundle.md new file mode 100644 index 0000000000..7a2cc404cb --- /dev/null +++ b/docs/03_Bundles/Index_Bundle.md @@ -0,0 +1,92 @@ +# Index Bundle + +The Index Bundle integrates the Index Component into Symfony and Doctrine, offering tools for indexing Pimcore models, +managing filters, and creating conditions. It includes ListingServices and FilterServices. + +## Installation Process + +To install the bundle, use Composer: + +```bash +$ composer require coreshop/index-bundle:^4.0 +``` + +### Integrating with the Kernel + +Enable the bundle in the kernel by updating the `AppKernel.php` file: + +```php +addBundles([ + new \CoreShop\Bundle\IndexBundle\CoreShopIndexBundle(), + ]); +} +``` + +### Updating the Database Schema + +Update the database schema with the following command: + +```bash +$ php bin/console doctrine:schema:update --force +``` + +## Usage Guidelines + +### Creating an Indexable Class + +Define a class that implements the `CoreShop\Component\Index\Model\IndexableInterface` interface: + +```php +getName($language); + } +} +``` + +Ensure that `App\Model\MyPimcoreDataObject` is set as your parent class for your Pimcore Data-Object. + +### Retrieving Listings from an Index + +Fetch a listing from an index: + +```php +$filter = $this->get('coreshop.repository.filter')->find(1); // Get Filter by ID 1 +$filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request); +$filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE); +$filteredList->setCategory($category); +$this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query); +$filteredList->load(); +``` + +This Index Bundle is crucial for managing indexing and filtering of data within CoreShop, ensuring efficient data +handling and retrieval. diff --git a/docs/03_Bundles/Menu_Bundle.md b/docs/03_Bundles/Menu_Bundle.md new file mode 100644 index 0000000000..c5f34feb0f --- /dev/null +++ b/docs/03_Bundles/Menu_Bundle.md @@ -0,0 +1,90 @@ +# Menu Bundle + +The Menu Bundle simplifies the creation of Pimcore menus based on permissions, enhancing the user interface and +navigation experience. + +## Installation Process + +To install the Menu Bundle, use Composer: + +```bash +$ composer require coreshop/menu-bundle:^4.0 +``` + +### Integrating with the Kernel + +Enable the bundle in the kernel by updating the `AppKernel.php` file: + +```php +addBundles([ + new \CoreShop\Bundle\MenuBundle\CoreShopMenuBundle(), + ]); +} +``` + +## Usage Instructions + +### Creating a New Menu + +1. **Define a Menu Builder Class**: + Create a new class for your menu, such as `MyMenuBuilder`. + + ```php + addChild('my-menu-item') + ->setLabel('my-menu-item') + ->setAttribute('permission', 'my_menu_item') + ->setAttribute('iconCls', 'pimcore_icon_delete'); + } + } + ``` + +2. **Register the Menu Builder**: + Register your menu builder class in the Symfony container. + + ```yml + app.my_menu: + class: AppBundle\Menu\MyMenuBuilder + tags: + - { name: coreshop.menu, type: my_menu, menu: my_menu } + ``` + +### Implementing the ExtJs JavaScript Part + +1. **Add a JavaScript File**: + In your bundle's `Bundle.php` file, add the JavaScript file to the `jsPaths` + array: `/admin/coreshop/coreshop.my_menu/menu.js` +2. **Instantiate the Menu**: + In your `startup.js` file, instantiate the menu: + + ```javascript + new coreshop.menu.coreshop.my_menu(); + + pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({ + coreshopMenuOpen: function(type, item) { + if (item.id === 'my-menu-item') { + alert('My Menu Item has been clicked'); + } + } + + ``` + + + diff --git a/docs/03_Bundles/Messenger_Bundle.md b/docs/03_Bundles/Messenger_Bundle.md new file mode 100644 index 0000000000..175e16fda1 --- /dev/null +++ b/docs/03_Bundles/Messenger_Bundle.md @@ -0,0 +1,30 @@ +# Messenger Bundle + +The CoreShop Messenger Bundle provides a user-friendly interface to view queued Messenger tasks across different queues. + +![Messenger](img/messenger.png) + +## Installation Process + +To install the Messenger Bundle, use Composer: + +```bash +$ composer require coreshop/messenger-bundle:^4.0 +``` + +### Integrating with the Kernel + +To enable the bundle, update the `AppKernel.php` file: + +```php +addBundles([ + new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(), + ]); +} +``` diff --git a/docs/03_Bundles/Money_Bundle.md b/docs/03_Bundles/Money_Bundle.md new file mode 100644 index 0000000000..115b053cbe --- /dev/null +++ b/docs/03_Bundles/Money_Bundle.md @@ -0,0 +1,44 @@ +# Money Bundle + +The Money Bundle provides an efficient way to handle and format monetary values within CoreShop. + +## Installation Process + +To install the Money Bundle, use Composer: + +```bash +$ composer require coreshop/money-bundle:^4.0 +``` + +### Integrating with the Kernel + +To enable the bundle, update the `AppKernel.php` file: + +```php +addBundles([ + new \CoreShop\Bundle\MoneyBundle\CoreShopMoneyBundle(), + ]); +} +``` + +## Usage Instructions + +The Money Bundle introduces a core extension in Pimcore, allowing you to store currency values as integers. This +approach ensures precision and consistency in financial data handling. + +### Twig Extension for Money Formatting + +The bundle includes a Twig extension for formatting money values: + +```twig +{{ value|coreshop_format_money('€', 'de'); }} +``` + +This extension allows for easy and flexible formatting of monetary values within your templates, enhancing the display +and readability of prices and financial figures in CoreShop. diff --git a/docs/03_Bundles/OptimisticEntityLock_Bundle.md b/docs/03_Bundles/OptimisticEntityLock_Bundle.md new file mode 100644 index 0000000000..5a3779ed3d --- /dev/null +++ b/docs/03_Bundles/OptimisticEntityLock_Bundle.md @@ -0,0 +1,50 @@ +# Optimistic Entity Lock Bundle + +The CoreShop Optimistic Entity Lock Bundle is a specialized package for the CoreShop e-commerce framework, designed for +handling optimistic entity locking on the Pimcore platform. This bundle is crucial for preventing editing conflicts when +multiple users attempt to modify the same entity simultaneously. + +## Installation Process + +To install the Optimistic Entity Lock Bundle, use Composer: + +```bash +$ composer require coreshop/optimistic-entity-lock-bundle:^4.0 +``` + +### Integrating with the Kernel + +Enable the bundle in the kernel by updating the `AppKernel.php` file: + +```php +addBundles([ + new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(), + ]); +} +``` + +## Usage Instructions + +### Implementing the Interface + +Your Pimcore DataObject Class needs to implement +the `CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface`. + +### Adding the Field to Class Definition + +Add the field `optimisticLockVersion` to your Pimcore Class Definition. This field is pivotal for the locking mechanism. + +### Functionality + +Once implemented, every time the DataObject is saved, CoreShop checks and increments the version number. If the version +differs from the last saved state (indicating another user has saved changes), an exception is thrown, preventing +overwrite conflicts. + +This bundle ensures data integrity and consistency in scenarios where concurrent editing might occur, safeguarding your +e-commerce data against inadvertent overwrites. diff --git a/docs/docs/03_Bundles/Pimcore_Bundle.md b/docs/03_Bundles/Pimcore_Bundle.md similarity index 86% rename from docs/docs/03_Bundles/Pimcore_Bundle.md rename to docs/03_Bundles/Pimcore_Bundle.md index a48dfd8ccd..724c0e67fb 100644 --- a/docs/docs/03_Bundles/Pimcore_Bundle.md +++ b/docs/03_Bundles/Pimcore_Bundle.md @@ -1,11 +1,13 @@ -# Pimcore Bundle +# Pimcore Bundle ## Installation + ```bash -$ composer require coreshop/pimcore-bundle:^3.0 +$ composer require coreshop/pimcore-bundle:^4.0 ``` ### Activating Bundle + You need to enable the bundle inside the kernel or with the Pimcore Extension Manager. ```php @@ -23,10 +25,13 @@ public function registerBundlesToCollection(BundleCollection $collection) ## Usage -The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you. +The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of +services for you. ### JS/CSS Resource Loading -With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it: + +With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, +follow these steps to use it: - Create a DependencyInjection Extension class like: @@ -35,12 +40,12 @@ With Pimcore, every bundle needs to take care about loading static assets themse namespace AppBundle\DependencyInjection; -use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension; +use CoreShop\Bundle\PimcoreBundle\DependencyInjection\Extension\AbstractPimcoreExtension; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; -class AppExtension extends AbstractModelExtension +class AppExtension extends AbstractPimcoreExtension { public function load(array $config, ContainerBuilder $container) { @@ -116,18 +121,22 @@ final class Configuration implements ConfigurationInterface ### DataObject Extensions #### Serialized Data + This extension allows you to store SerializedData inside a Pimcore DataObject. ### Slug -Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, -your class needs to implement `CoreShop\Component\Pimcore\Slug\SluggableInterface` and CoreShop automatically generates slugs for you. +Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In +Order to use it, +your class needs to implement `CoreShop\Component\Pimcore\Slug\SluggableInterface` and CoreShop automatically generates +slugs for you. #### Extensions / Influence the slug generation -If you want to change the generated slug or prefix it, you can use the `CoreShop\Component\Pimcore\Event\SlugGenerationEvent` Event. +If you want to change the generated slug or prefix it, you can use +the `CoreShop\Component\Pimcore\Event\SlugGenerationEvent` Event. -``` +```php createFieldCollection($pathToJson, $fcName); ``` #### Class/Brick/Field Collection Updater + Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly migrated from Release to Release. @@ -248,11 +266,14 @@ if (!$classUpdater->hasField('paymentSettings')) { ``` -Thats it, the same works for FieldCollections with the class `CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate` +Thats it, the same works for FieldCollections with the +class `CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate` and for Bricks with the class `CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate` #### Inheritance Helper -Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this: + +Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure +function like this: ```php @@ -265,6 +286,7 @@ $inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) ``` #### Version Helper + Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning. ```php @@ -279,6 +301,7 @@ VersionHelper::useVersioning(function() use($object) { ``` #### Unpublished Helper + Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend. ```php @@ -293,6 +316,7 @@ $allProducts = UnpublishedHelper::hideUnpublished(function() use($object) { ``` ### Expression Language Features + CoreShop adds some features to the Symfony Expression language like: - PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query @@ -300,6 +324,7 @@ CoreShop adds some features to the Symfony Expression language like: ### Migration Features #### Pimcore Shared Translations + Helps you to install new Shared Translations during Migration: ```php diff --git a/docs/03_Bundles/Resource_Bundle/01_Custom_Entities.md b/docs/03_Bundles/Resource_Bundle/01_Custom_Entities.md new file mode 100644 index 0000000000..e5ce76d408 --- /dev/null +++ b/docs/03_Bundles/Resource_Bundle/01_Custom_Entities.md @@ -0,0 +1,208 @@ +# Adding a New Custom Doctrine Entity + +## Step 1: Create Translatable Entity + +First, create your Entity Class. In this case, we create a Translatable Entity. + +### CustomEntityInterface + +Create `CustomEntityInterface.php` in the `AppBundle/Model` directory. + +```php +initializeTranslationsCollection(); + } + + // Getters and Setters +} +``` + +### CustomEntityTranslationInterface + +Create `CustomEntityTranslationInterface.php` in the `AppBundle/Model` directory. + +```php +processConfiguration($this->getConfiguration([], $container), $config); $this->registerPimcoreModels('app', $config['pimcore'], $container); } } - ``` +## Step 4: Use Your Pimcore Entity -## Use your Pimcore Entity +You can either use Pimcore Listing Classes or the automatically generated Factory/Repository Classes. -You can either use Pimcore Listing Classes like: +### Using Pimcore Listing Classes ```php $list = new Pimcore\Model\Object\PimcoreEntity\Listing(); ``` -or use automated generated Factory/Repository Classes +### Using Factory/Repository Classes ```php $pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id); diff --git a/docs/03_Bundles/Resource_Bundle/index.md b/docs/03_Bundles/Resource_Bundle/index.md new file mode 100644 index 0000000000..ce7b6edc83 --- /dev/null +++ b/docs/03_Bundles/Resource_Bundle/index.md @@ -0,0 +1,139 @@ +# Resource Bundle + +The Resource Bundle is a central component of CoreShop, handling the creation, reading, updating, and deleting (CRUD) of +CoreShop models. It manages Doctrine ORM mappings, translations, routing, event dispatching, serialization, and CRUD +operations. This bundle also facilitates the installation of various Pimcore definitions. + +## Installation Process + +To install the Resource Bundle, use Composer: + +```bash +$ composer require coreshop/resource-bundle:^4.0 +``` + +### Integrating with the Kernel + +Enable the bundle in the kernel by updating the `AppKernel.php` file: + +```php +addBundles([ + new \CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle(), + ]); +} +``` + +## Adding Custom Doctrine Entities + +To create custom entities or extend existing CoreShop Doctrine entities: + +1. **Enable Doctrine ORM**: + + ```yaml + # app/config/config.yml + doctrine: + orm: + mappings: + App: + is_bundle: false + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App + ``` + +2. **Create Your Entity**: + + ```php + # src/Entity/CustomEntity.php + addBundles([ + new \CoreShop\Bundle\SEOBundle\CoreShopSEOBundle(), + ]); +} +``` + +## Usage + +### Updating SEO Information + +Utilize the `coreshop.seo.presentation` service to update SEO metadata: + +```php +// From a Controller +$this->get('coreshop.seo.presentation')->updateSeoMetadata($object); +``` + +### Implementing SEO Interfaces + +The SEO Bundle includes several interfaces: + +- `CoreShop\Component\SEO\Model\SEOAwareInterface`: For meta-title and meta-description. +- `CoreShop\Component\SEO\Model\SEOImageAwareInterface`: For the og-image attribute. +- `CoreShop\Component\SEO\Model\SEOImageAwareInterface`: For og-title, og-type, and pg-description attributes. + +### Implementing SEO Extractors + +To create a custom extractor, implement the `ExtractorInterface` and register it with the tag `coreshop.seo.extractor`. + +#### Example: Custom Extractor for Product Class + +Implement a custom extractor for the Product class: + +```php +addBundles([ + new \CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle(), + ]); +} +``` + +### Updating the Database Schema + +After installation, update the database schema with the following command: + +```bash +$ php bin/console doctrine:schema:update --force +``` + +## Usage + +The Sequence Bundle integrates the Sequence Component into Symfony and Doctrine, providing essential tools for +generating sequences within your application. + +### Doctrine Entities + +The primary entity used in the Sequence Bundle is `Sequence`. + +### Generating a New Sequence + +To generate a new sequence, use the sequence generator service: + +```php +$container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence'); +``` + +This bundle enhances the functionality of CoreShop, enabling efficient and orderly sequence generation for various +operational needs. diff --git a/docs/03_Bundles/StorageList_Bundle.md b/docs/03_Bundles/StorageList_Bundle.md new file mode 100644 index 0000000000..f033252db3 --- /dev/null +++ b/docs/03_Bundles/StorageList_Bundle.md @@ -0,0 +1,82 @@ +# Storage List Bundle + +The Storage List Bundle assists in managing lists and collections of objects, such as carts, wishlists, or compare +lists, in CoreShop. + +## Installation Process + +To install the Storage List Bundle, use Composer: + +```bash +$ composer require coreshop/storage-list-bundle:^4.0 +``` + +## Usage + +The bundle requires three models to function effectively: + +1. **Storage List** - Represents the collection. Implement + the [`StorageListInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListInterface.php). +2. **Storage Item** - The item within the collection, which can store additional information, such as prices for a cart. + Implement + the [`StorageListItemInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListItemInterface.php). +3. **Storage Product** - The actual product being stored inside the item. Implement + the [`StorageListProductInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListProductInterface.php). + +CoreShop provides basic implementations +of [`Storage List`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageList.php) +and [`Storage Item`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageItem.php). +You will need to implement the StorageListProduct yourself. + +### Mutating Lists + +Use +the [`Storage List Modifier`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/StorageListModifier.php) +to create and persist lists. + +### Example: Basic Session-Based Wishlist + +Let's create a session-based wishlist with the following components: + +- Factory class for the Wishlist +- Factory class for the Wishlist Item +- StorageListManager (repository-like) +- StoreListModifier + +CoreShop provides basic classes for these components: + +```php +use Symfony\Component\HttpFoundation\Session\Session; + +use CoreShop\Component\StorageList\Model\StorageList; +use CoreShop\Component\StorageList\Model\StorageListItem; +use CoreShop\Component\Resource\Factory\Factory; +use CoreShop\Component\StorageList\SessionStorageManager; +use CoreShop\Component\StorageList\SessionStorageListModifier; + +$session = new Session(); +$session->start(); + +$wishlistFactory = new Factory(StorageList::class); +$wishlistItemFactory = new Factory(StorageListItem::class); + +$wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory); +$wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager); + +// Adding data to our List +$list = $wishlistManager->getStorageList(); +$product = $productRepository->find(1); // Assumes StorageListProductInterface implementation + +$listItem = $wishlistItemFactory->createNew(); +$listItem->setProduct($product); +$listItem->setQuantity($quantity); + +// Adding a Product +$wishlistModifier->addToList($list, $listItem); + +// Removing a Product +$wishlistModifier->removeFromList($list, $listItem); +``` + +This bundle simplifies the management of various storage lists within CoreShop, enhancing the functionality and user +experience of your e-commerce platform. diff --git a/docs/docs/03_Bundles/Theme_Bundle.md b/docs/03_Bundles/Theme_Bundle.md similarity index 50% rename from docs/docs/03_Bundles/Theme_Bundle.md rename to docs/03_Bundles/Theme_Bundle.md index 521d52a8e8..38da6744ec 100644 --- a/docs/docs/03_Bundles/Theme_Bundle.md +++ b/docs/03_Bundles/Theme_Bundle.md @@ -1,14 +1,19 @@ -# Theme Bundle +# Theme Bundle -CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation. +The CoreShop Theme Bundle offers a flexible and extensible approach to managing multiple themes within a Pimcore +installation. + +## Installation Process + +To install the Theme Bundle, use Composer: -## Installation ```bash -$ composer require coreshop/theme-bundle:^3.0 +$ composer require coreshop/theme-bundle:^4.0 ``` -### Adding required bundles to kernel -You need to enable the bundle inside the kernel. +### Integrating with the Kernel + +Enable the bundle in the kernel by updating the `AppKernel.php` file: ```php addBundles([ + new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(), + ]); +} +``` + +## Abstract + +Pimcore supports variants but does not define the specifics of what a variant is or how it differs from the parent +product or other variants. CoreShop addresses this by introducing two entities: + +1. **Attribute Group** (`CoreShop\Component\Variant\Model\AttributeGroupInterface`): Defines types like size or color. +2. **Attribute Value** (`CoreShop\Component\Variant\Model\AttributeValueInterface`): Represents values like `XL` + or `Red`. + +The product is an abstract entity specifying the allowed attribute groups, with its variants needing to have these group +values filled. + +### Example + +- **AttributeGroup Color**: Contains `AttributeValue Red` and `AttributeValue Blue`. +- **Product**: Defines allowed groups for color. + - **Variant-Red**: Defines the `AttributeValue Red` in attributes. + - **Variant-Blue**: Defines the `AttributeValue Blue` in attributes. + +## Usage + +### Class Installation + +The Variant Bundle does not come with an installer for required resources. You need to install what you need manually. +By default, it includes three classes: + +- `CoreShopAttributeGroup` +- `CoreShopAttributeColor` +- `CoreShopAttributeValue` + +The classes `Color` and `Value` represent value types, while `Group` is a group type. Manually import the classes +from `vendor/coreshop/variant-bundle/Resources/install/pimcore/classes`. + +### Creating a "Product" Class + +Implement the `CoreShop\Component\Variant\Model\ProductVariantAwareInterface` for your "Product" class. It should +include these fields: + +- **attributes**: ManyToManyObjectRelation for `CoreShopAttributeColor`/`CoreShopAttributeValue`. +- **allowedAttributeGroups**: ManyToManyObjectRelation for `CoreShopAttributeGroup`. +- **mainVariant**: ManyToOneRelation for `Product` (i.e., your class implementing the interface). + +The Variant Bundle significantly enhances the flexibility of product management in CoreShop, allowing for detailed and +diverse product variant configurations. diff --git a/docs/docs/03_Bundles/img/messenger.png b/docs/03_Bundles/img/messenger.png similarity index 100% rename from docs/docs/03_Bundles/img/messenger.png rename to docs/03_Bundles/img/messenger.png diff --git a/docs/docs/03_Bundles/img/patch.png b/docs/03_Bundles/img/patch.png similarity index 100% rename from docs/docs/03_Bundles/img/patch.png rename to docs/03_Bundles/img/patch.png diff --git a/docs/03_Bundles/index.md b/docs/03_Bundles/index.md new file mode 100644 index 0000000000..1071bccc99 --- /dev/null +++ b/docs/03_Bundles/index.md @@ -0,0 +1,36 @@ +# Bundles Overview + +CoreShop offers a suite of bundles that address various non-e-commerce specific functionalities. These bundles are +versatile and can be utilized in any Pimcore installation, extending beyond the scope of typical e-commerce solutions. + +## Available Bundles + +Explore the range of bundles provided by CoreShop, each designed to fulfill specific roles within your Pimcore +installation: + +- **[Class Definition Patch Bundle](./ClassDefinitionPatch_Bundle.md)**: Enables patching of class definitions from + other bundles. +- **[Index Bundle](./Index_Bundle.md)**: Facilitates advanced indexing capabilities. +- **[Money Bundle](./Money_Bundle.md)**: Provides tools for handling monetary values. +- **[Messenger Bundle](./Messenger_Bundle.md)**: Enhances message handling and delivery. +- **[Optimistic Entity Lock Bundle](./OptimisticEntityLock_Bundle.md)**: Implements optimistic locking for entities. +- **[Resource Bundle](./Resource_Bundle/index.md)**: Streamlines repetitive tasks like CRUD operations. +- **[SEO Bundle](./SEO_Bundle.md)**: Offers features for search engine optimization. +- **[Sequence Bundle](./Sequence_Bundle.md)**: Manages sequential number generation. +- **[Storage List Bundle](./StorageList_Bundle.md)**: Handles complex data storage requirements. +- **[Theme Bundle](./Theme_Bundle.md)**: Facilitates theme management and customization. +- **[Variant Bundle](./Variant_Bundle.md)**: Manages product variants effectively. + +### Focus on Resource Bundle + +One of CoreShop's primary objectives is to provide a flexible framework. The Resource Bundle is a foundational component +that simplifies many common tasks: + +- Automates the creation of CRUD controllers (`ResourceController`). +- Streamlines the generation of factories, repositories, routes, and resource controllers for CoreShop resources. + +This bundle proves invaluable not only for CoreShop-specific functionalities but also for any Pimcore bundle, offering +extensive utility across various applications. For more details on the Resource Bundle, [click here](./Resource_Bundle). + +These bundles collectively enhance the capabilities of your Pimcore installation, providing powerful tools to meet +diverse requirements in a streamlined and efficient manner. diff --git a/docs/03_Development/01_Extending_Guide/01_Extend_CoreShop_Resources.md b/docs/03_Development/01_Extending_Guide/01_Extend_CoreShop_Resources.md new file mode 100644 index 0000000000..7380473834 --- /dev/null +++ b/docs/03_Development/01_Extending_Guide/01_Extend_CoreShop_Resources.md @@ -0,0 +1,126 @@ +# Extend CoreShop Resources + +All models in Coreshop are placed in the `Coreshop\Component\*ComponentName*\Model` namespaces alongside with their +interfaces. + +> Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the +> Core you should be extending the Core one, not the base model from the component. + +## How to Customize a Model + +First things first: If you want to extend coreshop models your Bundle must extend the `AbstractResourceBundle`. Next you +have set your supported drivers. Just add the following lines of code to your bundle class: + +```php +public function getSupportedDrivers(): array +{ +return [ +CoreShopResourceBundle::DRIVER_DOCTRINE_ORM +]; +} +``` + +After that have to tell the bundle where your models are. For that, add the override the following method in your bundle +class and return the model namespace. Here is an example for the `AppBundle`: + +```php +protected function getModelNamespace(): string +{ +return "AppBundle\Model"; +} +``` + +Here a quick overview for you which directories are important for you, when customizing CoreShop models. + +| Folder | Description | +|-------------------------------------------|-----------------------------------------------| +| `AcmeBundle/Model` or `AcmeBundle/Entity` | Where your models are living | +| `AcmeBundle/config/doctrine/model` | Put your doctrine `.yml` config files in here | +| `AcmeBundle/config/serializer` | The serializer configs for the models | + +Let’s take the `CoreShop\Component\Currency\Model\Currency` as an example. This one is extended in Core. How can you +check that? + +First of all, you need to find the current used class by doing following: + +```bash +$ php bin/console debug:container --parameter=coreshop.model.currency.class +``` + +As a result you will get the `CoreShop\Component\Core\Model\Currency` - this is the class that you need to be extending. + +Assuming you want to add a field called **flag**: + +**1.** The first thing to do is to write your own class which will extend the base `Currency` class: + +```php +flag; + } + + /** + * @param bool $flag + */ + public function setFlag($flag) + { + $this->flag = $flag; + } +} +``` + +**2.** Next define your entity’s mapping. The file should be placed +in `AppBundle/Resources/config/doctrine/Currency.orm.yml`: + +```yaml +AppBundle\Entity\Currency: + type: mappedSuperclass + table: coreshop_currency + fields: + flag: + type: boolean + nullable: true +``` + +**3.** Finally, you’ll need to override the model’s class in the `app/config/config.yml`. + +Under the `core_shop_currency`, modify as follows: + +```yaml +core_shop_currency: + resources: + currency: + classes: + model: AppBundle\Entity\Currency +``` + +**4.** Update the database. There are two ways to do it: + +via direct database schema update: + +```bash +$ php bin/console doctrine:schema:update --force +``` + +via migrations (recommended): + +```bash +$ php bin/console doctrine:migrations:diff +$ php bin/console doctrine:migrations:migrate +``` diff --git a/docs/docs/03_Development/01_Extending_Guide/02_Extend_CoreShop_Forms.md b/docs/03_Development/01_Extending_Guide/02_Extend_CoreShop_Forms.md similarity index 58% rename from docs/docs/03_Development/01_Extending_Guide/02_Extend_CoreShop_Forms.md rename to docs/03_Development/01_Extending_Guide/02_Extend_CoreShop_Forms.md index f68cb3cbff..ae25f9858f 100644 --- a/docs/docs/03_Development/01_Extending_Guide/02_Extend_CoreShop_Forms.md +++ b/docs/03_Development/01_Extending_Guide/02_Extend_CoreShop_Forms.md @@ -1,12 +1,12 @@ # Customizing Forms -The forms in CoreShop are placed in the ``CoreShop\Bundle\*BundleName*\Form\Type`` namespaces and the extensions -will be placed in `AppBundle\Form\Extension`. +The forms in CoreShop are placed in the `CoreShop\Bundle\*BundleName*\Form\Type` namespaces and the extensions will be +placed in `AppBundle\Form\Extension`. ## Why would you customize a Form? -There are plenty of reasons to modify forms that have already been defined in CoreShop. -Your business needs may sometimes slightly differ from our internal assumptions. +There are plenty of reasons to modify forms that have already been defined in CoreShop. Your business needs may +sometimes slightly differ from our internal assumptions. You can: @@ -16,29 +16,32 @@ You can: ## How to customize a CoreShop Resource Form? -If you want to modify the form for the ``Store`` in your system there are a few steps that you should take. -Assuming that you would like to (for example): +If you want to modify the form for the `Store` in your system there are a few steps that you should take. Assuming that +you would like to (for example): -* Add a ```contactHours``` field, +* Add a `contactHours` field, These will be the steps that you will have to take to achieve that: -**1.** If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on. +**1.** If your are planning to add new fields remember that beforehand they need to be added on the model that the form +type is based on. -In case of our example if you need to have the ```contactHours``` on the model and the entity mapping for the ```Store``` resource. -To get to know how to prepare that go [there](./01_Extend_CoreShop_Resources.md) +In case of our example if you need to have the `contactHours` on the model and the entity mapping for the `Store` +resource. To get to know how to prepare that go [there](./01_Extend_CoreShop_Resources.md). **2.** Create a **Form Extension**. Your form has to extend a proper base class. How can you check that? -For the ``StoreType`` run: +For the `StoreType` run: ```bash $ php bin/console debug:container coreshop.form.type.store ``` -As a result you will get the [```CoreShop\Bundle\StoreBundle\Form\Type\StoreType```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Form/Type/StoreType.php) - this is the class that you need to be extending. +As a result you will get +the [```CoreShop\Bundle\StoreBundle\Form\Type\StoreType```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Form/Type/StoreType.php) - +this is the class that you need to be extending. ```php add('some_value', TextType::class) +; +} +``` + +With configuration, comes a Javascript file as well: + +```javascript +//AppBundle/Resources/public/pimcore/js/custom_condition.js + +pimcore.registerNS('coreshop.product.pricerule.conditions.custom'); +coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, { + + type: 'custom', + + getForm: function () { + var some_value = 0; + var me = this; + + if (this.data) { + some_value = this.data.some_value / 100; + } + + var some_valueField = new Ext.form.NumberField({ + fieldLabel: t('custom'), + name: 'some_value', + value: some_value, + decimalPrecision: 2 + }); + + this.form = new Ext.form.Panel({ + items: [ + some_valueField + ] + }); + + return this.form; + } +}); +``` + +Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony +structure, omit the `web`. + +```php +bin/console assets:install +``` + +## Registering the Custom Condition to the Container and load the Javascript File + +We now need to create our Service Definition for our Custom Condition: + +```yaml +app.product_price_rule.custom_condition: + class: AppBundle\CoreShop\CustomCondition + tags: + - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\Form\Type\CustomConditionType } +``` + +and add this to your config.yml: + +```yaml +core_shop_product: + pimcore_admin: + js: + custom_condition: '/bundles/app/pimcore/js/custom_condition.js' diff --git a/docs/03_Development/01_Extending_Guide/index.md b/docs/03_Development/01_Extending_Guide/index.md new file mode 100644 index 0000000000..b075b1d106 --- /dev/null +++ b/docs/03_Development/01_Extending_Guide/index.md @@ -0,0 +1,40 @@ +# Extending CoreShop + +Welcome to the Extending Guide for CoreShop. This guide is an essential resource for developers looking to tailor +CoreShop to their specific business needs. CoreShop's architecture is built with extensibility in mind, allowing for +seamless integration and customization of its components. Whether you're extending resources, forms, data objects, or +rule actions and conditions, this guide provides you with the knowledge and tools necessary to enhance and adapt +CoreShop functionalities. + +## Extending CoreShop Resources + +CoreShop leverages Doctrine ORM for managing its resources, offering a robust and flexible way to extend these models. +Learn how to add new fields, change relationships, or modify resource behaviors to suit your specific requirements. + +- [Extending CoreShop Resources](01_Extend_CoreShop_Resources.md) + +## Customizing CoreShop Forms + +Forms are a critical part of any eCommerce platform, and CoreShop provides the ability to customize them to capture the +exact data you need. Discover techniques for adding new form fields, adjusting validations, or altering form layouts to +improve user experience and data collection. + +- [Extending CoreShop Forms](02_Extend_CoreShop_Forms.md) + +## Extending Data Objects + +Data objects in CoreShop are central to managing product information, customer data, and more. This section covers how +to extend these Pimcore data objects, enabling you to add custom attributes, change object behaviors, or integrate with +external systems. + +- [Extending CoreShop DataObjects](03_Extend_CoreShop_DataObjects.md) + +## Rule Actions and Conditions + +CoreShop's rule engine is powerful and versatile. Extending rule actions and conditions opens up possibilities for +creating complex, tailored rules that align with your unique business logic. Whether it's pricing rules, discount +conditions, or shipping calculations, learn how to craft custom rules that fit your business model perfectly. + +- [Extending CoreShop Rule Actions](04_Extending_Rule_Actions.md) +- [Extending CoreShop Rule Conditions](05_Extending_Rule_Conditions.md) + diff --git a/docs/docs/03_Development/02_Localization/01_Currencies/01_CRUD.md b/docs/03_Development/02_Localization/01_Currencies/01_CRUD.md similarity index 86% rename from docs/docs/03_Development/02_Localization/01_Currencies/01_CRUD.md rename to docs/03_Development/02_Localization/01_Currencies/01_CRUD.md index 9a7f758e28..a35d6b5e31 100644 --- a/docs/docs/03_Development/02_Localization/01_Currencies/01_CRUD.md +++ b/docs/03_Development/02_Localization/01_Currencies/01_CRUD.md @@ -1,6 +1,7 @@ -# CoreShop Currencies +# Currencies ## Create + If you want to create a Currency via API, you can do following: ```php @@ -35,7 +36,7 @@ $currencies = $queryBuilder->getQuery()->getResult(); ## Update -If you want to update and existing Currency, you need to do following: +If you want to update an existing Currency, you need to do following: ```php // Fetch Currency @@ -49,14 +50,15 @@ $container->get('coreshop.manager.currency')->flush(); ``` ## Delete -If you want to update and existing Currency, you need to do following: + +If you want to delete an existing Currency, you need to do following: ```php // Fetch Currency $currency = $currencyRepository->findById(1); -// And Persist it +// And remove it $container->get('coreshop.manager.currency')->remove($currency); $container->get('coreshop.manager.currency')->flush(); -``` \ No newline at end of file +``` diff --git a/docs/03_Development/02_Localization/01_Currencies/03_Context.md b/docs/03_Development/02_Localization/01_Currencies/03_Context.md new file mode 100644 index 0000000000..e0e91a274a --- /dev/null +++ b/docs/03_Development/02_Localization/01_Currencies/03_Context.md @@ -0,0 +1,28 @@ +# Currency Context + +CoreShop utilizes a concept known as context and context resolvers to determine the current currency. This section +explains the different types of contexts available and how to create a custom resolver. + +## Context Types + +CoreShop defines several contexts to identify the appropriate currency for the current request. Each context is +characterized by its name, priority, associated tag, and a specific role. The following table outlines these contexts: + +| Name | Priority | Tag | Description | +|--------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-----------------------------|-----------------------------------------------------------------------------------| +| [FixedCurrencyContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Currency/Context/FixedCurrencyContext.php) | default | `coreshop.context.currency` | Primarily used for testing purposes. | +| [StorageBasedCurrencyContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Context/Currency/StorageBasedCurrencyContext.php) | default | `coreshop.context.currency` | Checks if a currency has been changed during a frontend request. | +| [CountryAwareCurrencyContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Context/Currency/CountryAwareCurrencyContext.php) | default | `coreshop.context.currency` | Commonly used as it determines the currency based on the current country context. | + +## Creating a Custom Currency Resolver + +To implement a custom Currency Context, follow these steps: + +1. **Implement the Interface**: Your custom context should implement + the `CoreShop\Component\Currency\Context\CurrencyContextInterface`. +2. **Define the Method**: The interface requires the implementation of a method named `getCurrency`. This method should + return an instance of `CoreShop\Component\Currency\Model\CurrencyInterface` or throw + a `CoreShop\Component\Currency\Context\CurrencyNotFoundException` if the currency cannot be determined. +3. **Register the Context**: Add your custom context to the system by using the tag `coreshop.context.currency`. You can + also assign a `priority` attribute, which is optional but can be used to define the order in which contexts are + evaluated. diff --git a/docs/03_Development/02_Localization/01_Currencies/index.md b/docs/03_Development/02_Localization/01_Currencies/index.md new file mode 100644 index 0000000000..1f6bb6b121 --- /dev/null +++ b/docs/03_Development/02_Localization/01_Currencies/index.md @@ -0,0 +1,11 @@ +# Currencies + +> CoreShop is a multi-currency capable eCommerce Framework. It allows for the creation and utilization of various +> currencies. + +## Currency Operations + +1. **[Create, Update, Read, Delete](./01_CRUD.md)**: Detailed instructions on how to manage currencies within CoreShop, + including creating, updating, reading, and deleting currency data. +2. **[Currency Context](./03_Context.md)**: An overview of how CoreShop determines the current currency using the + concept of context and context resolvers, along with guidelines for implementing custom currency contexts. diff --git a/docs/docs/03_Development/02_Localization/02_Countries/01_CRUD.md b/docs/03_Development/02_Localization/02_Countries/01_CRUD.md similarity index 68% rename from docs/docs/03_Development/02_Localization/02_Countries/01_CRUD.md rename to docs/03_Development/02_Localization/02_Countries/01_CRUD.md index 58cd2b4c67..c66b877603 100644 --- a/docs/docs/03_Development/02_Localization/02_Countries/01_CRUD.md +++ b/docs/03_Development/02_Localization/02_Countries/01_CRUD.md @@ -1,62 +1,58 @@ -# CoreShop Countries +a# Countries + +In CoreShop, managing countries through the API involves several operations including create, read, update, and delete. +Below are the guidelines for each of these operations. ## Create -If you want to create a Country via API, you can do following: + +To create a new country via API: ```php $newCountry = $container->get('coreshop.factory.country')->createNew(); ``` -Now you have a new Country, if you want to persist it, you need to do following: +After creating a new Country instance, persist it using: ```php $container->get('coreshop.manager.country')->persist($newCountry); $container->get('coreshop.manager.country')->flush(); ``` -You now have a new persisted Country. +You now have a new persisted country. ## Read -If you want to query for Countries, you can do following: +To query for countries: ```php $countryRepository = $container->get('coreshop.repository.country'); - $queryBuilder = $countryRepository->createQueryBuilder('c'); - // You can now create your query - // And get the result - $countries = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing Country, you need to do following: +To update an existing country: ```php // Fetch Country - $country = $countryRepository->findById(1); $country->setName('Euro'); - // And Persist it $container->get('coreshop.manager.country')->persist($country); $container->get('coreshop.manager.country')->flush(); ``` ## Delete -If you want to update and existing Country, you need to do following: + +To delete an existing country: ```php // Fetch Country - $country = $countryRepository->findById(1); - -// And Persist it +// And Remove it $container->get('coreshop.manager.country')->remove($country); $container->get('coreshop.manager.country')->flush(); -``` \ No newline at end of file +``` diff --git a/docs/03_Development/02_Localization/02_Countries/02_Context.md b/docs/03_Development/02_Localization/02_Countries/02_Context.md new file mode 100644 index 0000000000..d8a1e27fbb --- /dev/null +++ b/docs/03_Development/02_Localization/02_Countries/02_Context.md @@ -0,0 +1,70 @@ +# Country Context + +CoreShop uses a system of contexts and resolvers to determine the current country of a visitor or customer. + +## Context + +Different contexts are used for determining the appropriate country in various scenarios: + +| Name | Priority | Tag | Description | +|-------------------------------------------------------------------------------------------------------------------------------------------------------|----------|----------------------------|---------------------------------------------------------------| +| [FixedCountryContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Address/Context/FixedCountryContext.php) | default | `coreshop.context.country` | For testing purposes. | +| [CountryContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Address/Context/RequestBased/CountryContext.php) | default | `coreshop.context.country` | Checks for a country within the country request resolver. | +| [StoreAwareCountryContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Context/Country/StoreAwareCountryContext.php) | default | `coreshop.context.country` | Considers the current store context to determine the country. | + +## Resolver + +Resolvers are used to find the correct country based on different criteria: + +| Name | Priority | Tag | Description | +|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------------------------------------------|--------------------------------------------------------| +| [GeoLiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Address/Context/RequestBased/GeoLiteBasedRequestResolver.php) | 10 | `coreshop.context.country.request_based.resolver` | Uses the Geo Lite Database to determine user location. | + +## Create a Custom Resolver + +To create a custom Country Context: + +1. **Implement the Interface**: Your context should + implement `CoreShop\Component\Address\Context\CountryContextInterface`. + +2. **Define the Method**: This interface has a method `getCountry` + returning `CoreShop\Component\Address\Model\CountryInterface` or + throwing `CoreShop\Component\Address\Context\CountryNotFoundException`. + +3. **Register the Context**: Use the tag `coreshop.context.country` with an optional `priority` attribute for + registration. + +## Create a Request-Based Resolver + +CoreShop supports custom request-based country context resolvers: + +1. **Implement the Interface**: Create a resolver that + implements `CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface`. + +2. **Define the Method**: Implement the method `findCountry`, which returns a country or null based on the request. + +3. **Register the Resolver**: Use the tag `coreshop.context.country.request_based.resolver` with an optional `priority` + attribute. + +## Example + +Creating a `DocumentBasedRequestRequestResolver` based on Pimcore Document: + +```php +// PHP code for creating DocumentBasedRequestRequestResolver +``` + +And configure the service: + +```yaml +services: +app.coreshop.country.context.request.document_based: +class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver +arguments: + - '@Pimcore\Http\Request\Resolver\DocumentResolver' + - '@coreshop.repository.country' +tags: + - { name: coreshop.context.country.request_based.resolver } +``` + +CoreShop will now resolve the current country based on the Pimcore site being accessed. diff --git a/docs/03_Development/02_Localization/02_Countries/index.md b/docs/03_Development/02_Localization/02_Countries/index.md new file mode 100644 index 0000000000..f46c500d7a --- /dev/null +++ b/docs/03_Development/02_Localization/02_Countries/index.md @@ -0,0 +1,10 @@ +# Countries + +> CoreShop is a multi-country capable eCommerce Framework, enabling the creation and utilization of various countries. + +## Managing Countries + +1. **[Create, Update, Read, Delete](./01_CRUD.md)**: Comprehensive guidelines for performing basic CRUD (Create, Read, + Update, Delete) operations on countries within CoreShop. +2. **[Country Context](./02_Context.md)**: Detailed information on how CoreShop determines the country context for a + visitor or customer, including the implementation and customization of country contexts and resolvers. diff --git a/docs/docs/03_Development/02_Localization/03_States/01_CRUD.md b/docs/03_Development/02_Localization/03_States/01_CRUD.md similarity index 69% rename from docs/docs/03_Development/02_Localization/03_States/01_CRUD.md rename to docs/03_Development/02_Localization/03_States/01_CRUD.md index e7b41c701a..030b0ddbc1 100644 --- a/docs/docs/03_Development/02_Localization/03_States/01_CRUD.md +++ b/docs/03_Development/02_Localization/03_States/01_CRUD.md @@ -1,62 +1,58 @@ # States +Managing states in CoreShop involves various operations, including create, read, update, and delete. Below are the +guidelines for each of these operations. + ## Create -If you want to create a State via API, you can do following: + +To create a new state via the API: ```php $newState = $container->get('coreshop.factory.state')->createNew(); ``` -Now you have a new State, if you want to persist it, you need to do following: +After creating a new State instance, persist it using: ```php $container->get('coreshop.manager.state')->persist($newState); $container->get('coreshop.manager.state')->flush(); ``` -You now have a new persisted State. +You now have a new persisted state. ## Read -If you want to query for States, you can do following: +To query for states: ```php $stateRepository = $container->get('coreshop.repository.state'); - $queryBuilder = $stateRepository->createQueryBuilder('c'); - // You can now create your query - // And get the result - $states = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing State, you need to do following: +To update an existing state: ```php // Fetch State - $state = $stateRepository->findById(1); $state->setName('Euro'); - // And Persist it $container->get('coreshop.manager.state')->persist($state); $container->get('coreshop.manager.state')->flush(); ``` ## Delete -If you want to update and existing State, you need to do following: + +To delete an existing state: ```php // Fetch State - $state = $stateRepository->findById(1); - -// And Persist it +// And Remove it $container->get('coreshop.manager.state')->remove($state); $container->get('coreshop.manager.state')->flush(); -``` \ No newline at end of file +``` diff --git a/docs/03_Development/02_Localization/03_States/index.md b/docs/03_Development/02_Localization/03_States/index.md new file mode 100644 index 0000000000..c3621d30c4 --- /dev/null +++ b/docs/03_Development/02_Localization/03_States/index.md @@ -0,0 +1,6 @@ +# States + +In CoreShop, you can manage states using various operations. These are detailed in the following sections: + +1. **[Create, Update, Read, Delete](./01_CRUD.md)**: This section provides comprehensive instructions for performing + basic CRUD (Create, Read, Update, Delete) operations on states within Core diff --git a/docs/docs/03_Development/02_Localization/04_Zones/01_CRUD.md b/docs/03_Development/02_Localization/04_Zones/01_CRUD.md similarity index 69% rename from docs/docs/03_Development/02_Localization/04_Zones/01_CRUD.md rename to docs/03_Development/02_Localization/04_Zones/01_CRUD.md index 1ad93cfc84..01fefbbf07 100644 --- a/docs/docs/03_Development/02_Localization/04_Zones/01_CRUD.md +++ b/docs/03_Development/02_Localization/04_Zones/01_CRUD.md @@ -1,62 +1,58 @@ # Zones +Managing zones in CoreShop involves various operations, including create, read, update, and delete. Below are the +guidelines for each of these operations. + ## Create -If you want to create a Zone via API, you can do following: + +To create a new zone via the API: ```php $newZone = $container->get('coreshop.factory.zone')->createNew(); ``` -Now you have a new Zone, if you want to persist it, you need to do following: +After creating a new Zone instance, persist it using: ```php $container->get('coreshop.manager.zone')->persist($newZone); $container->get('coreshop.manager.zone')->flush(); ``` -You now have a new persisted Zone. +You now have a new persisted zone. ## Read -If you want to query for Zones, you can do following: +To query for zones: ```php $zoneRepository = $container->get('coreshop.repository.zone'); - $queryBuilder = $zoneRepository->createQueryBuilder('c'); - // You can now create your query - // And get the result - $zones = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing Zone, you need to do following: +To update an existing zone: ```php // Fetch Zone - $zone = $zoneRepository->findById(1); $zone->setName('Euro'); - // And Persist it $container->get('coreshop.manager.zone')->persist($zone); $container->get('coreshop.manager.zone')->flush(); ``` ## Delete -If you want to update and existing Zone, you need to do following: + +To delete an existing zone: ```php // Fetch Zone - $zone = $zoneRepository->findById(1); - -// And Persist it +// And Remove it $container->get('coreshop.manager.zone')->remove($zone); $container->get('coreshop.manager.zone')->flush(); -``` \ No newline at end of file +``` diff --git a/docs/03_Development/02_Localization/04_Zones/index.md b/docs/03_Development/02_Localization/04_Zones/index.md new file mode 100644 index 0000000000..5ef7254548 --- /dev/null +++ b/docs/03_Development/02_Localization/04_Zones/index.md @@ -0,0 +1,6 @@ +# Zones + +CoreShop allows for comprehensive management of zones, which is detailed in the following section: + +1. **[Create, Update, Read, Delete](./01_CRUD.md)**: This section provides step-by-step instructions for performing + basic CRUD (Create, Read, Update, Delete) operations on zones within CoreShop. diff --git a/docs/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/01_CRUD.md b/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/01_CRUD.md similarity index 56% rename from docs/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/01_CRUD.md rename to docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/01_CRUD.md index 884a28a90f..484e36fe98 100644 --- a/docs/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/01_CRUD.md +++ b/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/01_CRUD.md @@ -1,62 +1,58 @@ # Tax Rates +Managing tax rates in CoreShop involves various operations, including create, read, update, and delete. Below are the +guidelines for each of these operations. + ## Create -If you want to create a Zone via API, you can do following: + +To create a new tax rate via the API: ```php -$newZone = $container->get('coreshop.factory.tax_rate')->createNew(); +$newTaxRate = $container->get('coreshop.factory.tax_rate')->createNew(); ``` -Now you have a new Zone, if you want to persist it, you need to do following: +After creating a new Tax Rate instance, persist it using: ```php -$container->get('coreshop.manager.tax_rate')->persist($newZone); +$container->get('coreshop.manager.tax_rate')->persist($newTaxRate); $container->get('coreshop.manager.tax_rate')->flush(); ``` -You now have a new persisted Zone. +You now have a new persisted tax rate. ## Read -If you want to query for Tax Rates, you can do following: +To query for tax rates: ```php $rateRepository = $container->get('coreshop.repository.tax_rate'); - $queryBuilder = $rateRepository->createQueryBuilder('c'); - // You can now create your query - // And get the result - $rates = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing Zone, you need to do following: +To update an existing tax rate: ```php -// Fetch Zone - +// Fetch Tax Rate $rate = $rateRepository->findById(1); $rate->setName('Euro'); - // And Persist it $container->get('coreshop.manager.tax_rate')->persist($rate); $container->get('coreshop.manager.tax_rate')->flush(); ``` ## Delete -If you want to update and existing Zone, you need to do following: -```php -// Fetch Zone +To delete an existing tax rate: +```php +// Fetch Tax Rate $rate = $rateRepository->findById(1); - -// And Persist it +// And Remove it $container->get('coreshop.manager.tax_rate')->remove($rate); $container->get('coreshop.manager.tax_rate')->flush(); -``` \ No newline at end of file +``` diff --git a/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/index.md b/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/index.md new file mode 100644 index 0000000000..9258127503 --- /dev/null +++ b/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/index.md @@ -0,0 +1,8 @@ +# Tax Rate + +> The Tax Rate in CoreShop represents a single tax rate percentage, such as 20%. + +## Managing Tax Rates + +1. **[Create, Update, Read, Delete](./01_CRUD.md)**: This section provides detailed instructions for performing the + basic CRUD (Create, Read, Update, Delete) operations on tax rates within CoreShop. diff --git a/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/01_CRUD.md b/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/01_CRUD.md similarity index 65% rename from docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/01_CRUD.md rename to docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/01_CRUD.md index 04cffc4fb0..dd26e1d280 100644 --- a/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/01_CRUD.md +++ b/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/01_CRUD.md @@ -1,62 +1,58 @@ # Tax Rules +Managing tax rules in CoreShop involves various operations, including create, read, update, and delete. Below are the +guidelines for each of these operations. + ## Create -If you want to create a Tax Rule via API, you can do following: + +To create a new tax rule via the API: ```php $newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew(); ``` -Now you have a new Tax Rule, if you want to persist it, you need to do following: +After creating a new Tax Rule instance, persist it using: ```php $container->get('coreshop.manager.tax_rule')->persist($newTaxRule); $container->get('coreshop.manager.tax_rule')->flush(); ``` -You now have a new persisted Tax Rule. +You now have a new persisted tax rule. ## Read -If you want to query for Tax Rules, you can do following: +To query for tax rules: ```php $ruleRepository = $container->get('coreshop.repository.tax_rule'); - $queryBuilder = $ruleRepository->createQueryBuilder('c'); - // You can now create your query - // And get the result - $rules = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing Tax Rule, you need to do following: +To update an existing tax rule: ```php // Fetch Tax Rule - $rule = $ruleRepository->findById(1); $rule->setName('Euro'); - // And Persist it $container->get('coreshop.manager.tax_rule')->persist($rule); $container->get('coreshop.manager.tax_rule')->flush(); ``` ## Delete -If you want to update and existing Tax Rule, you need to do following: + +To delete an existing tax rule: ```php // Fetch Tax Rule - $rule = $ruleRepository->findById(1); - -// And Persist it +// And Remove it $container->get('coreshop.manager.tax_rule')->remove($rule); -$container->get('coreshop.manager.tax_rule')->flush(); +$container->get('coreshop.manager.tax_rule')->flush; ``` diff --git a/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/index.md b/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/index.md new file mode 100644 index 0000000000..80c298dc4a --- /dev/null +++ b/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/index.md @@ -0,0 +1,8 @@ +# Tax Rule + +> The Tax Rule in CoreShop is designed to manage different tax rates based on Country and State. + +## Managing Tax Rules + +1. **[Create, Update, Read, Delete](./01_CRUD.md)**: This section provides detailed instructions for performing the + basic CRUD (Create, Read, Update, Delete) operations on tax rules within CoreShop. diff --git a/docs/03_Development/02_Localization/05_Taxes/index.md b/docs/03_Development/02_Localization/05_Taxes/index.md new file mode 100644 index 0000000000..3ca7dec4c2 --- /dev/null +++ b/docs/03_Development/02_Localization/05_Taxes/index.md @@ -0,0 +1,11 @@ +# Taxes + +> In CoreShop, taxes are categorized into two main types: Tax Rates and Tax Rules. Tax Rates represent specific +> percentage rates, while Tax Rules determine the applicable Tax Rate based on Country and State. + +## Tax Components + +1. **[Tax Rates](./01_Tax_Rate/index.md)**: This section covers the management of individual tax rates, including their + creation, updating, reading, and deletion. +2. **[Tax Rules](./02_Tax_Rule/index.md)**: Here, you'll find detailed information on setting up and managing Tax Rules, + which are essential for determining the correct Tax Rate based on the geographical location (Country and State). diff --git a/docs/03_Development/02_Localization/index.md b/docs/03_Development/02_Localization/index.md new file mode 100644 index 0000000000..33801c09ff --- /dev/null +++ b/docs/03_Development/02_Localization/index.md @@ -0,0 +1,15 @@ +# Localization + +CoreShop offers a comprehensive suite of tools designed for the effective localization of your eCommerce platform. These +tools encompass various components essential for adapting to different regional settings: + +- **[Currencies](./01_Currencies/index.md)**: This section focuses on handling multiple currencies, a crucial aspect of + international eCommerce operations. +- **[Countries](./02_Countries/index.md)**: Here, you'll find information on managing country-specific settings and + preferences. +- **[States](./03_States/index.md)**: This part covers the management of states, which is vital for regional + customization and shipping logistics. +- **[Zones](./04_Zones/index.md)**: Zones are geographical groupings that can be used for shipping and other + location-based configurations. +- **[Taxes](./05_Taxes/index.md)**: The section on taxes provides details on setting up and managing Tax Rates and Tax + Rules, ensuring compliance with local tax regulations. diff --git a/docs/docs/03_Development/03_Products/01_CRUD.md b/docs/03_Development/03_Products/01_CRUD.md similarity index 55% rename from docs/docs/03_Development/03_Products/01_CRUD.md rename to docs/03_Development/03_Products/01_CRUD.md index ed9f303daf..a28a2c0396 100644 --- a/docs/docs/03_Development/03_Products/01_CRUD.md +++ b/docs/03_Development/03_Products/01_CRUD.md @@ -1,20 +1,18 @@ -# CoreShop Product +# Product -CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more -dynamic and configurable. It uses a Factory and Repository Pattern to do that. +CoreShop leverages Pimcore Data Objects for persisting Product Information but adds a layer of dynamism and +configurability through a Factory and Repository Pattern. ## Create -If you want to create a new Product, we need to get our Factory Service for that: +To create a new product, first obtain the Factory Service: ```php $productFactory = $container->get('coreshop.factory.product'); $product = $productFactory->createNew(); ``` -No we have our product and we can set all needed values. - -If you now want to save it, just call the save function +After setting the necessary values on the product, save it: ```php $product->save(); @@ -22,30 +20,27 @@ $product->save(); ## Read -To get products, you need to use the Repository Service CoreShop provides you. +Use the Repository Service provided by CoreShop to retrieve products: ```php $repository = $container->get('coreshop.repository.product'); - // Query by ID $productWithIdOne = $repository->findById(1); -// Get a Listing how you know it from Pimcore +// Get a Listing as in Pimcore $list = $repository->getList(); $list->setCondition("active = 1"); $products = $list->getObjects(); - ``` ## Update -Update works the same as you are used to in Pimcore +Updating a product follows the same pattern as in Pimcore: ```php $repository = $container->get('coreshop.repository.product'); - // Query by ID $productWithIdOne = $repository->findById(1); @@ -56,12 +51,11 @@ $productWithIdOne->save(); ## Delete -Delete works the same as you are used to in Pimcore +Deleting a product also follows the familiar Pimcore process: ```php $repository = $container->get('coreshop.repository.product'); - // Query by ID $productWithIdOne = $repository->findById(1); $productWithIdOne->delete(); diff --git a/docs/03_Development/03_Products/02_Price_Calculation.md b/docs/03_Development/03_Products/02_Price_Calculation.md new file mode 100644 index 0000000000..4f1d0d2be8 --- /dev/null +++ b/docs/03_Development/03_Products/02_Price_Calculation.md @@ -0,0 +1,68 @@ +# Product Price Calculation + +CoreShop employs multiple Price Calculators to determine the correct price for a product. By default, the following +calculators are used: + +- [Price Rule Calculator](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ProductBundle/Calculator/PriceRuleCalculator.php): + Utilizes prices from Catalog Price Rules and Specific Price Rules. +- [Store Product Price Calculator](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Product/Calculator/StoreProductPriceCalculator.php): + Calculates prices based on store values. + +For custom calculators, implement the +interface [```CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Product/Calculator/ProductPriceCalculatorInterface.php) +and register your service with the tag ```coreshop.product.price_calculator```, including attributes ```type``` +and ```priority```. + +## CoreShop Price Calculation Components + +CoreShop's price calculation encompasses three distinct prices: + +- **Retail Price**: The base price without any discounts. +- **Discount Price**: A special price for promotions, which should be lower than the retail price. +- **Discount**: Monetary value of discounts from promotions. +- **Price**: Calculated as the Retail Price or Discount Price (whichever is applicable) minus any discount rules. + +## Calculator Service Usage + +To calculate the price for a product, use one of the following services: + +1. ```coreshop.product.price_calculator```: Calculates prices without tax considerations. +2. ```coreshop.product.taxed_price_calculator```: Calculates prices with or without tax considerations (recommended). + +### Templating + +For price calculation within a template, use the ```coreshop_product_price``` filter: + +```twig +{{ (product|coreshop_product_price(true)) }} +``` + +Custom Price Calculator Example +This example demonstrates how to add a new calculator, using the property "price" - 1 as the Product Price, and -1 as +the Discount. Note that this example is a demonstration and not a practical implementation. + +```php + +add('textField', InputType::class); + } +} +``` + +Create a corresponding Pimcore Backend UI JavaScript file: + +```javascript +pimcore.registerNS('coreshop.product.pricerules.conditions.custom'); +coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, { + type: 'custom', + + getForm: function () { + var textFieldValue = this.data && this.data.textField ? this.data.textField : null; + + this.textField = new Ext.create({ + xtype: 'textfield', + name: 'text-field', + value: textFieldValue + }); + + this.form = new Ext.form.Panel({ + items: [this.textField] + }); + + return this.form; + } +}); +``` + +Extend the service definition to include your form type: + +```yaml +# config/services.yaml +services: + App\CoreShop\Product\PriceRules\Condition\CustomCondition: + tags: + - { name: coreshop.product_price_rule.condition, type: custom, form-type: App\CoreShop\Form\Type\PriceRules\Condition\CustomCondition\CustomConditionType } +``` + +## Resolving Autowiring Issues with Custom Conditions + +When autowiring is enabled in your CoreShop project, you may encounter a scenario where your custom condition appears twice in the system: once with configuration options and once without. This duplication can be resolved by modifying your service definition to explicitly disable autoconfiguration for your custom condition. Here’s how you can achieve this: + +In your `services.yaml`, update the service definition for your custom condition as follows: + +```yaml +# config/services.yaml +services: + App\CoreShop\Product\PriceRules\Condition\CustomCondition: + autoconfigure: false + tags: + - { name: coreshop.product_price_rule.condition, type: custom, form-type: App\CoreShop\Form\Type\PriceRules\Condition\CustomCondition\CustomConditionType } +``` + +This modification tells Symfony not to autoconfigure the custom condition service, thus preventing the duplication issue. With this change, your custom condition will appear only once in the CoreShop system with the intended configuration. diff --git a/docs/03_Development/03_Products/03_Price_Rules/02_Custom_Action.md b/docs/03_Development/03_Products/03_Price_Rules/02_Custom_Action.md new file mode 100644 index 0000000000..c446c582a5 --- /dev/null +++ b/docs/03_Development/03_Products/03_Price_Rules/02_Custom_Action.md @@ -0,0 +1,81 @@ +--- +title: Custom Action +--- + +# Creating Custom Product Price Rule Action + +CoreShop offers a variety of default actions for product price rules. However, there may be instances where you need to implement custom actions. This guide will walk you through the process of creating a custom action for product price rules in CoreShop. + +## Step 1: Create the Action Class + +Depending on the type of discount, you can choose between different options (see [Pricing](../02_Price_Calculation.md) for more details) + + - **Price Action**: To define a new fixed price (`CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface`) + - **Price Discount Action**: To define a new discounted price (`CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface`) + - **Discount Action**: To define a Discount on a given Price (`CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface`) + +Each one is responsible for a different type of discount. The following example shows how to create a new fixed price discount. + +```php + Find detailed information on product price +> rules [here](../../../02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md). +> Product price rules are applicable to multiple products and are based on conditions like category or manufacturer. + +### Specific Price Rules + +> Explore specific price rules [here](../../../02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md). +> Specific price rules target a single product, with conditions based on factors like customer or customer group. + +### Quantity Price Rules + +> For quantity price rules, click [here](../../../02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md). +> These rules apply to a single product and are based on the quantity of a cart item. They only affect cart item prices, +> and the default price calculation in CoreShop will return zero outside the cart context if only quantity rules are +> configured. + +## Extending Conditions and Actions + +- To add custom Actions, [click here](../../01_Extending_Guide/04_Extending_Rule_Actions.md). +- To add custom Conditions, [click here](../../01_Extending_Guide/05_Extending_Rule_Conditions.md). + +## Template Helper + +### Get Formatted Price with all applied Rules + +```twig +{% import '@CoreShopFrontend/Common/Macro/currency.html.twig' as currency %} +{% import '@CoreShopFrontend/Common/Macro/product_price.html.twig' as product_price %} + +
+ {{ 'coreshop.ui.price'|trans }}: + {{ product_price.display_product_price(product) }} +
+
+ {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }}) +
+``` + +### Get Active Price Rules + +```twig +{{ dump(product|coreshop_product_price_rules) }} +``` diff --git a/docs/docs/03_Development/03_Products/04_Configuration.md b/docs/03_Development/03_Products/04_Configuration.md similarity index 94% rename from docs/docs/03_Development/03_Products/04_Configuration.md rename to docs/03_Development/03_Products/04_Configuration.md index 60900f933f..396d2344f0 100644 --- a/docs/docs/03_Development/03_Products/04_Configuration.md +++ b/docs/03_Development/03_Products/04_Configuration.md @@ -1,4 +1,4 @@ -# CoreShop Product Configuration +# Product Configuration ```yaml core_shop_product: diff --git a/docs/03_Development/03_Products/05_Multiple_Product_DataObjects.md b/docs/03_Development/03_Products/05_Multiple_Product_DataObjects.md new file mode 100644 index 0000000000..1878715981 --- /dev/null +++ b/docs/03_Development/03_Products/05_Multiple_Product_DataObjects.md @@ -0,0 +1,92 @@ +# Create a new Product Type + +CoreShop allows you to create a new custom Product Type. The most single interface implementation that can be added to +the cart +is the `CoreShop\Component\Order\Model\PurchasableInterface`. You therefore have to at least implement this interface if +you want to add a new Product Type and allow it to be added the the cart. + +If you need Product Price Rules, Product Specific Price Rules and Quantity Price Rules, you have to go for +the `CoreShop\Component\Core\Model\ProductInterface`. +In that case, it is easier to just copy the `CoreShopProduct` Class Definition and add it as a new Class. + +## Registering your Product Type + +In Order for CoreShop to know that there is a new `Purchasable`, you have to register your class. The easiest way to do +this is, to add this config: + +```yaml +core_shop_resource: + pimcore: + app.my_product: + classes: + model: Pimcore\Model\DataObject\MyProduct + interface: CoreShop\Component\Core\Model\ProductInterface +``` + +Or if it's just a `Purchasable`: + +```yaml +core_shop_resource: + pimcore: + app.my_product: + classes: + model: Pimcore\Model\DataObject\MyProduct + interface: CoreShop\Component\Order\Model\PurchasableInterface +``` + +CoreShop will then create separate Services for you, the mains one are the Factory and the +Repository (`app.repository.my_product`, `app.factory.my_product`). +You don't need to use them in your Project, but they are quite important internally for CoreShop. + +## Price Calculators + +Since you added a new Product Class, you also need Price Calculators for it. CoreShop has a few Price Calculators +already, but you can add your own. + +> If you just added a Purchasable, you have to create a new Price Calculator. + +To create a new Price Calculator, you need implement the +interfaces `CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface` +and `CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface`. + +For how Pricing works in detail, see this: [Pricing](./02_Price_Calculation.md) + +```php +getRetailPrice($purchasable, $context); + } + + public function getRetailPrice(PurchasableInterface $purchasable, array $context): int + { + if (!$purchasable instanceof \Pimcore\Model\DataObject\MyProduct) { + throw new NoPurchasableRetailPriceFoundException(__CLASS__); + } + + return 100; + } +} +``` + +You then also need to register your new Calculator as a Service: + +```yaml + App\CoreShop\MyProductPriceCalculator: + tags: + - { name: coreshop.order.purchasable.price_calculator, type: my_product } + - { name: coreshop.order.purchasable.retail_price_calculator, type: my_product } +``` \ No newline at end of file diff --git a/docs/docs/03_Development/03_Products/06_Units.md b/docs/03_Development/03_Products/06_Units.md similarity index 68% rename from docs/docs/03_Development/03_Products/06_Units.md rename to docs/03_Development/03_Products/06_Units.md index 7a5f3e4a46..597f6f73ba 100644 --- a/docs/docs/03_Development/03_Products/06_Units.md +++ b/docs/03_Development/03_Products/06_Units.md @@ -1,15 +1,19 @@ -# CoreShop Product Units +# Product Units Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units. -Each Product can have different units. Also each product/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects: +Each Product can have different units. Also each product/unit relation can have an own precision that differs to other +relations. To archive that, the relation between products and units consists of three objects: + - ProductUnit - ProductUnitDefinition - ProductUnitDefinitions -As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend. +As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT +etc. and some localized fields for rendering in frontend. -To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition. +To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a +ProductUnitDefinition. ```php use CoreShop\Component\Product\Model\Product; @@ -32,4 +36,5 @@ $product->save(); To add multiple units for a product use `$product->addUnitDefinition($unitDefinition)`. -To change a unit override the default one `$product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit)`. +To change a unit override the default +one `$product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit)`. diff --git a/docs/docs/03_Development/03_Products/07_Unit_Definitions.md b/docs/03_Development/03_Products/07_Unit_Definitions.md similarity index 86% rename from docs/docs/03_Development/03_Products/07_Unit_Definitions.md rename to docs/03_Development/03_Products/07_Unit_Definitions.md index 2926dfa72e..2380d49ff5 100644 --- a/docs/docs/03_Development/03_Products/07_Unit_Definitions.md +++ b/docs/03_Development/03_Products/07_Unit_Definitions.md @@ -1,10 +1,12 @@ -# CoreShop Product Unit Definitions +# Product Unit Definitions CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc. First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields. -Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop) +Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, +you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different +order-possibilities in the add-to-cart section in the webshop) Using the API for product units: @@ -33,8 +35,6 @@ $product->setUnitDefinitions($unitDefinitions); $product->save(); ``` - - ## Update Default UnitDefinition ```php @@ -57,11 +57,10 @@ $product->setUnitDefinitions($unitDefinitions); $product->save(); ``` - - ## Delete UnitDefinition -Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it. +Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the +product_unit_definitions repository and then deleting it. ```php /** @var DataObject\CoreShopProduct $product */ diff --git a/docs/03_Development/03_Products/08_Money_Values.md b/docs/03_Development/03_Products/08_Money_Values.md new file mode 100644 index 0000000000..c861a41ffc --- /dev/null +++ b/docs/03_Development/03_Products/08_Money_Values.md @@ -0,0 +1,36 @@ +# Money Values + +CoreShop adopts an integer-based approach for storing money and currency values. This methodology is crucial for +ensuring accuracy and avoiding common issues associated with floating-point values, particularly when it comes to +financial calculations. + +## Why Integer Values? + +1. **Precision and Accuracy**: Floating-point arithmetic can introduce rounding errors, which are unacceptable in + financial calculations. By using integers to represent monetary values, CoreShop ensures precise calculations without + rounding discrepancies. + +2. **Standard Practices**: Many financial systems and databases prefer integer representation for money to maintain + consistency and precision. This approach aligns CoreShop with standard practices in financial data handling. + +3. **Avoiding Floating-Point Pitfalls**: Floating points can cause unexpected behavior due to how computers handle + decimal fractions. For example, the result of adding 0.1 and 0.2 may not precisely equal 0.3 in floating-point + arithmetic. Such inaccuracies are eliminated with integer representation. + +## Working with Money Values + +When dealing with money values in CoreShop, it's essential to consider that these values are stored as integers. For +instance, a value of "€10.50" would be stored as 1050 (assuming a base unit of 100 for the currency). This approach +necessitates careful handling of these values in calculations, display formatting, and database operations. + +### Example Usage + +In CoreShop, when displaying a price or performing calculations, you should convert these integer values back to their +decimal form. This conversion is typically handled by CoreShop's internal functions and utilities. + +### Further Reading + +For a deeper understanding of how CoreShop handles fractional currency values and the implications for your eCommerce +application, refer to the following documentation: + +- [Currency Fractions](../20_Currency_Fractions/index.md) diff --git a/docs/03_Development/03_Products/index.md b/docs/03_Development/03_Products/index.md new file mode 100644 index 0000000000..372ce9f654 --- /dev/null +++ b/docs/03_Development/03_Products/index.md @@ -0,0 +1,11 @@ +# Products + +This guide should lead you through how CoreShop handles Product information and how it does price calculations. + +1. [Create, Read, Update, Delete](./01_CRUD.md) +2. [Price Calculation](./02_Price_Calculation.md) +3. [Price Rules](./03_Price_Rules/index.md) +4. [Configuration](./04_Configuration.md) +5. [Multiple Product DataObjects](./05_Multiple_Product_DataObjects.md) +6. [Product Units](./06_Units.md) +7. [Product Unit Definitions](./07_Unit_Definitions.md) diff --git a/docs/docs/03_Development/05_Checkout/01_Checkout_Manager.md b/docs/03_Development/05_Checkout/01_Checkout_Manager.md similarity index 88% rename from docs/docs/03_Development/05_Checkout/01_Checkout_Manager.md rename to docs/03_Development/05_Checkout/01_Checkout_Manager.md index 2de4aa4a7f..7df0e5a329 100644 --- a/docs/docs/03_Development/05_Checkout/01_Checkout_Manager.md +++ b/docs/03_Development/05_Checkout/01_Checkout_Manager.md @@ -1,21 +1,22 @@ -# CoreShop Checkout Manager +# Checkout Manager -# CoreShop Checkout +# Checkout CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps: - - Cart - - Customer - - Address - - Shipping - - Payment - - Summary +- Cart +- Customer +- Address +- Shipping +- Payment +- Summary ## Create a Custom CheckoutManager If you want to modify the Checkout Manager, you have two options: - - Create a total different Checkout Manager configuration - - Modify the default configuration + +- Create a total different Checkout Manager configuration +- Modify the default configuration ### Create a total different Checkout Manager diff --git a/docs/docs/03_Development/05_Checkout/02_Checkout_Step.md b/docs/03_Development/05_Checkout/02_Checkout_Step.md similarity index 92% rename from docs/docs/03_Development/05_Checkout/02_Checkout_Step.md rename to docs/03_Development/05_Checkout/02_Checkout_Step.md index a942c7c5ec..dfe5068a1d 100644 --- a/docs/docs/03_Development/05_Checkout/02_Checkout_Step.md +++ b/docs/03_Development/05_Checkout/02_Checkout_Step.md @@ -1,6 +1,7 @@ -# CoreShop Checkout Step +# Checkout Step -If you want to implement a custom checkout step, you need to implement the interface ```CoreShop\Component\Order\Checkout\CheckoutStepInterface``` +If you want to implement a custom checkout step, you need to implement the +interface ```CoreShop\Component\Order\Checkout\CheckoutStepInterface``` and register your step into your Cart Manager: ```yaml @@ -14,12 +15,14 @@ core_shop_core: priority: 50 ``` -The [Checkout Controller](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/FrontendBundle/Controller/CheckoutController.php#L44) takes care about handling +The [Checkout Controller](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/FrontendBundle/Controller/CheckoutController.php#L44) +takes care about handling the Checkout for you then. ## Optional Checkout Step -If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface ```CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface```. +If you have an optional checkout step - depending on the cart, your Checkout Step can implement the +interface ```CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface```. You need to implement the function ```isRequired(OrderInterface $cart)``` diff --git a/docs/03_Development/05_Checkout/index.md b/docs/03_Development/05_Checkout/index.md new file mode 100644 index 0000000000..b79e2b6ae2 --- /dev/null +++ b/docs/03_Development/05_Checkout/index.md @@ -0,0 +1,6 @@ +# Checkout + +This guide should lead you through how CoreShop handles the Checkout. + +- [Checkout Manager](./01_Checkout_Manager.md) +- [Checkout Step](./02_Checkout_Step.md) diff --git a/docs/03_Development/06_Order/01_One_Object_to_Rule_them_all.md b/docs/03_Development/06_Order/01_One_Object_to_Rule_them_all.md new file mode 100644 index 0000000000..aa767a0744 --- /dev/null +++ b/docs/03_Development/06_Order/01_One_Object_to_Rule_them_all.md @@ -0,0 +1,8 @@ +# One Object to Rule Them All + +CoreShop utilizes a single DataObject class for managing Orders, Carts, and Quotes. This is the `CoreShopOrder` class. + +## From Cart to Order + +The conversion of a Cart into an Order triggers the `SaleState` Workflow, facilitating the transition within the +CoreShop system. diff --git a/docs/03_Development/06_Order/02_Storage_List.md b/docs/03_Development/06_Order/02_Storage_List.md new file mode 100644 index 0000000000..5322768ce3 --- /dev/null +++ b/docs/03_Development/06_Order/02_Storage_List.md @@ -0,0 +1,58 @@ +# Storage List + +In CoreShop, the functionalities of Order, Cart, Quote, and Wishlist are unified, thanks to the abstraction into a +dedicated Bundle. + +## Configuration + +The default configuration for the Order StorageList is as follows: + +```yaml +core_shop_storage_list: + list: + order: + context: + interface: CoreShop\Component\Order\Context\CartContextInterface + composite: CoreShop\Component\Order\Context\CompositeCartContext + tag: coreshop.context.cart + restore_customer_list_only_on_login: false + services: + manager: CoreShop\Bundle\OrderBundle\Manager\CartManager + modifier: CoreShop\Component\Order\Cart\CartModifier + enable_default_store_based_decorator: false + session: + enabled: true + key: coreshop.cart + form: + type: CoreShop\Bundle\OrderBundle\Form\Type\CartType + add_type: CoreShop\Bundle\OrderBundle\Form\Type\AddToCartType + resource: + interface: CoreShop\Component\Core\Model\OrderInterface + product_repository: coreshop.repository.stack.purchasable + repository: coreshop.repository.order + item_repository: coreshop.repository.order_item + factory: coreshop.factory.order + item_factory: coreshop.factory.order_item + add_to_list_factory: CoreShop\Bundle\OrderBundle\Factory\AddToCartFactoryInterface + routes: + summary: coreshop_cart_summary + index: coreshop_index + templates: + add_to_cart: '@CoreShopFrontend/Product/_addToCart.html.twig' + summary: '@CoreShopFrontend/Cart/summary.html.twig' + controller: + enabled: false + class: CoreShop\Bundle\StorageListBundle\Controller\StorageListController + expiration: + enabled: true + service: CoreShop\Bundle\OrderBundle\Expiration\OrderAndCartExpiration + days: 0 + params: + cart: + days: 0 + params: + anonymous: true + customer: false + order: + days: 20 +``` diff --git a/docs/03_Development/06_Order/03_Caching.md b/docs/03_Development/06_Order/03_Caching.md new file mode 100644 index 0000000000..510f5adc1f --- /dev/null +++ b/docs/03_Development/06_Order/03_Caching.md @@ -0,0 +1,18 @@ +# Caching + +Pimcore faces challenges with concurrency and caching, especially when handling DataObjects. The caching of DataObjects +in Pimcore occurs post-request during PHP termination. This can lead to delays if, for instance, complex Order Objects +are involved or if there are issues in the cache marshalling process. Subsequently, a new request may access an outdated +cached version of the Order Object, potentially causing inconsistencies. + +To mitigate these issues, CoreShop provides a specific configuration option to disable caching for Storage List and +Storage List Item Objects: + +```yaml +core_shop_storage_list: + list: + order: + disable_caching: true + wishlist: + disable_caching: true +``` diff --git a/docs/03_Development/06_Order/04_Cart_Processor.md b/docs/03_Development/06_Order/04_Cart_Processor.md new file mode 100644 index 0000000000..c1682c85d7 --- /dev/null +++ b/docs/03_Development/06_Order/04_Cart_Processor.md @@ -0,0 +1,56 @@ +# Cart Processor + +The Cart Processor in CoreShop is responsible for refreshing the state and prices of carts. It is automatically +triggered every time the `persistCart` function of the [Cart-Manager](./08_Cart_Manager.md) is called on a cart, +ensuring that the cart is re-calculated. + +The following processors are implemented by default: + +- [Cart Adjustment Clearer](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartAdjustmentClearer.php) +- [Item Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartItemProcessor.php) +- [Item Tax Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartItemTaxProcessor.php) +- [Cart Price Rule Voucher Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartPriceRuleVoucherProcessor.php) +- [Cart Rule Auto Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartRuleAutoProcessor.php) +- [Cart Shipping Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartShippingProcessor.php) +- [Cart Tax Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartTaxProcessor.php) + +These processors handle all necessary price calculations for the cart. To extend cart calculations, a new processor +should be created. + +## Creating a Cart Processor + +To create a Cart Processor, implement the +interface [```CoreShop\Component\Order\Processor\CartProcessorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Processor/CartProcessorInterface.php). +Register this in the container with the tag ```coreshop.cart_processor``` and a ```priority``` attribute. + +### Example of a Cart Processor + +Here's an example of a custom Cart Processor that calculates a unique field for the cart: + +```php +setCustomField(uniqid()); + } +} +``` + +Registration of the processor: + +```yaml +app.coreshop.cart.processor.custom: + class: AppBundle\CoreShop\Order\Cart\Processor\CustomCartProcessor + tags: + - { name: coreshop.cart_processor, priority: 200 } +``` + +This custom processor will now assign a new unique ID to the custom field on every cart update. \ No newline at end of file diff --git a/docs/03_Development/06_Order/05_Adjustment.md b/docs/03_Development/06_Order/05_Adjustment.md new file mode 100644 index 0000000000..6dc34cc49f --- /dev/null +++ b/docs/03_Development/06_Order/05_Adjustment.md @@ -0,0 +1,40 @@ +# Adjustments + +Adjustments in CoreShop provide a mechanism to add extra costs or discounts to your Order, such as Taxes, Shipping, or +Discounts. + +## Add a New Adjustment + +The best practice for adding or removing adjustments is within Cart Processors. More information about Cart Processors +can be found [here](./04_Cart_Processor.md). + +To add a new Adjustment, you should create a new Adjustment Model that implements the +interface [`CoreShop\Component\Order\Model\AdjustmentInterface`]. Use the +Factory [`CoreShop\Component\Order\Factory\AdjustmentFactoryInterface`] to create a new Adjustment. + +```php +/** + * @var AdjustmentFactoryInterface $adjustmentFactory + */ +$adjustmentFactory = $this->container->get('coreshop.factory.adjustment'); + +$type = "custom-adjustment"; +$label = "Label for Frontend"; +$amountGross = 10000; //100.00 +$amountNet = 8000; //80.00 +$neutral = false; //If neutral, it doesn't affect the total amount + +$adjustment = $this->adjustmentFactory->createWithData( + $type, + $label, + $amountGross, + $amountNet, + $neutral, +); + +//Adjustments can be added to the Cart or to a Cart Item +$cart->addAdjustment($adjustment); +$cartItem->addAdjustment($adjustment); +``` + +Adjustments can be applied either to the Cart as a whole or to individual Cart Items. diff --git a/docs/03_Development/06_Order/06_Taxation.md b/docs/03_Development/06_Order/06_Taxation.md new file mode 100644 index 0000000000..7ce61a6485 --- /dev/null +++ b/docs/03_Development/06_Order/06_Taxation.md @@ -0,0 +1,31 @@ +# Taxation + +CoreShop's flexible taxation system enables you to configure tax rules based on countries, states, zip codes, and tax +categories. This system is designed to handle complex tax scenarios across different regions and products. + +## Setting Up Taxation + +To configure taxation effectively in CoreShop, follow these essential steps: + +1. **Create a Tax Rate**: Begin by setting up a tax rate. This rate represents the percentage of tax applied to a + product or service. +2. **Create a Tax Rule**: Tax rules define the conditions under which a particular tax rate is applied. These rules can + be based on various factors such as country, state, or zip code. +3. **Assign the Tax Rule to a Tax Rate**: Link your tax rule to the appropriate tax rate. This step ensures that the + correct rate is applied based on the defined conditions in the tax rule. +4. **Assign the Tax Rule to a Product**: Finally, assign the tax rule to the products it applies to. This step + integrates your tax configuration with your product catalog. + +## Understanding Gross/Net Product Prices + +The concept of gross and net prices in CoreShop is pivotal and depends on your store's configuration: + +- **Gross Product Price**: If the store is configured for gross pricing, the product prices entered are treated as + inclusive of tax. This means that the listed price includes the tax amount. +- **Net Product Price**: Conversely, if the store is set up for net pricing, the product prices are exclusive of tax. In + this case, the tax is calculated and added to the net price at the point of sale. + +CoreShop automatically adjusts the final price, adding or subtracting the tax amount based on whether the product price +is configured as gross or net. This feature ensures accurate pricing and tax calculation across different store +configurations. + diff --git a/docs/03_Development/06_Order/07_Cart_Price_Rules_and_Vouchers.md b/docs/03_Development/06_Order/07_Cart_Price_Rules_and_Vouchers.md new file mode 100644 index 0000000000..5cffa02cf6 --- /dev/null +++ b/docs/03_Development/06_Order/07_Cart_Price_Rules_and_Vouchers.md @@ -0,0 +1,32 @@ +# Cart Price Rules and Vouchers + +In CoreShop, Cart Price Rules provide a mechanism to apply discounts to a shopping cart. This is achieved by creating +Cart Price Rules and then adding Cart Price Rule Vouchers to the cart. For a detailed understanding of Cart Price Rules, +refer to [Cart Price Rules](./../../02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md). + +## Discount and Surcharge Application + +Discounts or surcharges from Cart Price Rules are applied as [Adjustments](./05_Adjustment.md) to the order. To ensure +correct tax calculations, these discounts or surcharges are applied proportionally to the items in the cart. + +### Example Scenario + +Consider a cart with the following items: + +| Product | Quantity | Price | +|-----------|----------|---------| +| Product A | 1 | €50.00 | +| Product B | 1 | €200.00 | + +Product A accounts for 20% of the total price, while Product B accounts for 80%. + +If a discount of €50 is applied, it will be distributed as follows: + +| Product | Quantity | Price | Discount | Discounted Price | +|-----------|----------|---------|----------|------------------| +| Product A | 1 | €50.00 | €10.00 | €40.00 | +| Product B | 1 | €200.00 | €40.00 | €160.00 | + +This example demonstrates how the discount is proportionally divided among the products based on their contribution to +the total cart value. This proportional allocation ensures that the discount is fairly distributed and that tax +calculations remain accurate. diff --git a/docs/03_Development/06_Order/08_Cart_Manager.md b/docs/03_Development/06_Order/08_Cart_Manager.md new file mode 100644 index 0000000000..71f82adf8d --- /dev/null +++ b/docs/03_Development/06_Order/08_Cart_Manager.md @@ -0,0 +1,9 @@ +# Cart Manager + +The Cart Manager in CoreShop is designed to facilitate the management of Carts. It primarily handles: + +- Persisting a Cart + +The Cart Manager adheres to the +interface [`CoreShop\Component\Order\Manager\CartManagerInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Manager/CartManagerInterface.php) +and is implemented as the service `coreshop.cart.manager`. diff --git a/docs/03_Development/06_Order/09_Cart_Modifier.md b/docs/03_Development/06_Order/09_Cart_Modifier.md new file mode 100644 index 0000000000..66cd05441c --- /dev/null +++ b/docs/03_Development/06_Order/09_Cart_Modifier.md @@ -0,0 +1,12 @@ +# Cart Modifier + +CoreShop includes a helper service, known as the Cart Modifier, to facilitate modifications to the cart. This service +simplifies tasks such as: + +- Adding items to the cart +- Removing items from the cart +- Changing the quantity of items in the cart + +The Cart Modifier adheres to the +interface [`CoreShop\Component\Order\Cart\CartModifierInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Cart/CartModifierInterface.php) +and is implemented by the service `coreshop.cart.modifier`. diff --git a/docs/03_Development/06_Order/10_Cart_Context.md b/docs/03_Development/06_Order/10_Cart_Context.md new file mode 100644 index 0000000000..7c7db86ac7 --- /dev/null +++ b/docs/03_Development/06_Order/10_Cart_Context.md @@ -0,0 +1,33 @@ +# Cart Context + +CoreShop uses a system of context and context resolvers to determine the current cart. + +The Cart Context adheres to the +interface [```CoreShop\Component\Order\Context\CartContextInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Context/CartContextInterface.php) +and is implemented in the service `coreshop.context.cart`. + +## Getting the Current Cart + +To obtain the current cart, use the `coreshop.context.cart` service: + +```php +$cartContext = $container->get('coreshop.context.cart'); + +// Get current cart, if none exists, a new one is created +$cart = $cartContext->getCart(); +``` + +## Context Types + +The table below outlines the various contexts used for cart determination: + +| Name | Priority | Description | +|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|--------------------------------------------------------------------------------------------------| +| [FixedCartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Context/FixedCartContext.php) | -100 | For testing or backend order creation. | +| [SessionAndStoreBasedCartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/OrderBundle/Context/SessionAndStoreBasedCartContext.php) | -555 | Searches for a valid session cart in the given store context. | +| [CustomerAndStoreBasedCartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/OrderBundle/Context/CustomerAndStoreBasedCartContext.php) | -777 | Searches for a cart based on a customer, activates post-login to find the last cart a user left. | +| [CartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Context/CartContext.php) | -999 | Creates a new cart if other contexts fail. | + +## Create a Custom Resolver + +To register a custom context, use the tag `coreshop.context.cart` with an optional `priority` attribute. diff --git a/docs/03_Development/06_Order/13_Number_Generator.md b/docs/03_Development/06_Order/13_Number_Generator.md new file mode 100644 index 0000000000..770c6c44bd --- /dev/null +++ b/docs/03_Development/06_Order/13_Number_Generator.md @@ -0,0 +1,50 @@ +# Order Number Generator + +CoreShop generates a unique number for each completed order. This generation is handled by +the `CoreShop\Component\Core\Order\Committer\OrderCommitter`, utilizing a `NumberGeneratorInterface` service. + +If the CoreBundle is installed, the `coreshop.order.number_generator.prefix_suffix` service is used. This service +decorates the `coreshop.order.number_generator.default` and adds the capability to manage a prefix and suffix through +CoreShop settings. + +To implement a custom number generator, create a service that decorates the `coreshop.order.number_generator.default`. +The `decoration_priority` setting determines the order in which decorators are called. + +- A `decoration_priority` higher or equal to zero results in this + order: `PrefixSuffix Generator > CustomNumberGenerator > DefaultSequenceGenerator`. +- A `decoration_priority` below zero changes the order + to: `CustomNumberGenerator > PrefixSuffix Generator > DefaultSequenceGenerator`. + +### Example: Custom Number Generator with Padding + +This example shows a custom implementation that adds padding to the number: + +```php +final class CustomNumberGenerator implements NumberGeneratorInterface +{ +public function __construct( +private NumberGeneratorInterface $numberGenerator, // decorated service +) { +} + + public function generate(ResourceInterface $model): string + { + $number = $this->numberGenerator->generate($model); + + return str_pad($number, 10, '0', STR_PAD_LEFT); + } +} +``` + +Symfony service definition: + +```yaml + App\Order\CustomNumberGenerator: + decorates: coreshop.order.number_generator.default + decoration_priority: 1 + arguments: + - '@.inner' +``` + +This format should provide clarity on the customization of the Order Number Generator in CoreShop. If you have more +sections to work on or need further adjustments, please let me know! diff --git a/docs/docs/03_Development/06_Order/08_OrderList/01_Filter.md b/docs/03_Development/06_Order/14_Backend_Management/01_OrderList_Filter.md similarity index 97% rename from docs/docs/03_Development/06_Order/08_OrderList/01_Filter.md rename to docs/03_Development/06_Order/14_Backend_Management/01_OrderList_Filter.md index 288d9cda0d..1d4f088b37 100644 --- a/docs/docs/03_Development/06_Order/08_OrderList/01_Filter.md +++ b/docs/03_Development/06_Order/14_Backend_Management/01_OrderList_Filter.md @@ -1,4 +1,4 @@ -# CoreShop Order List Filter +# Order List Filter This comes in handy if you need some special filtered data in your Order List. Your Customer is able to filter orders on specific conditions. @@ -14,6 +14,7 @@ AppBundle\CoreShop\OrderList\Filter\DemoFilter: ``` ## Create PHP Class + In this example we want to filter orders with available shipments in state "ready". ```php @@ -37,7 +38,7 @@ class DemoFilter implements GridFilterInterface $list->onCreateQuery(function (QueryBuilder $select) use ($list) { $select->join( ['shipment' => 'object_query_4'], - 'shipment.order__id = object_' . $list->getClassId() . '.o_id' + 'shipment.order__id = object_' . $list->getClassId() . '.id' ); }); diff --git a/docs/docs/03_Development/06_Order/08_OrderList/02_Action.md b/docs/03_Development/06_Order/14_Backend_Management/02_OrderList_Action.md similarity index 99% rename from docs/docs/03_Development/06_Order/08_OrderList/02_Action.md rename to docs/03_Development/06_Order/14_Backend_Management/02_OrderList_Action.md index 9de68c83d9..b794d6bb8c 100644 --- a/docs/docs/03_Development/06_Order/08_OrderList/02_Action.md +++ b/docs/03_Development/06_Order/14_Backend_Management/02_OrderList_Action.md @@ -1,4 +1,4 @@ -# CoreShop Order List Actions +# Order List Actions Actions allows you to process orders rapidly, right in the order grid view. @@ -16,6 +16,7 @@ AppBundle\CoreShop\OrderList\Action\Demo: ``` ## Create PHP Class + In this example we want to apply the shipment transition "ship" to selected orders. ```php diff --git a/docs/03_Development/06_Order/14_Backend_Management/03_Extend_OrderDetail.md b/docs/03_Development/06_Order/14_Backend_Management/03_Extend_OrderDetail.md new file mode 100644 index 0000000000..687f0807dc --- /dev/null +++ b/docs/03_Development/06_Order/14_Backend_Management/03_Extend_OrderDetail.md @@ -0,0 +1,158 @@ +# Extending Order Detail + +CoreShop's Order Detail Page is a custom-designed interface built with ExtJs, offering straightforward ways to extend +and customize it according to your specific needs. + +## UI Overview + +The Order Detail UI consists of various blocks strategically positioned for optimal user experience. There are four main +positions for these blocks: + +- **Top**: At the top of the page. +- **Left**: On the left side of the page. +- **Right**: On the right side of the page. +- **Bottom**: At the bottom of the page. + +![Order Detail Positions](img/order_detail_positions.jpg) + +## Default Blocks + +The following are the default blocks provided by CoreShop: + +- **Top** + - Header +- **Left** + - Payments + - Invoices + - Shipments + - Correspondence +- **Right** + - Customer Details + - Comments +- **Bottom** + - Details + +## Creating a New Block + +To introduce a new block, you'll need to create a new Pimcore Backend Javascript File, following the +namespace `coreshop.order.order.detail.blocks`. + +### Example + +Below is a sample JavaScript code to demonstrate how to add a custom block: + +```javascript +pimcore.registerNS('coreshop.order.order.detail.blocks.custom'); +coreshop.order.order.detail.blocks.custom = Class.create(coreshop.order.order.detail.abstractBlock, { + saleInfo: null, + + initBlock: function () { + var me = this; + + me.deliveryPhone = Ext.create({ + xtype: 'panel', + style: 'display:block' + }); + + me.purchaseOrderNumber = Ext.create({ + xtype: 'panel', + style: 'display:block' + }); + + me.trackingMail = Ext.create({ + xtype: 'panel', + style: 'display:block' + }); + + me.packagingType = Ext.create({ + xtype: 'panel', + style: 'display:block' + }); + + me.packagingAmount = Ext.create({ + xtype: 'panel', + style: 'display:block' + }); + + var items = []; + + items.push({ + xtype: 'panel', + layout: 'hbox', + items: [ + { + xtype: 'panel', + flex: 1, + items: [ + me.purchaseOrderNumber, + me.deliveryPhone, + me.trackingMail + ] + }, + { + xtype: 'panel', + flex: 1, + items: [ + me.packagingType, + me.packagingAmount + ] + } + ] + }); + + this.details = Ext.create('Ext.panel.Panel', { + title: t('zeroridge_order_informations'), + margin: '0 20 20 0', + border: true, + flex: 6, + iconCls: 'coreshop_icon_order', + items: items + }); + }, + + getPriority: function () { + return 1; + }, + + getPosition: function () { + return 'left'; + }, + + getPanel: function () { + return this.details; + }, + + updateSale: function () { + var me = this; + + me.deliveryPhone.setHtml('' + t('zeroridge_delivery_phone') + ': ' + me.sale.deliveryPhone); + me.purchaseOrderNumber.setHtml('' + t('zeroridge_purchase_order_number') + ': ' + me.sale.purchaseOrderNumber); + me.trackingMail.setHtml('' + t('zeroridge_tracking_mail') + ': ' + me.sale.trackingEmail); + + if (me.sale.packagingType) { + me.packagingType.setHtml('' + t('zeroridge_packaging_type') + ': ' + me.sale.packagingType.localizedfields.data.en.name); + } else { + me.packagingType.setHtml('' + t('zeroridge_packaging_type') + ': Unknown'); + } + + me.packagingAmount.setHtml('' + t('zeroridge_packaging_amount') + ': ' + me.sale.packagingAmount); + } +}); + +``` + +In this custom block, the following methods must be implemented: + +- **initBlock**: Initializes the block upon creation. +- **getPriority**: Determines the display priority of the block. Higher values mean higher placement. +- **getPosition**: Specifies the position of the block (top, left, right, or bottom). +- **getPanel**: Returns the ExtJs Panel representing the content of the block. +- **updateSale**: Updates the block's content when the sale is refreshed + +## Customizing Order Serialization + +CoreShop uses JMS Serializer for order serialization. You can extend its serialization logic either through JMS +Configuration or by registering an event handler for the `CoreShop\Bundle\OrderBundle\Events::SALE_DETAIL_PREPARE` +event. + +If that isn't enough, you can create a Custom Controller and query that with Ext.Ajax and your own parameters. diff --git a/docs/03_Development/06_Order/14_Backend_Management/img/order_detail_positions.jpg b/docs/03_Development/06_Order/14_Backend_Management/img/order_detail_positions.jpg new file mode 100644 index 0000000000..e69c038b57 Binary files /dev/null and b/docs/03_Development/06_Order/14_Backend_Management/img/order_detail_positions.jpg differ diff --git a/docs/03_Development/06_Order/14_Backend_Management/index.md b/docs/03_Development/06_Order/14_Backend_Management/index.md new file mode 100644 index 0000000000..6efbbbfaf6 --- /dev/null +++ b/docs/03_Development/06_Order/14_Backend_Management/index.md @@ -0,0 +1,34 @@ +# Backend Management + +CoreShop's backend management is tailored to handle the complete lifecycle of orders efficiently. This comprehensive +system offers a range of features designed to manage orders from inception to completion, streamlining the entire +process for administrators and staff. + +## Key Features of Order Management + +The backend management system in CoreShop includes several critical functionalities that enhance the order processing +experience: + +- **Order List**: The Order List is a centralized area where you can view and manage all orders. It provides a clear + overview of order statuses, customer details, and other essential information. + + - **Order List Filters**: Customize your order list view with specific filters to sort and find orders based on + various criteria such as date, status, customer, etc. This feature allows for efficient order tracking and + management. + - [Learn more about Order List Filters](./01_OrderList_Filter.md) + + - **Order List Actions**: Execute actions directly from the order list, such as updating order statuses, printing + invoices, or initiating customer communication. This feature enhances the efficiency of managing orders in bulk or + individually. + - [Learn more about Order List Actions](02_OrderList_Action.md) + +- **Order Detail**: The Order Detail section provides an in-depth view of each order. It includes detailed information + about the customer, ordered items, pricing, shipping, and billing. This comprehensive view is crucial for managing + individual orders, processing returns, or addressing customer inquiries. + - [Learn more about Extending the Order Detail Page](03_Extend_OrderDetail.md) + +The backend management system in CoreShop is designed to be intuitive and user-friendly, ensuring that managing your +online store's orders is a seamless and efficient process. Whether you are processing a new order, updating order +statuses, or handling customer inquiries, CoreShop's backend management equips you with the tools you need to manage +your store effectively. + diff --git a/docs/03_Development/06_Order/15_Order_Workflow.md b/docs/03_Development/06_Order/15_Order_Workflow.md new file mode 100644 index 0000000000..3231efafdd --- /dev/null +++ b/docs/03_Development/06_Order/15_Order_Workflow.md @@ -0,0 +1,5 @@ +# Order Workflow + +CoreShop leverages the Symfony Workflow component to manage and apply various states to orders. For detailed information +about how this is implemented in CoreShop, including the state machine configuration and management, refer to the +section on [State Management](./16_State_Management/index.md). diff --git a/docs/03_Development/06_Order/16_State_Management/01_Available_Workflows.md b/docs/03_Development/06_Order/16_State_Management/01_Available_Workflows.md new file mode 100644 index 0000000000..24b6c90f7e --- /dev/null +++ b/docs/03_Development/06_Order/16_State_Management/01_Available_Workflows.md @@ -0,0 +1,217 @@ +# State Machine - Available Workflows + +## Order Sale Workflow + +In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with +workflows. + +State Machine: `coreshop_order_sales_type` + +### Available Places + +| Name | Description | +|:--------|:--------------------------------------------------------------------------| +| `cart` | Initial State - Cart | +| `order` | Once the customer finishes the checkout, pre-payment, it becomes an order | +| `quote` | Once the customer finishes the checkout and requests a quote | + +### Available Transition + +| Name | Allowed from Places | +|:--------|:--------------------| +| `order` | `cart` | +| `cart` | `cart` | +| `quote` | `cart` | + +## Order Workflow + +State Machine: `coreshop_order` +Description: The Order Workflow is the most simplest and also the most important one. + +### Available Places + +| Name | Description | +|:--------------|:------------------------------------------------------------------------------------| +| `initialized` | Initial State. Just before a order gets saved for the very first time. | +| `new` | a new order has been created | +| `confirmed` | customer has successfully placed an order | +| `cancelled` | order has been cancelled | +| `complete` | the order is complete (all payments and shipments have been successfully processed) | + +### Available Transition + +| Name | Allowed from Places | +|:-----------|:--------------------| +| `create` | `initialized` | +| `confirm` | `new` | +| `cancel` | `new`, `confirmed` | +| `complete` | `confirmed` | + +### Visualization + +![coreshop_order Workflow Visualization](img/coreshop_order.png) + +## Order Payment Workflow + +State Machine: `coreshop_order_payment` +Description: Defines the summary payment state + +### Available Places + +| Name | Description | +|:---------------------|:--------------------------------------------| +| `new` | order has been initial created | +| `awaiting_payment` | a payment has been captured | +| `partially_paid` | one of the order payments has been paid | +| `cancelled` | all payments has been cancelled | +| `paid` | all order payments successfully paid | +| `partially_refunded` | one of the order payments has been refunded | +| `refunded` | all payments has been refunded | + +### Available Transition + +| Name | Allowed from Places | +|:-------------------|:-----------------------------------------------| +| `request_payment` | `new` | +| `partially_pay` | `awaiting_payment`, `partially_paid` | +| `cancel` | `awaiting_payment` | +| `partially_refund` | `paid`, `partially_paid`, `partially_refunded` | +| `refund` | `paid`, `partially_paid`, `partially_refunded` | + +### Visualization + +![coreshop_order_payment Workflow Visualization](img/coreshop_order_payment.png) + +## Order Shipment Workflow + +State Machine: `coreshop_order_shipment` +Description: Defines the summary shipment state + +### Available Places + +| Name | Description | +|:--------------------|:--------------------------------------------| +| `new` | order has been initial created | +| `cancelled` | all shipments has been cancelled | +| `partially_shipped` | one of the order shipments has been shipped | +| `shipped` | all order shipments has been shipped | + +### Available Transition + +| Name | Allowed from Places | +|:-----------------|:---------------------------| +| `partially_ship` | `new` | +| `cancel` | `new` | +| `ship` | `new`, `partially_shipped` | + +### Visualization + +![coreshop_order_shipment Workflow Visualization](img/coreshop_order_shipment.png) + +## Order Invoice Workflow + +State Machine: `coreshop_order_invoice` +Description: Defines the summary invoice state + +### Available Places + +| Name | Description | +|:---------------------|:--------------------------------------------------| +| `new` | order has been initial created | +| `cancelled` | all invoices has been cancelled | +| `partially_invoiced` | one of the order invoices has been invoiced | +| `invoiced` | all order invoices has been successfully invoiced | + +### Available Transition + +| Name | Allowed from Places | +|:--------------------|:----------------------------| +| `cancel` | `new` | +| `partially_invoice` | `new` | +| `invoice` | `new`, `partially_invoiced` | + +### Visualization + +![coreshop_order_invoice Workflow Visualization](img/coreshop_order_invoice.png) + +## Payment Workflow + +State Machine: `coreshop_payment` +Description: Defines the single payment state + +### Available Places + +| Name | Description | +|:-------------|:-----------------------------| +| `new` | new payment has been created | +| `processing` | payment has been captured | +| `completed` | payment is complete | +| `failed` | payment has failed | +| `cancelled` | payment has been canceled | +| `refunded` | payment has been refunded | + +### Available Transition + +| Name | Allowed from Places | +|:-----------|:--------------------| +| `process` | `new` | +| `complete` | `new`, `processing` | +| `fail` | `new`, `processing` | +| `cancel` | `new`, `processing` | +| `refund` | `completed` | + +### Visualization + +![coreshop_payment Workflow Visualization](img/coreshop_payment.png) + +## Shipment Workflow + +State Machine: `coreshop_shipment` +Description: Defines the single shipment state + +### Available Places + +| Name | Description | +|:------------|:------------------------------------| +| `new` | new shipment has been created | +| `ready` | shipment has been assigned to order | +| `cancelled` | shipment has been cancelled | +| `shipped` | shipment has been shipped | + +### Available Transition + +| Name | Allowed from Places | +|:---------|:--------------------| +| `create` | `new` | +| `ship` | `ready` | +| `cancel` | `ready` | + +### Visualization + +![coreshop_shipment Workflow Visualization](img/coreshop_shipment.png) + +## Invoice Workflow + +State Machine: `coreshop_invoice` +Description: Defines the single invoice state + +### Available Places + +| Name | Description | +|:------------|:-----------------------------------| +| `new` | new invoice has been created | +| `ready` | invoice has been assigned to order | +| `cancelled` | invoice has been cancelled | +| `complete` | invoice has been completed | + +### Available Transition + +| Name | Allowed from Places | +|:-----------|:--------------------| +| `create` | `new` | +| `cancel` | `ready` | +| `complete` | `ready` | + +### Visualization + +![coreshop_invoice Workflow Visualization](img/coreshop_invoice.png) diff --git a/docs/docs/03_Development/17_State_Machine/02_Create_Callbacks.md b/docs/03_Development/06_Order/16_State_Management/02_Create_Callbacks.md similarity index 65% rename from docs/docs/03_Development/17_State_Machine/02_Create_Callbacks.md rename to docs/03_Development/06_Order/16_State_Management/02_Create_Callbacks.md index dd7b5cd87b..59b8fe97ef 100644 --- a/docs/docs/03_Development/17_State_Machine/02_Create_Callbacks.md +++ b/docs/03_Development/06_Order/16_State_Management/02_Create_Callbacks.md @@ -1,9 +1,11 @@ -# CoreShop State Machine - Callbacks +# State Machine - Callbacks It's really simple to create a custom state machine callback. ## After Callbacks -In this example we want to register a simple listener which gets triggered **after** a customer successfully placed a order: + +In this example we want to register a simple listener which gets triggered **after** a customer successfully placed a +order: ```yml core_shop_workflow: @@ -18,12 +20,12 @@ core_shop_workflow: priority: -10 # fire action early! ``` -| Name | Description | -|:-----|:------------| -| `on` | transition name | -| `do` | service and method to dispatch | -| `args` | `object` or `event`. Object type depends on state machine type. | -| `priority` | set priority. default is `0` | +| Name | Description | +|:-----------|:----------------------------------------------------------------| +| `on` | transition name | +| `do` | service and method to dispatch | +| `args` | `object` or `event`. Object type depends on state machine type. | +| `priority` | set priority. default is `0` | And your Service: @@ -54,7 +56,9 @@ final class SpecialListener ``` ## Before Callbacks -In this example we want to register a simple listener which gets triggered **before** a the shipment transaction `ready` gets applied: + +In this example we want to register a simple listener which gets triggered **before** a the shipment transaction `ready` +gets applied: ```yml core_shop_workflow: @@ -69,12 +73,12 @@ core_shop_workflow: priority: 0 ``` -| Name | Description | -|:-----|:------------| -| `on` | transition name | -| `do` | service and method to dispatch | -| `args` | `object` or `event`. Object type depends on state machine type. | -| `priority` | set priority. default is `0` | +| Name | Description | +|:-----------|:----------------------------------------------------------------| +| `on` | transition name | +| `do` | service and method to dispatch | +| `args` | `object` or `event`. Object type depends on state machine type. | +| `priority` | set priority. default is `0` | As you can see in the class below, the `checkSomething()` method throws an exception. This prevents the state machine from switching to the `ready` state. diff --git a/docs/docs/03_Development/17_State_Machine/03_Things_To_Know.md b/docs/03_Development/06_Order/16_State_Management/03_Things_To_Know.md similarity index 84% rename from docs/docs/03_Development/17_State_Machine/03_Things_To_Know.md rename to docs/03_Development/06_Order/16_State_Management/03_Things_To_Know.md index 6afcfa31fd..e74df07b59 100644 --- a/docs/docs/03_Development/17_State_Machine/03_Things_To_Know.md +++ b/docs/03_Development/06_Order/16_State_Management/03_Things_To_Know.md @@ -1,6 +1,7 @@ -# CoreShop State Machine - Important Things to Know +# State Machine - Important Things to Know ## Canceling Orders + Within the CoreShop workflow architecture a lot of orders may stay forever in the `new` or `confirmed` state. CoreShop will automatically cancel orders older than `20` days under following conditions: @@ -8,12 +9,14 @@ CoreShop will automatically cancel orders older than `20` days under following c - Order State is `initialized` or `new` or `confirmed` - Order Payment State is not `paid` -Read more about automation [here](../../02_User_Documentation/10_Automation/index.md). +Read more about automation [here](../../../02_User_Documentation/10_Automation/index.md). #### Expire Orders via Backend + There is also a `cancel` button in the order detail section. #### Expire Orders via Command + There is also a command for that: ```bash diff --git a/docs/docs/03_Development/17_State_Machine/04_Extend_Workflows.md b/docs/03_Development/06_Order/16_State_Management/04_Extend_Workflows.md similarity index 97% rename from docs/docs/03_Development/17_State_Machine/04_Extend_Workflows.md rename to docs/03_Development/06_Order/16_State_Management/04_Extend_Workflows.md index 610edf3d1a..980ee2b4e3 100644 --- a/docs/docs/03_Development/17_State_Machine/04_Extend_Workflows.md +++ b/docs/03_Development/06_Order/16_State_Management/04_Extend_Workflows.md @@ -1,11 +1,11 @@ -# CoreShop State Machine - Extend Workflows +# State Machine - Extend Workflows It's possible to extend all available CoreShop Workflow. ## Example A: Extend Shipment Workflow - ### Workflow Configuration + ```yml core_shop_workflow: state_machine: @@ -39,6 +39,7 @@ coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review' ``` ### Inform CoreShop about new Transition of Shipment Workflow + Not all transitions should be available in backend. To allow the transition to show up, you need to implement a simple event listener: @@ -71,17 +72,21 @@ class WorkflowListener ## Example B: Change default Transition Behaviour of Shipment Workflow -> **Note:** Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it! +> **Note:** Be careful while changing transitions. Test your application if a workflow still runs smoothly after +> changing it! In this example we want to change the default shipping behavior. ### Workflow before: + `ready` -> `shipped` -> `cancelled` ### Workflow after: + `ready` -> `reviewed` -> `shipped` -> `cancelled` ### Workflow Configuration + ```yml core_shop_workflow: state_machine: @@ -107,6 +112,7 @@ core_shop_workflow: ``` ### Example C: Callback Listener + If you need to implement some further business logic after the `coreshop_shipment` state has changed to `reviewed` you need to define a callback: diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_invoice.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_invoice.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_invoice.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_invoice.png diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_order.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_order.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_order.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_order.png diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_order_invoice.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_order_invoice.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_order_invoice.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_order_invoice.png diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_order_payment.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_order_payment.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_order_payment.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_order_payment.png diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_order_shipment.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_order_shipment.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_order_shipment.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_order_shipment.png diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_payment.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_payment.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_payment.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_payment.png diff --git a/docs/docs/03_Development/17_State_Machine/img/coreshop_shipment.png b/docs/03_Development/06_Order/16_State_Management/img/coreshop_shipment.png similarity index 100% rename from docs/docs/03_Development/17_State_Machine/img/coreshop_shipment.png rename to docs/03_Development/06_Order/16_State_Management/img/coreshop_shipment.png diff --git a/docs/03_Development/06_Order/16_State_Management/index.md b/docs/03_Development/06_Order/16_State_Management/index.md new file mode 100644 index 0000000000..cb636ef5cf --- /dev/null +++ b/docs/03_Development/06_Order/16_State_Management/index.md @@ -0,0 +1,44 @@ +# State Management + +CoreShop employs a sophisticated [State Machine](https://symfony.com/doc/current/workflow/state-machines.html) as a core +feature, enabling the management of complex workflows in a secure and modern manner. Unlike many eCommerce frameworks +that use a cumbersome and rigid "state/status" concept, CoreShop's approach offers a more dynamic and extendable state +workflow. + +## Places + +In the context of a State Machine, the traditional "Status" is referred to as "Places". Each workflow comes with its +predefined set of Places. + +## Transition + +Transitions are used to change the Place of a workflow. A transition is considered valid if it successfully updates the +workflow to a new place. + +## Callbacks + +Several events can be triggered for each transition, and these can be extended for specific project needs. **Example**: +When all order payments reach the `completed` place, the `coreshop_order_payment` workflow automatically transitions +to `paid`. + +## Workflows + +CoreShop includes seven implemented workflows: + +- `coreshop_order` +- `coreshop_order_payment` +- `coreshop_order_shipment` +- `coreshop_order_invoice` +- `coreshop_payment` +- `coreshop_shipment` +- `coreshop_invoice` + +These workflows are interconnected, so any transition in one can trigger transitions in others. Once a transition is +dispatched, it cannot be reversed unless such an option is defined in the available transitions. + +### Explore Further: + +- [Available Workflows](./01_Available_Workflows.md) +- [Create Callbacks](./02_Create_Callbacks.md) +- [Things to Know (!)](./03_Things_To_Know.md) +- [Extend Workflows](./04_Extend_Workflows.md) diff --git a/docs/03_Development/06_Order/17_Purchasable.md b/docs/03_Development/06_Order/17_Purchasable.md new file mode 100644 index 0000000000..20781b2e0e --- /dev/null +++ b/docs/03_Development/06_Order/17_Purchasable.md @@ -0,0 +1,46 @@ +# Order Purchasable + +For items to be added to a Cart, Order, or Quote in CoreShop, they must implement the +interface [```CoreShop\Component\Order\Model\PurchasableInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Model/PurchasableInterface.php). +This concept of Purchasable decouples CoreShop's Order Component from the Product Component, offering flexibility in the +types of objects that can be used in the Cart, Quote, or Order. + +> **Note**: A Purchasable item does not have a direct price. Instead, create a class that +> implements [```CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Calculator/PurchasablePriceCalculatorInterface.php) +> to calculate its price. + +## Implementation of a New Purchasable Price Calculator + +To implement a new custom Purchasable Price Calculator, adhere to the +interface [```CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Calculator/PurchasablePriceCalculatorInterface.php). + +### Example: ProductSetCalculator + +This example creates a `ProductSetCalculator`, which calculates prices for each product in a set: + +```php +get('coreshop.factory.carrier')->createNew(); ``` -Now you have a new Carrier, if you want to persist it, you need to do following: +After creating a new Carrier instance, persist it using: ```php $container->get('coreshop.manager.carrier')->persist($newCarrier); $container->get('coreshop.manager.carrier')->flush(); ``` -You now have a new persisted Carrier. +You now have a newly persisted Carrier. ## Read -If you want to query for Carriers, you can do following: +To query for carriers: ```php $carrierRepository = $container->get('coreshop.repository.carrier'); - $queryBuilder = $carrierRepository->createQueryBuilder('c'); - -// You can now create your query - -// And get the result - +// Create your query +// Get the result $carriers = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing Carrier, you need to do following: +To update an existing carrier: ```php // Fetch Carrier - $carrier = $carrierRepository->findById(1); -$carrier->setName('Euro'); - -// And Persist it +$carrier->setName('DHL'); +// Persist changes $container->get('coreshop.manager.carrier')->persist($carrier); $container->get('coreshop.manager.carrier')->flush(); ``` ## Delete -If you want to update and existing Carrier, you need to do following: + +To delete an existing carrier: ```php // Fetch Carrier - $carrier = $carrierRepository->findById(1); - -// And Persist it +// Remove Carrier $container->get('coreshop.manager.carrier')->remove($carrier); $container->get('coreshop.manager.carrier')->flush(); -``` \ No newline at end of file +``` diff --git a/docs/03_Development/07_Shipping/01_Carrier/02_Carrier_Discovery.md b/docs/03_Development/07_Shipping/01_Carrier/02_Carrier_Discovery.md new file mode 100644 index 0000000000..3881a5cfd3 --- /dev/null +++ b/docs/03_Development/07_Shipping/01_Carrier/02_Carrier_Discovery.md @@ -0,0 +1,14 @@ +# Carrier Discovery + +In CoreShop, carrier discovery for a given shippable item is facilitated through a specialized service. This service is +responsible for identifying the available carriers that can handle the shipping of a specific item. + +## Service Implementation + +The carrier discovery service implements the +interface `CoreShop\Bundle\ShippingBundle\Discover\ShippableCarriersDiscoveryInterface`. This interface is crucial for +determining suitable carriers based on the characteristics and requirements of the shippable item. + +The service implementing this interface is registered with the service ID `coreshop.carrier.discovery`. It plays a +pivotal role in the shipping process, ensuring that each shippable item is matched with appropriate and available +shipping options. diff --git a/docs/03_Development/07_Shipping/01_Carrier/03_Price_Calculation.md b/docs/03_Development/07_Shipping/01_Carrier/03_Price_Calculation.md new file mode 100644 index 0000000000..4cb67717b1 --- /dev/null +++ b/docs/03_Development/07_Shipping/01_Carrier/03_Price_Calculation.md @@ -0,0 +1,22 @@ +# Carrier Price Calculation + +In CoreShop, the calculation of shipping prices for various carriers involves multiple methods. These methods are +crucial for determining the appropriate shipping cost for a carrier based on the specifics of a given cart. + +## Calculator Implementation + +To calculate shipping prices, a Calculator must implement the +interface `CoreShop\Component\Shipping\Calculator\CarrierPriceCalculatorInterface`. This interface defines the necessary +functionality for calculating shipping costs. + +Calculators should be registered in the container with the tag `coreshop.shipping.price_calculator`, and should include +a `type` attribute and a `priority`. This registration process ensures that CoreShop recognizes and utilizes the +calculator correctly during the shipping price calculation process. + +## Default Implementation + +The default implementation for carrier price calculation in CoreShop is based +on [Shipping Rules](../02_Shipping_Rules/index.md). This method takes into account various rules defined for shipping, +which can include factors like the weight of the cart, the destination, and other relevant criteria. By using these +rules, CoreShop can accurately calculate the shipping price for different carriers, ensuring a fair and consistent +approach to shipping costs. diff --git a/docs/03_Development/07_Shipping/01_Carrier/index.md b/docs/03_Development/07_Shipping/01_Carrier/index.md new file mode 100644 index 0000000000..746df0cfaa --- /dev/null +++ b/docs/03_Development/07_Shipping/01_Carrier/index.md @@ -0,0 +1,22 @@ +# Carriers + +Effective management of carriers is a vital component of any eCommerce operation. CoreShop offers a robust and flexible +system for handling carriers, encompassing everything from the creation of new carrier records to complex calculations +for shipping costs. This guide is designed to walk you through the various functionalities and features related to +carriers in CoreShop. + +## Key Areas of Carrier Management + +The following sections provide detailed insights and instructions on different aspects of managing carriers: + +- **[Create, Read, Update, Delete (CRUD)](./01_CRUD.md)**: This section covers the basic operations for carrier + management, including how to create new carriers, read their details, update their information, and delete them when + necessary. + +- **[Carrier Discovery](./02_Carrier_Discovery.md)**: Discover how CoreShop identifies and selects appropriate carriers + for different shipping requirements. This process is crucial for ensuring that each order is matched with the most + suitable carrier, based on factors like destination, size, and weight. + +- **[Price Calculation](./03_Price_Calculation.md)**: Learn about the methods and algorithms used to calculate shipping + costs for different carriers. This section delves into the complexities of shipping price calculation, ensuring that + costs are accurately and fairly determined. diff --git a/docs/03_Development/07_Shipping/02_Shipping_Rules/index.md b/docs/03_Development/07_Shipping/02_Shipping_Rules/index.md new file mode 100644 index 0000000000..35abaca6c7 --- /dev/null +++ b/docs/03_Development/07_Shipping/02_Shipping_Rules/index.md @@ -0,0 +1,46 @@ +# Shipping Rules + +CoreShop provides a robust set of default conditions and actions for shipping rules, enabling you to tailor the shipping +process according to various criteria and actions. Additionally, CoreShop allows for the extension of these rules +through custom actions and conditions. + +## Default Conditions and Actions + +### Default Conditions + +CoreShop includes a variety of predefined conditions for shipping rules: + +- **Currencies**: Rules based on currency type. +- **Customer Groups**: Rules targeting specific customer groups. +- **Customers**: Rules applicable to individual customers. +- **Stores**: Rules for specific store locations. +- **Zones**: Rules pertaining to geographical zones. +- **Amount**: Rules based on the amount in the cart. +- **Categories**: Rules for specific product categories. +- **Countries**: Rules for shipments to specific countries. +- **Dimension**: Rules based on the dimensions of the products. +- **Post Codes**: Rules for specific postal code areas. +- **Products**: Rules applicable to individual products. +- **Shipping Rule**: Rules that trigger based on other shipping rules. +- **Weight**: Rules based on the weight of the cart items. +- **Nested**: Complex rules combining multiple conditions. + +### Default Actions + +The default actions included in CoreShop are: + +- **Addition Amount**: Add a fixed amount to the shipping cost. +- **Addition Percent**: Add a percentage to the shipping cost. +- **Discount Amount**: Apply a discount amount to the shipping cost. +- **Discount Percent**: Apply a discount percentage to the shipping cost. +- **Price**: Set a fixed price for shipping. +- **Shipping Rule**: Trigger other shipping rules. + +## Extending Conditions and Actions + +CoreShop also provides options to extend these default rules with custom conditions and actions: + +- **Custom Actions + **: [Learn how to add custom actions to your shipping rules](../../01_Extending_Guide/04_Extending_Rule_Actions.md). +- **Custom Conditions + **: [Discover how to create custom conditions for more tailored shipping rules](../../01_Extending_Guide/05_Extending_Rule_Conditions.md). diff --git a/docs/03_Development/07_Shipping/index.md b/docs/03_Development/07_Shipping/index.md new file mode 100644 index 0000000000..6f518cc3d4 --- /dev/null +++ b/docs/03_Development/07_Shipping/index.md @@ -0,0 +1,22 @@ +# Shipping + +Efficient and accurate shipping management is a critical component of any eCommerce operation. In CoreShop, shipping and +shipping calculation are handled through a well-structured and flexible system, designed to cater to a wide range of +shipping scenarios and requirements. + +This guide is intended to walk you through the various aspects of shipping within the CoreShop framework, from the +management of carriers to the application and customization of shipping rules. Whether you're setting up shipping for +the first time or looking to refine your shipping strategies, this guide provides the necessary insights and +instructions. + +## Key Components of Shipping Management + +Here are the main areas covered in this guide: + +- **[Carriers](./01_Carrier/index.md)**: Discover how CoreShop manages carriers, including the creation, configuration, + and management of different carriers. Learn about the various features and options available for handling + carrier-related aspects of shipping. + +- **[Shipping Rules](./02_Shipping_Rules/index.md)**: Explore the world of shipping rules in CoreShop. This section + delves into how you can define and apply shipping rules, which are essential for calculating shipping costs and + determining shipping logistics based on various criteria such as destination, weight, and product type. diff --git a/docs/03_Development/08_Index_and_Filters/01_Index/01_Interpreter.md b/docs/03_Development/08_Index_and_Filters/01_Index/01_Interpreter.md new file mode 100644 index 0000000000..f2ac2b33f4 --- /dev/null +++ b/docs/03_Development/08_Index_and_Filters/01_Index/01_Interpreter.md @@ -0,0 +1,80 @@ +# Index Interpreter + +In CoreShop, Index Interpreters are used to prepare and transform data for the product index. You can utilize existing +interpreters or create custom ones to fit your specific needs. + +## Existing CoreShop Interpreters + +CoreShop comes equipped with several built-in interpreters: + +- **Object**: Converts an object or an object array to relations and saves the values to the relations index. +- **ObjectId**: Transforms an object into its ID. +- **ObjectIdSum**: Calculates the sum of all IDs, which can be useful for similar products. +- **ObjectProperty**: Calls a getter method on the value. +- **Soundex**: Applies the PHP `soundex` function, useful for finding similar products. + +## Creating a Custom Interpreter + +To create a custom interpreter, you'll need to develop two key components: + +### 1. FormType for Input Data + +Create a FormType class to handle the input data for your interpreter: + +```php +namespace AppBundle\Index\Form\Type; + +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Validator\Constraints\NotBlank; +use Symfony\Component\Validator\Constraints\Type; + +final class MyInterpreterType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + .add('myInterpreterData', IntegerType::class, [ + 'constraints' => [ + new NotBlank(['groups' => ['coreshop']]), + new Type(['type' => 'numeric', 'groups' => ['coreshop']]), + ], + ]); + } +} +``` + +### 2. Interpreter Interface Implementation + +Implement the `InterpreterInterface` to define how your interpreter processes data: + +```php +namespace AppBundle\CoreShop\Index\Interpreter; + +use CoreShop\Component\Index\Interpreter\InterpreterInterface; + +class MyInterpreter implements InterpreterInterface +{ + public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) + { + // Interpretation logic goes here + return $value; + } +} + +``` + +### 3. Registering the Custom Interpreter + +Register your new interpreter as a service with the tag `coreshop.index.interpreter`, specifying its type and form: + +```yaml +app.index.interpreter.my_interpreter: + class: AppBundle\CoreShop\Index\Interpreter\MyInterpreter + tags: + - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\Index\Form\Type\MyInterpreterType } +``` + +With these steps, you can enhance the indexing process in CoreShop with custom logic, tailored to your specific +requirements. \ No newline at end of file diff --git a/docs/03_Development/08_Index_and_Filters/01_Index/02_Extension.md b/docs/03_Development/08_Index_and_Filters/01_Index/02_Extension.md new file mode 100644 index 0000000000..74d2273f1c --- /dev/null +++ b/docs/03_Development/08_Index_and_Filters/01_Index/02_Extension.md @@ -0,0 +1,113 @@ +# Index Extension + +To enhance the flexibility and functionality of the product index in CoreShop, you can create extensions. These +extensions allow for additional customization and optimization of the indexing process. + +## Capabilities of Extensions + +Extensions enable you to: + +- Add additional "default" columns and their corresponding data to the index. +- Apply pre-filters to a MySQL index for more refined data retrieval. + +## Implementing Extensions + +To create an extension, implement one of the following interfaces depending on your needs: + +- **Column Extensions**: Implement + the [`CoreShop\Component\Index\Extension\IndexColumnsExtensionInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Index/Extension/IndexColumnsExtensionInterface.php) + if you want to add new columns to the index. +- **MySQL Query Extensions**: For extending MySQL query capabilities, use + the [`CoreShop\Bundle\IndexBundle\Extension\MysqlIndexQueryExtensionInterface`](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/IndexBundle/Extension/MysqlIndexQueryExtensionInterface.php). + +After implementing the appropriate interface, register your service with the tag `coreshop.index.extension`. + +### Example of Creating an Extension + +Here's a brief example to illustrate how you might implement and register an index extension: + +```php +productClassName === $index->getClass(); + } + + public function getSystemColumns(): array + { + return [ + 'categoryIds' => IndexColumnInterface::FIELD_TYPE_STRING, + 'parentCategoryIds' => IndexColumnInterface::FIELD_TYPE_STRING, + 'stores' => IndexColumnInterface::FIELD_TYPE_STRING, + ]; + } + + public function getLocalizedSystemColumns(): array + { + return []; + } + + public function getIndexColumns(IndexableInterface $indexable): array + { + if ($indexable instanceof ProductInterface) { + $categoryIds = []; + $parentCategoryIds = []; + + $categories = $indexable->getCategories(); + $categories = is_array($categories) ? $categories : []; + + foreach ($categories as $c) { + if ($c instanceof CategoryInterface) { + $categoryIds[$c->getId()] = $c->getId(); + + $parents = $c->getHierarchy(); + + foreach ($parents as $p) { + $parentCategoryIds[] = $p->getId(); + } + } + } + + return [ + 'categoryIds' => ',' . implode(',', $categoryIds) . ',', + 'parentCategoryIds' => ',' . implode(',', $parentCategoryIds) . ',', + 'stores' => ',' . @implode(',', $indexable->getStores()) . ',', + ]; + } + + return []; + } +} +``` + +And then register the extension in your service configuration: + +```yaml +services: + app.index.extension.my_custom_extension: + class: AppBundle\Index\Extension\MyCustomExtension + tags: + - { name: coreshop.index.extension } +``` + +With these extensions, you can significantly enhance the capabilities of your product index, making it more adaptable to +your specific eCommerce needs. \ No newline at end of file diff --git a/docs/docs/03_Development/08_Index_and_Filters/01_Index/img/field.png b/docs/03_Development/08_Index_and_Filters/01_Index/img/field.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/01_Index/img/field.png rename to docs/03_Development/08_Index_and_Filters/01_Index/img/field.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/01_Index/img/fields.png b/docs/03_Development/08_Index_and_Filters/01_Index/img/fields.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/01_Index/img/fields.png rename to docs/03_Development/08_Index_and_Filters/01_Index/img/fields.png diff --git a/docs/03_Development/08_Index_and_Filters/01_Index/index.md b/docs/03_Development/08_Index_and_Filters/01_Index/index.md new file mode 100644 index 0000000000..2326c9edde --- /dev/null +++ b/docs/03_Development/08_Index_and_Filters/01_Index/index.md @@ -0,0 +1,58 @@ +# Index for Layered Navigation + +Creating an effective layered navigation (faceted navigation) in CoreShop requires setting up an index of your products. +This index plays a crucial role in enhancing search and filter capabilities within your product catalog. + +## Create a New Index + +CoreShop currently supports the following types of indexes: + +- **MySQL**: Utilizes a MySQL database for indexing. +- ~~Elasticsearch~~: Currently not supported. + +### Adding Fields to the Index + +To add new fields to the index: + +1. Simply drag and drop the field from the left tree into the right tree. + +![Index Fields](img/fields.png) + +### Field Properties + +Each field in the index requires certain properties to be configured: + +![Field](img/field.png) + +| Field | Description | +|------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Key | The Pimcore field name. | +| Name | The name of the field in the index. | +| Getter Class | Important for field-types like "Localized Fields", "Classification Store", "Object Brick", and "Field Collection". Used to retrieve the correct value for the index. | +| [Interpreter](./01_Interpreter.md) | Transforms values before they are stored in the index, e.g., resolving dependencies or creating a similarity index. | +| Type | The field type in the index, depending on the index type | +| Getter Config | Configuration options for the Getter, such as language for Localized Fields. | + +## Re-Indexing Products + +After modifying the index, it's necessary to re-index your products using a CLI command: + +```bash +$ php bin/console coreshop:index +``` + +For selective re-indexing, specify IDs or names of the indices as arguments. For example, to re-index only indices with +IDs 1 and 2 and the index named "Products": + +```bash +php bin/console coreshop:index 1 2 Products +``` + +## Messenger + +Remember to process the queue coreshop_index to automatically index your products when they are saved. This ensures that +your product index remains up-to-date with all the latest changes. + +```bash +bin/console messenger:consume coreshop_index +``` \ No newline at end of file diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/01_Custom_Filter.md b/docs/03_Development/08_Index_and_Filters/02_Filter/01_Custom_Filter.md similarity index 92% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/01_Custom_Filter.md rename to docs/03_Development/08_Index_and_Filters/02_Filter/01_Custom_Filter.md index 322a275ada..f4ad76b7e2 100644 --- a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/01_Custom_Filter.md +++ b/docs/03_Development/08_Index_and_Filters/02_Filter/01_Custom_Filter.md @@ -1,8 +1,9 @@ -# CoreShop Filter - Create Custom Filter +# Filter - Create Custom Filter **1**. We need to create 2 new files: - - FormType for processing the Input Data - - And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition. + +- FormType for processing the Input Data +- And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition. ```php namespace AppBundle\Filter\Form\Type\Condition; diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-category.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-category.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-category.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-category.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-boolean.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-boolean.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-boolean.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-boolean.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-multiselect.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-multiselect.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-multiselect.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-multiselect.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-range.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-range.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-range.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-range.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-select.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-select.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-select.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-condition-select.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-conditions.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-conditions.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-conditions.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-conditions.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-preconditions.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-preconditions.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-preconditions.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-preconditions.png diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-settings.png b/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-settings.png similarity index 100% rename from docs/docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-settings.png rename to docs/03_Development/08_Index_and_Filters/02_Filter/img/filter-settings.png diff --git a/docs/03_Development/08_Index_and_Filters/02_Filter/index.md b/docs/03_Development/08_Index_and_Filters/02_Filter/index.md new file mode 100644 index 0000000000..b3a0264d8d --- /dev/null +++ b/docs/03_Development/08_Index_and_Filters/02_Filter/index.md @@ -0,0 +1,71 @@ +# Filter Configuration + +After setting up the product index, the next step is to configure filters. These filters enhance the user experience by +enabling customers to easily find products based on various criteria. + +## Creating a New Filter + +Filters can be tailored for different categories in your store. Each filter comprises settings, pre-conditions, specific +filters, and options for similar products. Custom filters can also be created as detailed +in [Custom Filters](01_Custom_Filter.md). + +### Filter Settings + +Configure the basic settings of your filter: + +![Filter Settings](./img/filter-settings.png) + +| Field | Description | +|------------------|----------------------------------------------------------------------------------------------------| +| Name | The name of the filter set. | +| Index | The index to be used for filtering. | +| Order | The default order in which products are displayed. | +| Order Key | The index field used for sorting products. | +| Results per Page | Number of products displayed per page. This can be set using shop settings or overridden manually. | + +### Pre-Conditions + +Define pre-filters for the index: + +![Filter Pre-Conditions](./img/filter-preconditions.png) + +These pre-filters refine the initial dataset before any user-driven filtering. + +### Conditions + +Set up various filters that will be available to customers: + +![Filter Conditions](./img/filter-conditions.png) + +CoreShop supports four main types of filters: + +#### Select Condition + +- **Description**: A dropdown field allowing the selection of a single option. +- **Example**: + + ![Filter Condition Select](./img/filter-condition-select.png) + +#### Multiselect Condition + +- **Description**: A list where multiple options can be selected. +- **Example**: + + ![Filter Condition Multiselect](./img/filter-condition-multiselect.png) + +#### Range Condition + +- **Description**: A slider representing a range, with automatic calculation of MIN and MAX values. +- **Example**: + + ![Filter Condition Range](./img/filter-condition-range.png) + +#### Boolean Condition + +- **Description**: A set of checkboxes for selecting various boolean (true/false) options. +- **Example**: + + ![Filter Condition Boolean](./img/filter-condition-boolean.png) + +With these filter configurations, customers can easily navigate and discover products in your store, enhancing their +shopping experience. diff --git a/docs/03_Development/08_Index_and_Filters/index.md b/docs/03_Development/08_Index_and_Filters/index.md new file mode 100644 index 0000000000..27fe52bfd9 --- /dev/null +++ b/docs/03_Development/08_Index_and_Filters/index.md @@ -0,0 +1,20 @@ +# Index and Filter + +In CoreShop, managing indices and filters is essential for creating an efficient and user-friendly shopping experience. +Indices enable the organization and retrieval of product data effectively, while filters allow customers to navigate +through your product catalog seamlessly based on specific criteria. + +This guide is designed to provide you with a comprehensive understanding of how CoreShop handles indices and filters, +from setting them up to customizing them to meet your eCommerce platform's needs. + +## Exploring Indices and Filters + +The guide is divided into two main sections: + +1. **[Indices](./01_Index/index.md)**: Learn about the creation and management of product indices in CoreShop. This + section covers how indices are structured, how they can be customized, and their role in enhancing the product search + and retrieval process. + +2. **[Filters](./02_Filter/index.md)**: Dive into the world of filters, which are integral to providing customers with a + streamlined shopping experience. This section explains how to set up different types of filters, such as select, + multiselect, range, and boolean, and how they can be used to refine product searches on your eCommerce platform. diff --git a/docs/03_Development/09_Notification_Rules/01_Custom_Actions.md b/docs/03_Development/09_Notification_Rules/01_Custom_Actions.md new file mode 100644 index 0000000000..e034cf2561 --- /dev/null +++ b/docs/03_Development/09_Notification_Rules/01_Custom_Actions.md @@ -0,0 +1,13 @@ +# Notification Rule Custom Actions + +CoreShop supports the integration of custom actions into its notification system, offering enhanced flexibility and the +ability to tailor notifications to specific operational needs. + +## Implementing Custom Actions + +For comprehensive instructions on how to develop and integrate custom actions into CoreShop's notification rules, please +refer to the following guide: + +- **[Adding Custom Actions to Notification Rules](../01_Extending_Guide/04_Extending_Rule_Actions.md)**: This document + provides detailed steps and insights on creating custom actions, enabling you to customize how notifications are + processed and dispatched within CoreShop. diff --git a/docs/03_Development/09_Notification_Rules/02_Custom_Conditions.md b/docs/03_Development/09_Notification_Rules/02_Custom_Conditions.md new file mode 100644 index 0000000000..5e1fad6ad3 --- /dev/null +++ b/docs/03_Development/09_Notification_Rules/02_Custom_Conditions.md @@ -0,0 +1,14 @@ +# Notification Rule Custom Conditions + +CoreShop's notification system is designed to be flexible and extendable, allowing you to introduce custom conditions to +tailor the notification rules to your specific business requirements. + +## Adding Custom Conditions + +For detailed guidance on how to add custom conditions to your notification rules in CoreShop, refer to the following +resource: + +- **[Adding Custom Conditions to Notification Rules](../01_Extending_Guide/05_Extending_Rule_Conditions.md)**: This + document provides a step-by-step approach to creating and integrating custom conditions into the CoreShop notification + framework. + diff --git a/docs/03_Development/09_Notification_Rules/03_Custom_Types.md b/docs/03_Development/09_Notification_Rules/03_Custom_Types.md new file mode 100644 index 0000000000..c18862c537 --- /dev/null +++ b/docs/03_Development/09_Notification_Rules/03_Custom_Types.md @@ -0,0 +1,22 @@ +# Notification Rule Custom Type + +In CoreShop, creating custom notification types is facilitated by dynamically registering them using tag attributes on +conditions and actions. This flexibility allows you to customize and extend the notification system to meet specific +requirements. + +## Implementing a Custom Notification Type + +To introduce a custom notification type, you can add a new condition or action and specify your unique type. This is +achieved by defining a service in your YAML configuration and assigning the appropriate tags. + +### Example: Defining a Custom Notification Condition Service + +Here's an example of defining a service for a custom notification condition: + +```yaml +services: +app.coreshop.notification_rule.condition.order.custom_notification_condition: + class: AppBundle\CoreShop\Notification\CustomNotificationCondition + tags: + - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\Form\Type\CoreShop\CustomConditionType } +``` diff --git a/docs/03_Development/09_Notification_Rules/04_Triggering.md b/docs/03_Development/09_Notification_Rules/04_Triggering.md new file mode 100644 index 0000000000..066a9e0175 --- /dev/null +++ b/docs/03_Development/09_Notification_Rules/04_Triggering.md @@ -0,0 +1,33 @@ +# Triggering Notification Events + +Triggering notification events in CoreShop is streamlined through the use of +the `CoreShop\Component\Notification\Processor\RulesProcessorInterface`, implemented by the +service `@coreshop.notification_rule.processor`. This processor is key to activating various notification types based on +specific events. + +## Example: Triggering an Order Event + +Consider an example where you need to trigger a notification for an order event. You'll need to provide relevant +parameters that align with the notification type. Here’s how to trigger such an event for an order: + +```php +$this->rulesProcessor->applyRules('order', $event->getProposal(), [ +'fromState' => $event->getMarking()->getPlaces(), +'toState' => $event->getTransition()->getTos(), +'_locale' => $order->getLocaleCode(), +'recipient' => $customer->getEmail(), +'firstname' => $customer->getFirstname(), +'lastname' => $customer->getLastname(), +'orderNumber' => $order->getOrderNumber(), +'transition' => $event->getTransition()->getName(), +]); +``` + +In this code snippet, the `applyRules` method of `RulesProcessorInterface` is called with the order event type and +associated parameters like state transitions, locale, customer details, and the order number. + +### CoreShop's Notification Handling + +Once the event is triggered with these parameters, CoreShop's notification system processes it according to the defined +rules. This ensures the appropriate notifications are dispatched, maintaining effective communication and operational +efficiency. diff --git a/docs/03_Development/09_Notification_Rules/index.md b/docs/03_Development/09_Notification_Rules/index.md new file mode 100644 index 0000000000..4814196483 --- /dev/null +++ b/docs/03_Development/09_Notification_Rules/index.md @@ -0,0 +1,74 @@ +# Notification Rules + +In CoreShop, Notification Rules are pivotal for managing various types of notifications triggered within the system. +These rules cater to a range of scenarios, ensuring that the right notifications are dispatched under specific +conditions. + +## Overview of Notification Types + +CoreShop handles notifications for the following types: + +- **Order** +- **Quote** +- **Invoice** +- **Shipment** +- **User** +- **Payment** + +Let's explore each notification type and their respective conditions and actions: + +### Order Notifications + +#### Allowed Conditions + +| Name | Description | +|---------------------|------------------------------------------------------------------------------------| +| Invoice State | Triggered if a specific Invoice State is active. | +| Invoice Transition | Triggered if a specific Invoice Transition has been applied. | +| Payment State | Triggered if a specific Payment State is active. | +| Payment Transition | Triggered if a specific Payment Transition has been applied. | +| Shipping State | Triggered if a specific Shipping State is active. | +| Shipping Transition | Triggered if a specific Shipping Transition has been applied. | +| Order State | Triggered if a specific Order State is active. | +| Order Transition | Triggered if a specific Order Transition has been applied. | +| Carriers | Triggered if a specific Carrier has been selected in the Order. | +| Comment | Triggered if a Comment Action has been applied. Available Types: `create comment`. | + +#### Allowed Actions + +| Name | Description | +|-------------|--------------------------------------------------| +| Order Email | Email notification with Order Object. | +| Email | General Email notification without Order Object. | + +#### Available Placeholder Keys for Email Templates + +| Key | Value | +|-------------|-------------------------------------------| +| object | Object of type `OrderInterface`. | +| fromState | State identifier transitioning away from. | +| toState | State identifier transitioning to. | +| transition | Used transition. | +| _locale | Used locale. | +| recipient | Customer Email Address. | +| firstname | Customer Firstname. | +| lastname | Customer Lastname. | +| orderNumber | Order Number. | + +### (And similar sections for Shipment, Invoice, Payment, User, and Quote) + +## Custom Implementation + +For bespoke notification scenarios, custom implementation of notification rules is possible. Learn more about this +in [Custom Notification Types](./03_Custom_Types.md). + +## Extending CoreShop Notification Rules + +CoreShop also allows for the extension and customization of notification rules: + +- **[Custom Actions](./01_Custom_Actions.md)**: Learn how to create custom actions for your notifications. +- **[Custom Conditions](./02_Custom_Conditions.md)**: Discover how to implement custom conditions for more tailored + notifications. +- **[Custom Types](./03_Custom_Types.md)**: Explore how to set up custom notification types for specialized scenarios. +- **[Triggering Notifications](./04_Triggering.md)**: Understand the mechanisms behind triggering notifications in + CoreShop. diff --git a/docs/03_Development/10_Payment/01_Payment_Provider.md b/docs/03_Development/10_Payment/01_Payment_Provider.md new file mode 100644 index 0000000000..8b7e7be05d --- /dev/null +++ b/docs/03_Development/10_Payment/01_Payment_Provider.md @@ -0,0 +1,89 @@ +# Payment Providers + +A Payment Provider in CoreShop represents a method your customer uses to pay during the checkout process. It links to a +specific gateway with custom configurations. Each payment method is configured separately using the payment method form +in the admin panel. + +## Payment Gateway Configuration + +### Payment Gateways with CoreShop Bridges + +To configure a payment gateway that already has a CoreShop bridge: + +1. **Create a Configuration Form Type**: Look at the existing configuration form types for gateways like Paypal and + Sofort for reference. + +2. **Register the Configuration Form Type**: Use the `coreshop.gateway_configuration_type` tag to make the gateway + available in the admin panel's dropdown. + + > For guidance on configuration form types, refer to the [Payum documentation](https://github.com/Payum/Payum). + +### Integrating Other Payment Gateways + +To learn more about integrating other payment gateways, consult the [Payum docs](https://github.com/Payum/Payum). + +You may also need to add configuration in `app/config/config.yml` for the gateway’s factory: + +```yaml +payum: + gateways: + yourgateway: + factory: yourgateway +``` + +Example: Adding Sofort as a Payment Gateway Factory + +To add Sofort as a new gateway configuration, create the following files: + +1. **Form Type for Configuration Values**: + + ```php + namespace AppBundle\CoreShop\Form\Type; + + use Symfony\Component\Form\AbstractType; + // ... other use statements ... + + final class SofortGatewayConfigurationType extends AbstractType + { + public function buildForm(FormBuilderInterface $builder, array $options) + { + // Form build logic... + } + } + ``` + +Then, register the FormType in the service container: + +```yaml +services: + app.coreshop.form.type.gateway_configuration.sofort: + class: AppBundle\Form\Type\SofortGatewayConfigurationType + tags: + - { name: coreshop.gateway_configuration_type, type: sofort } + - { name: form.type } +``` + +2. **ExtJs Form for Sofort**: + + Create a JavaScript file for the ExtJs Form: + + ```js +pimcore.registerNS('coreshop.provider.gateways.sofort'); +coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, { + getLayout: function (config) { + // Form layout logic... + } +}); + ``` + +Register the new JavaScript file: + +```yaml +core_shop_payment: + pimcore_admin: + js: + sofort_gateway: '/bundles/app/pimcore/js/sofort.js' +``` + +After reloading Pimcore, you should see the new Factory available. + diff --git a/docs/03_Development/10_Payment/03_Payum_Providers.md b/docs/03_Development/10_Payment/03_Payum_Providers.md new file mode 100644 index 0000000000..c28e35d1d2 --- /dev/null +++ b/docs/03_Development/10_Payment/03_Payum_Providers.md @@ -0,0 +1,13 @@ +# Payum Providers + +CoreShop utilizes Payum, a versatile payment abstraction library, to support a wide range of payment providers. Payum +offers integration with various payment gateways, enhancing the flexibility and options available for payment processing +in CoreShop. + +## List of Supported Payum Payment Providers + +You can find a comprehensive list of all the payment providers supported by Payum at the following link: + +- **[Supported Payum Payment Providers](https://github.com/Payum/Payum/blob/master/docs/supported-gateways.md)**: This + resource details each payment provider compatible with Payum, offering a broad selection to meet diverse payment + processing needs. diff --git a/docs/03_Development/10_Payment/index.md b/docs/03_Development/10_Payment/index.md new file mode 100644 index 0000000000..a5fbe9f8e7 --- /dev/null +++ b/docs/03_Development/10_Payment/index.md @@ -0,0 +1,42 @@ +# Payment + +CoreShop features a highly flexible payment management system, supporting a wide range of gateways (payment providers). +It utilizes [Payum](https://github.com/payum/payum), a payment abstraction library, to handle various aspects of payment +processing, including capturing, refunding, and recurring payments. + +## Available Payment Gateways for CoreShop + +CoreShop supports several payment gateways, each with its own set of features and capabilities: + +| Name | State | Link | Support | Offsite | Supports Server-Notification | Supports Refund | +|-----------------|--------|--------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|---------|------------------------------|-----------------| +| **Heidelpay** | stable | [Github](https://github.com/coreshop/PayumHeidelpayBundle) | PayPal, Klarna Sofort, Credit Card | No | Yes | No | +| **SaferPay** | stable | [Github](https://github.com/coreshop/PayumSaferpayBundle) | [Supported Payment Methods](https://saferpay.github.io/sndbx/index.html#paymentmethods) | Yes | Yes | Partially | +| **PostFinance** | stable | [Github](https://github.com/coreshop/PayumPostFinanceBundle) | PostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINT | Yes | Yes | No | +| **PowerPay** | dev | [Github](https://github.com/coreshop/PayumPowerpayBundle) | invoice, automatic credit check | No | No (not required) | No | +| **CuraBill** | dev | [Github](https://github.com/coreshop/PayumCurabillBundle) | invoice, instalments via iframe | No | No (not required) | No | + +## Payment Model + +Each payment in CoreShop, whether successful or failed, is represented by a payment model. This model contains essential +information and a reference to the relevant order. + +## Creating a Payment Programmatically + +To create a new payment method programmatically, use a factory and assign a unique code: + +```php +$payment = $this->container->get('coreshop.factory.payment')->createNew(); + +$payment->setOrder($order); +$payment->setCurrencyCode('EUR'); + +$this->container->get('coreshop.repository.payment')->add($payment); +``` + +## Additional Resources + +For more information on payment integration and management in CoreShop: + +- **[Payment Provider](./01_Payment_Provider.md)** +- **[Payum Providers](./03_Payum_Providers.md)** diff --git a/docs/docs/03_Development/11_Stores/01_CRUD.md b/docs/03_Development/11_Stores/01_CRUD.md similarity index 60% rename from docs/docs/03_Development/11_Stores/01_CRUD.md rename to docs/03_Development/11_Stores/01_CRUD.md index 352535f9a5..fa3d73a384 100644 --- a/docs/docs/03_Development/11_Stores/01_CRUD.md +++ b/docs/03_Development/11_Stores/01_CRUD.md @@ -1,62 +1,59 @@ -# CoreShop Stores +# Stores + +CoreShop provides a straightforward API for managing stores within its system, allowing for the creation, reading, +updating, and deletion of store entities. ## Create -If you want to create a Store via API, you can do following: + +To create a new Store via API: ```php $newStore = $container->get('coreshop.factory.store')->createNew(); ``` -Now you have a new Store, if you want to persist it, you need to do following: +Once you have instantiated a new Store, persist it as follows: ```php $container->get('coreshop.manager.store')->persist($newStore); $container->get('coreshop.manager.store')->flush(); ``` -You now have a new persisted Store. +You now have a newly persisted Store in your system. ## Read -If you want to query for Stores, you can do following: +To query for existing Stores: ```php $storeRepository = $container->get('coreshop.repository.store'); - $queryBuilder = $storeRepository->createQueryBuilder('c'); - -// You can now create your query - -// And get the result - +// Create your query +// Retrieve the result $stores = $queryBuilder->getQuery()->getResult(); - ``` ## Update -If you want to update and existing Store, you need to do following: +To update an existing Store: ```php -// Fetch Store - +// Fetch the Store $store = $storeRepository->findById(1); $store->setName('Euro'); - -// And Persist it +// Persist changes $container->get('coreshop.manager.store')->persist($store); $container->get('coreshop.manager.store')->flush(); ``` ## Delete -If you want to update and existing Store, you need to do following: -```php -// Fetch Store +To delete an existing Store: +```php +// Fetch the Store $store = $storeRepository->findById(1); - -// And Persist it +// Remove the Store $container->get('coreshop.manager.store')->remove($store); $container->get('coreshop.manager.store')->flush(); -``` \ No newline at end of file +``` + diff --git a/docs/03_Development/11_Stores/02_Context.md b/docs/03_Development/11_Stores/02_Context.md new file mode 100644 index 0000000000..be4adecf3b --- /dev/null +++ b/docs/03_Development/11_Stores/02_Context.md @@ -0,0 +1,166 @@ +# Store Context + +For CoreShop to determine the current store the visitor or customer comes from +it uses a concept called context and context resolver. + +## Context + +| Name | Priority | Tag | Description | +|-------------------------------------------------------------------------------------------------------------------------------------|----------|---------------------------|------------------------------------------| +| [FixedStoreContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/FixedStoreContext.php) | 2 | `coreshop.context.store ` | Used for testing purposes | +| [StoreContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/StoreContext.php) | 1 | `coreshop.context.store ` | Load a store from given request resolver | + +## Resolver + +| Name | Priority | Tag | Description | +|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-------------------------------------------------|-----------------------------------------------------| +| [SiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/SiteBasedRequestResolver.php) | 100 | `coreshop.context.store.request_based.resolver` | Determines a store by a given pimcore frontend site | +| [PimcoreAdminSiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/PimcoreAdminSiteBasedRequestResolver.php) | 200 | `coreshop.context.store.request_based.resolver` | Determines a store by a given document in backend | + +These resolver take care about finding the correct store for the current request.a# Store Context + +CoreShop utilizes the concept of context and context resolver to determine the current store based on the visitor or +customer's location or preferences. + +## Context + +Contexts are used to identify the appropriate store for the current request: + +| Name | Priority | Tag | Description | +|-------------------------------------------------------------------------------------------------------------------------------------|----------|---------------------------|------------------------------------------| +| [FixedStoreContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/FixedStoreContext.php) | 2 | `coreshop.context.store ` | Used for testing purposes | +| [StoreContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/StoreContext.php) | 1 | `coreshop.context.store ` | Load a store from given request resolver | + +## Resolver + +Resolvers are responsible for finding the correct store based on specific criteria: + +| Name | Priority | Tag | Description | +|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-------------------------------------------------|-----------------------------------------------------| +| [SiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/SiteBasedRequestResolver.php) | 100 | `coreshop.context.store.request_based.resolver` | Determines a store by a given Pimcore frontend site | +| [PimcoreAdminSiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/PimcoreAdminSiteBasedRequestResolver.php) | 200 | `coreshop.context.store.request_based.resolver` | Determines a store by a given document in backend | + +## Create a Custom Resolver + +To create a custom Store Context: + +1. Implement the interface `CoreShop\Component\Store\Context\StoreContextInterface`. +2. Define the `getStore` method to return a `CoreShop\Component\Store\Model\StoreInterface` or throw + a `CoreShop\Component\Store\Context\StoreNotFoundException`. +3. Register your context using the tag `coreshop.context.store` with an optional `priority` attribute. + +## Create a Request-Based Resolver + +CoreShop supports request-based store context resolvers: + +1. Implement the `CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface`. +2. Define the `findStore` method to return a store or null. +3. Register this resolver using the tag `coreshop.context.store.request_based.resolver` with an optional `priority` + attribute. + +## Example: Implementing a Document-Based Store Context + +To resolve a Store based on a Pimcore document, such as differentiating between `/de` and `/en` sites: + +1. Create the RequestBased Store Context: + +```php +namespace AppBundle\CoreShop\Store\Context; + +// ... other use statements ... + +final class DocumentBasedRequestRequestResolver implements RequestResolverInterface +{ +// Implementation details... +} +``` + +2. Configure the service in `src/AppBundle/Resources/config/services.yml`: + +```yaml +services: + app.coreshop.store.context.request.document_based: + class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver + arguments: + - '@coreshop.repository.store' + tags: + - { name: coreshop.context.store.request_based.resolver, priority: 300 } +``` + +With this setup, CoreShop will dynamically resolve the current store based on the site being accessed. + +## Create a Custom Resolver + +A Store Context needs to implement the interface `CoreShop\Component\Store\Context\StoreContextInterface`. +This interface consists of one method called `getStore` which returns a `CoreShop\Component\Store\Model\StoreInterface` +or throws an `CoreShop\Component\Store\Context\StoreNotFoundException`. + +To register your context, you need to use the tag `coreshop.context.store` with an optional `priority` attribute. + +## Create a Request based Resolver + +CoreShop already implements Request based store context resolver. So if your context depends on the current request, you +can +create a custom RequestBased resolver. To do that, implement the +interface `CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface` +with the method `findStore`. This method either returns a store or null. + +To register this resolver, use the tag: `coreshop.context.store.request_based.resolver` with an optional `priority` +attribute. + +## Example + +We want to a StoreContext to be based on the Pimcore Document. So if we are on site `/de`, we want to resolve +to `Store DE`, if we +are on page `/en` we want to resolve to Store `Store EN`: + +**1**: First of all we need to create our RequestBased Store Context: + +```php +storeRepository = $storeRepository; + } + + public function findStore(Request $request): ?StoreInterface + { + if (substr($request->getPathInfo(), 0, 3) === '/en') { + return $this->storeRepository->find(1); + } + + if (substr($request->getPathInfo(), 0, 3) === '/de') { + return $this->storeRepository->find(2); + } + + return null; + } +} +``` + +Now we need to configure the service in `src/AppBundle/Resources/config/services.yml` + +```yaml +services: + app.coreshop.store.context.request.document_based: + class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver + arguments: + - '@coreshop.repository.store' + tags: + - { name: coreshop.context.store.request_based.resolver, priority: 300 } + +``` + +CoreShop now tries to resolve the current Store based on the Pimcore Site we are on. diff --git a/docs/03_Development/11_Stores/03_Theme.md b/docs/03_Development/11_Stores/03_Theme.md new file mode 100644 index 0000000000..6514c2e86b --- /dev/null +++ b/docs/03_Development/11_Stores/03_Theme.md @@ -0,0 +1,27 @@ +# Stores Theming + +CoreShop's multi-store environment is designed to support different themes for each store, enabling a diverse and unique +visual experience across your various storefronts. + +## Customizing Themes for Each Store + +The flexibility to apply distinct themes to different stores allows for: + +- **Brand Consistency**: Tailor the look and feel of each store to align with specific brand guidelines and aesthetics. +- **Targeted Customer Experience**: Create themes that resonate with the particular demographics or preferences of + customers in each store. +- **Visual Distinction**: Easily differentiate between various stores in a multi-store setup through unique thematic + elements. + +## Leveraging Sylius Theme Bundle + +CoreShop utilizes the Sylius Theme Bundle to manage templates, offering a robust and flexible solution for theming: + +- **Sylius Theme Bundle**: This bundle provides the underlying structure and functionality for theme management in + CoreShop. It offers a comprehensive approach to creating and applying themes across different stores. + +- **Documentation**: For detailed information on how the Sylius Theme Bundle works and how to implement it within + CoreShop, refer to the [Sylius Theme Documentation](https://docs.sylius.com/en/1.9/book/themes/themes.html). + +By incorporating the Sylius Theme Bundle, CoreShop equips you with the tools to craft distinct, immersive, and engaging +themes for each of your stores, enhancing the overall shopping experience for your customers. diff --git a/docs/03_Development/11_Stores/index.md b/docs/03_Development/11_Stores/index.md new file mode 100644 index 0000000000..cad4d4478d --- /dev/null +++ b/docs/03_Development/11_Stores/index.md @@ -0,0 +1,40 @@ +# Stores + +CoreShop's Stores functionality is a powerful feature that allows you to create and manage a multi-store eCommerce +system within a single installation. This capability is particularly beneficial for businesses looking to cater to +diverse market segments, such as a mix of B2C and B2B customers, or to offer different themes and experiences across +various storefronts. + +## Leveraging Multi-Store Capabilities + +The multi-store feature in CoreShop leverages Pimcore's Multi Site functionality, enabling you to set up distinct stores +with their own specific configurations, themes, and product selections. This allows for a high degree of customization +and flexibility, enabling businesses to: + +- **Target Different Customer Segments**: Create separate stores for different types of customers, such as retail + consumers and wholesale clients, each with tailored products, pricing, and shopping experiences. +- **Offer Regional Variations**: Manage stores that cater to different geographical regions, each with localized + content, currency, and payment methods. +- **Customize Themes and Layouts**: Implement distinct themes and layouts for each store, ensuring a unique and branded + experience that resonates with the specific audience of each store. +- **Streamline Management**: Despite the diversity of stores, manage them all from a single Pimcore installation, + streamlining operations and maintaining consistency in backend processes. + +## CoreShop Store Features + +CoreShop provides various features and tools to effectively manage your multi-store setup: + +1. **[Create, Read, Update, Delete (CRUD)](./01_CRUD.md)**: Detailed instructions for setting up new stores, as well as + managing and updating existing ones. +2. **[Store Context](./02_Context.md)**: Insights into how CoreShop determines the current store context and how you can + customize it for different scenarios. +3. **[Theming](./03_Theme.md)**: Guidance on applying and customizing themes for each store, enhancing the visual and + user experience. + +### Overview + +By utilizing the multi-store feature, CoreShop provides a scalable and flexible solution that caters to complex +eCommerce requirements. Whether you're managing different brands, customer types, or regional variations, CoreShop's +Stores functionality equips you with the tools to create a cohesive yet diverse eCommerce ecosystem. + +Explore each section to fully harness the power of multi-store capabilities in CoreShop. diff --git a/docs/docs/03_Development/12_Customers/01_CRUD.md b/docs/03_Development/12_Customers/01_CRUD.md similarity index 50% rename from docs/docs/03_Development/12_Customers/01_CRUD.md rename to docs/03_Development/12_Customers/01_CRUD.md index 46b9312b82..8114c22037 100644 --- a/docs/docs/03_Development/12_Customers/01_CRUD.md +++ b/docs/03_Development/12_Customers/01_CRUD.md @@ -1,20 +1,20 @@ -# CoreShop Custom +# Custom Customer Management -CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire -dynamic and configurable. It uses a Factory and Repository Pattern to do that. +CoreShop utilizes Pimcore Data Objects to manage customer information, enhancing it with a wrapper for increased +dynamism and configurability. This approach leverages the Factory and Repository patterns for efficient data handling. ## Create -If you want to create a new Custom, we need to get our Factory Service for that: +To create a new customer, you need to use the Factory Service: ```php $customerFactory = $container->get('coreshop.factory.customer'); $customer = $customerFactory->createNew(); ``` -No we have our customer and we can set all needed values. +After creating the customer object, you can set the necessary values. -If you now want to save it, just call the save function +To save the new customer: ```php $customer->save(); @@ -22,47 +22,43 @@ $customer->save(); ## Read -To get customers, you need to use the Repository Service CoreShop provides you. +For retrieving customers, CoreShop provides a Repository Service: ```php $repository = $container->get('coreshop.repository.customer'); - // Query by ID $customerWithIdOne = $repository->findById(1); -// Get a Listing how you know it from Pimcore +// Get a Listing as you would in Pimcore $list = $repository->getList(); $list->setCondition("active = 1"); $customers = $list->getObjects(); - ``` ## Update -Update works the same as you are used to in Pimcore +Updating customer information follows the same process as in Pimcore: ```php $repository = $container->get('coreshop.repository.customer'); - // Query by ID $customerWithIdOne = $repository->findById(1); -// Change values +// Modify values $customerWithIdOne->setName('test'); $customerWithIdOne->save(); ``` ## Delete -Delete works the same as you are used to in Pimcore +The deletion process is also similar to standard Pimcore operations: ```php $repository = $container->get('coreshop.repository.customer'); - // Query by ID -$customerWithIdOne = $repository->findById(1); +$customerWithIdOne = the repository->findById(1); $customerWithIdOne->delete(); -``` +``` \ No newline at end of file diff --git a/docs/03_Development/12_Customers/02_Context.md b/docs/03_Development/12_Customers/02_Context.md new file mode 100644 index 0000000000..ffd411350e --- /dev/null +++ b/docs/03_Development/12_Customers/02_Context.md @@ -0,0 +1,41 @@ +# Customer Context + +CoreShop's approach to customer security leverages +the [Symfony Firewall](https://symfony.com/doc/current/components/security/firewall.html) for authentication purposes. +To enhance flexibility, CoreShop has wrapped this functionality in a context-based system. This setup allows for various +methods of determining customer context. + +## Implemented Contexts for Customer Determination + +CoreShop includes specific contexts for customer identification, such as: + +- **Security Token Based**: A method that uses security tokens for customer identification. More details can be + found [here](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Customer/Context/RequestBased/TokenBasedRequestResolver.php). + +## Creating a Custom Resolver + +In scenarios where the default customer context determination method does not fit your requirements, CoreShop allows the +creation of custom resolvers. + +### Implementing the Custom Resolver + +1. **Interface Implementation**: Your custom resolver should implement + the `CoreShop\Component\Customer\Context\CustomerContextInterface`. + The interface includes the `getCustomer` function, which should return + a `CoreShop\Component\Customer\Model\CustomerInterface` or throw + a `CoreShop\Component\Customer\Context\CustomerNotFoundException`. + +2. **Service Registration**: Register your custom context by using the tag `coreshop.context.customer`. You can also + specify an optional `priority` attribute for the tag. + +```php +// Example PHP code for custom resolver implementation +``` + +### Use Case for Custom Resolvers + +While the need for custom customer context resolvers might be rare, having the ability to create one provides additional +flexibility for specific use cases or unique business requirements. + +Implementing a custom resolver allows you to tailor the customer identification process in a way that aligns more +closely with your operational needs or security protocols. diff --git a/docs/03_Development/12_Customers/03_Customer_Manager.md b/docs/03_Development/12_Customers/03_Customer_Manager.md new file mode 100644 index 0000000000..d9598b5437 --- /dev/null +++ b/docs/03_Development/12_Customers/03_Customer_Manager.md @@ -0,0 +1,47 @@ +# Customer Manager + +CoreShop provides a robust Customer Manager that simplifies the process of creating customers along with their +addresses. This feature is an integral part of the CoreShop suite, ensuring streamlined customer data management. + +## CoreShop's Implementation of Customer Manager + +The Customer Manager in CoreShop adheres to the `CoreShop\Bundle\CoreBundle\Customer\CustomerManagerInterface` +interface. CoreShop implements this interface through the service `coreshop.customer.manager`. + +## Utilizing the Customer Manager + +The Customer Manager service can be used in various contexts, such as within a controller paired with a form type. +Here’s an example of its usage: + +```php +$customer = $this->getCustomer(); + +if ($customer instanceof CustomerInterface && null === $customer->getUser()) { +return $this->redirectToRoute('coreshop_customer_profile'); +} + +$form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew()); + +$redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile')); + +if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) { +$form = $form->handleRequest($request); + + if ($form->isValid()) { + $customer = $form->getData(); + $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode()); + + $this->get('coreshop.customer.manager')->persistCustomer($customer); + + return $this->redirect($redirect); + } +} + +return $this->render($this->templateConfigurator->findTemplate('Register/register.html'), [ +'form' => $form->createView(), +]); +``` + +In this example, the Customer Manager service is used to handle customer data obtained from a form. The customer is +created or updated based on form submissions, demonstrating the flexibility and ease of use provided by CoreShop's +customer management system. diff --git a/docs/03_Development/12_Customers/04_Registration_Types.md b/docs/03_Development/12_Customers/04_Registration_Types.md new file mode 100644 index 0000000000..106a8cd6f7 --- /dev/null +++ b/docs/03_Development/12_Customers/04_Registration_Types.md @@ -0,0 +1,44 @@ +# Customer Registration Types + +In CoreShop, the customer registration process can be configured to suit different requirements. By default, +registration requires a unique and valid email address, but you can customize this to use other identifiers like a +username. + +## Register By Email + +The default registration method in CoreShop is by using a unique and valid email address. + +To configure registration by email, set the login identifier as follows: + +```yaml +core_shop_customer: + login_identifier: 'email' +``` + +## Register By Username + +To enable registration via a unique username: + +1. **Add a `username` field**: Ensure that your customer data object has a `username` field. By default, CoreShop does + not include this field to avoid confusion. You can add a text field named `username` in your class editor. + +2. **Change the identifier**: Set the login identifier to `username`: + +```yaml +core_shop_customer: + login_identifier: 'username' +``` + +## Security Measures + +### Frontend Form Constraints + +CoreShop includes built-in constraints that inform customers whether the email address or username they enter (depending +on your configuration) is valid and unique. + +### Backend/API Validation + +In addition to frontend validation, CoreShop also ensures the uniqueness of customer data when updating customer +entities via the API or backend. + +> **Note**: These uniqueness checks apply only to non-guest entities. diff --git a/docs/03_Development/12_Customers/05_Company_Extension.md b/docs/03_Development/12_Customers/05_Company_Extension.md new file mode 100644 index 0000000000..4c83e40029 --- /dev/null +++ b/docs/03_Development/12_Customers/05_Company_Extension.md @@ -0,0 +1,55 @@ +# Customer Company Extension + +CoreShop includes a Company Entity feature, which enhances customer profiles by allowing them to be associated with +specific companies. This connection enables sharing of addresses between the company and individual customers. + +## Access Types + +The access type determines how a customer interacts with addresses, both their own and those of the associated company. +This feature is activated once a customer is linked to a valid company. + +### Own Only + +- **Default Setting**: Customers can manage their own addresses. +- **Capabilities**: Customers can create, edit, and delete their own addresses, and use them during checkout. + +### Company Only + +- **Company-Centric**: Customers manage company addresses. +- **Capabilities**: Customers can create, edit, and delete company addresses, choose them in checkout, but cannot add + personal addresses. + +### Own And Company + +- **Dual Access**: Customers can manage both personal and company addresses. +- **Capabilities**: Creation, editing, and deletion of both personal and company addresses, with the ability to choose + either during checkout. + +Additionally, in the `own_and_company` mode, customers have the flexibility to define and modify the allocation of +addresses. CoreShop incorporates a choice type in the address form for this purpose. + +**Physical Address Movement**: If a customer reallocates an address (e.g., from personal to company), the address is +physically moved to the new category. For example, changing an address from `own` to `company` results in the following +shift: + +Before Allocation Change: + +```yaml +- company A + - addresses + - customer A + - addresses + - address A + ``` + +After Allocation Change: + +```yaml +- company A + - addresses + - address A + - customer A + - addresses + ``` + +For further details on this feature, refer to the discussion on [GitHub](https://github.com/coreshop/CoreShop/issues/1266). diff --git a/docs/03_Development/12_Customers/06_Customer_and_User.md b/docs/03_Development/12_Customers/06_Customer_and_User.md new file mode 100644 index 0000000000..6f1030aa30 --- /dev/null +++ b/docs/03_Development/12_Customers/06_Customer_and_User.md @@ -0,0 +1,30 @@ +# Customer and User + +CoreShop distinguishes between two entities when it comes to customer data management: `Customer` and `User`. +Understanding the difference between these two is crucial for effectively managing customer information and +authentication. + +## Distinction Between Customer and User + +- **User**: The User entity in CoreShop is primarily concerned with authentication. It encompasses login credentials, + including the login identifier (such as an email address or username) and the password. + +- **Customer**: The Customer entity, on the other hand, represents the actual customer profile. This includes details + such as contact information, shipping and billing addresses, and order history. + +## Guest Customers + +In scenarios where a Customer does not have an associated User entity, they are considered a 'Guest Customer'. This +means they cannot log in to the system. + +### Handling Guest Customers in Checkout + +During the checkout process, CoreShop can identify existing Guest Customers based on their email address. If a match is +found, CoreShop uses the existing Customer Object. This approach has several benefits: + +- **Order Tracking**: Allows for the tracking of orders placed by guest customers. +- **Conversion Opportunity**: Provides an opportunity to later convert guest orders into full customer profiles, + enhancing customer relationship management. + +By maintaining separate User and Customer entities, CoreShop offers a flexible framework to cater to both registered and +guest customers, while keeping authentication and customer data management distinct yet integrated. diff --git a/docs/03_Development/12_Customers/index.md b/docs/03_Development/12_Customers/index.md new file mode 100644 index 0000000000..5087a4cfa7 --- /dev/null +++ b/docs/03_Development/12_Customers/index.md @@ -0,0 +1,37 @@ +# Customer Management + +In the dynamic and customer-centric world of eCommerce, effectively managing customer information is crucial. CoreShop +offers a comprehensive system for handling customer data, ensuring that every aspect of customer interaction and +management is streamlined and efficient. + +## Overview of Customer Management Features + +CoreShop's customer management system is designed to handle various aspects of customer data, from basic information +handling to more complex processes like customer registration and company extensions. Here’s an overview of the key +features and functionalities: + +1. **[Create, Read, Update, Delete (CRUD)](./01_CRUD.md)**: This section covers the fundamental operations for customer + data management. It provides the necessary guidance on creating new customer profiles, reading existing customer + information, updating customer details, and deleting customer records. + +2. **[Customer Context](./02_Context.md)**: Understanding the context in which customers interact with your store is + vital. This part of the guide delves into how CoreShop determines the current customer context and how you can tailor + this to meet specific requirements. + +3. **[Registration Service](./03_Customer_Manager.md)**: The registration service is a crucial component of customer + management, facilitating the process of customer sign-ups. This section explains how the service operates and how you + can utilize it for efficient customer registrations. + +4. **[Registration Types](./04_Registration_Types.md)**: CoreShop supports various types of customer registrations, + catering to different customer segments and needs. This section explores these types, offering insights into how they + can be implemented and managed. + +5. **[Company Extension](./05_Company_Extension.md)**: For B2B operations, managing company-related customer data is + essential. This part of the guide focuses on how CoreShop handles company extensions within customer profiles. + +### Tailoring Customer Management to Your Needs + +Whether you're managing a B2C or B2B store, or a combination of both, CoreShop's customer management system provides the +tools and flexibility needed to ensure that customer data is handled effectively and securely. By exploring each +section, you can gain a comprehensive understanding of how to optimize customer management for your CoreShop +installation. diff --git a/docs/03_Development/13_Ecommerce_Tracking/index.md b/docs/03_Development/13_Ecommerce_Tracking/index.md new file mode 100644 index 0000000000..af24c7f6b0 --- /dev/null +++ b/docs/03_Development/13_Ecommerce_Tracking/index.md @@ -0,0 +1,122 @@ +# eCommerce Tracking + +CoreShop implements tracking for analytics and Google Tag Manager, integrating seamlessly as soon as Tag Manager or +Analytics is enabled in Pimcore. By default, all ecommerce trackers are disabled and need to be manually activated. + +## Available Trackers + +CoreShop supports a variety of trackers, including: + +- google-analytics-enhanced-ecommerce +- google-analytics-universal-ecommerce +- google-gtag-enhanced-ecommerce +- google-gtm-classic-ecommerce +- google-gtm-enhanced-ecommerce +- matomo (piwik) + +## Enabling Trackers + +To enable a specific tracker, modify the configuration as follows: + +```yml +core_shop_tracking: + trackers: + google-analytics-enhanced-ecommerce: + enabled: false + google-analytics-universal-ecommerce: + enabled: false + google-gtag-enhanced-ecommerce: + enabled: false + google-gtm-classic-ecommerce: + enabled: false + google-gtm-enhanced-ecommerce: + enabled: false + matomo: + enabled: true +``` + +### External Resources + +For more information on these tracking methods: + +- [Google Enhanced E-Commerce](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce) +- [Google Enhanced E-Commerce with gtag.js](https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce) +- [Google Tag Manager Enhanced E-Commerce](https://developers.google.com/tag-manager/enhanced-ecommerce) +- [Google Tag Manager Classic E-Commerce](https://support.google.com/tagmanager/answer/6107169?hl=en) +- [Matomo (Piwik) E-Commerce](https://matomo.org/docs/ecommerce-analytics/) + +#### Actions + +##### Product Impression + +```php +$this->get('coreshop.tracking.manager')->trackProductImpression($product); +``` + +##### Product View + +```php +$this->get('coreshop.tracking.manager')->trackProduct($product); +``` + +##### Product Action Add from Cart + +```php +$this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product); +``` + +##### Product Action Remove from Cart + +```php +$this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product); +``` + +##### Checkout Step + +```php +$this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption) +``` + +##### Checkout Complete + +```php +$this->get('coreshop.tracking.manager')->trackCheckoutComplete($order) +``` + +## Adding a Custom Tracker + +To add a custom tracker: + +1. Implement the interface `CoreShop\Component\Tracking\Tracker\TrackerInterface`. + +2. Register the tracker as a service: + +```yaml +app.tracking.tracker.my_tracker: + class: AppBundle\Tracker\CustomTracker + parent: coreshop.tracking.tracker.ecommerce_tracker + tags: + - { name: coreshop.tracking.tracker, type: app-custom-tracker } +``` + +## Google Tag Manager + +CoreShop sends data to a `dataLayer` object for Google Tag Manager, which then submits the object to GTM. + +### GTM Classic eCommerce + +In classic mode, only the order gets submitted when the user reaches the "thank-you" page. + +### GTM Enhanced eCommerce + +For Google Tag Manager Enhanced eCommerce, there are six Impressions/Events: + +- Product Impression +- Product Detail View +- Checkout Step +- Checkout Complete (Purchase) +- Remove Item from Cart +- Add Item to Cart + +Each impression/event has specific configurations for GTM tagging, as outlined in the detailed tag config examples +provided. \ No newline at end of file diff --git a/docs/03_Development/14_Events/index.md b/docs/03_Development/14_Events/index.md new file mode 100644 index 0000000000..f548fb1584 --- /dev/null +++ b/docs/03_Development/14_Events/index.md @@ -0,0 +1,98 @@ +# Events + +CoreShop is equipped with a wide array of built-in events across different functionalities. + +## Frontend Controller Events + +Events triggered during frontend controller operations: + +| Name | EventType | Description | +|:--------------------------------------------|:------------------------|:-------------------------------------------------| +| `coreshop.customer.update_post` | ResourceControllerEvent | Fires after customer profile update | +| `coreshop.customer.change_password_post` | ResourceControllerEvent | Fires after customer password change | +| `coreshop.customer.newsletter_confirm_post` | ResourceControllerEvent | Fires after newsletter subscription confirmation | +| `coreshop.address.add_post` | ResourceControllerEvent | Fires after adding a new address | +| `coreshop.address.update_post` | ResourceControllerEvent | Fires after updating an address | +| `coreshop.address.delete_pre` | ResourceControllerEvent | Fires before deleting an address | + +## Cart Events + +Events related to cart operations: + +| Name | EventType | Description | +|:---------------------------------|:-------------|:----------------------------------------| +| `coreshop.cart.update` | GenericEvent | Fires after cart update | +| `coreshop.cart.pre_add_item` | GenericEvent | Fires before adding an item to cart | +| `coreshop.cart.post_add_item` | GenericEvent | Fires after adding an item to cart | +| `coreshop.cart.pre_remove_item` | GenericEvent | Fires before removing an item from cart | +| `coreshop.cart.post_remove_item` | GenericEvent | Fires after removing an item from cart | + +## Customer Events + +Events triggered during customer-related processes: + +| Name | EventType | Description | +|:-------------------------------------------|:---------------------------|:----------------------------------------------| +| `coreshop.customer.register` | CustomerRegistrationEvent | Fires after new customer registration | +| `coreshop.customer.request_password_reset` | RequestPasswordChangeEvent | Fires after password reset request | +| `coreshop.customer.password_reset` | GenericEvent | Fires after applying new password to customer | + +## Order Document Events + +Events for order document operations: + +| Name | EventType | Description | +|:-----------------------------------------|:-------------------|:-------------------------------------------------------| +| `coreshop.order.shipment.wkhtml.options` | WkhtmlOptionsEvent | Options Event: Modify wkhtml options for shipment docs | +| `coreshop.order.invoice.wkhtml.options` | WkhtmlOptionsEvent | Options Event: Modify wkhtml options for invoice docs | + +## Payment Events + +Events associated with payment processing: + +| Name | EventType | Description | +|:-------------------------------------|:-----------------------------|:--------------------------------------------------| +| `coreshop.payment_provider.supports` | PaymentProviderSupportsEvent | Support Event: Modify available Payment Providers | + +## Notes Events + +Events related to note creation and deletion: + +| Name | EventType | Description | +|:------------------------------|:-------------|:----------------------------------------------| +| `coreshop.note.*.post_add` | GenericEvent | Fires after creating a note of specified type | +| `coreshop.note.*.post_delete` | GenericEvent | Fires after deleting a note of specified type | + +Replace `*` with a note type (e.g., `payment`, `order_comment`). + +## Rules Events + +Events for rule operations: + +| Name | EventType | Description | +|:-----------------------------------|:---------------------------|:--------------------------------------------------| +| `coreshop.rule.availability_check` | RuleAvailabilityCheckEvent | Fires for every active rule in availability check | + +## Workflow Events + +Events for workflow transitions. Read more about it [here](../06_Order/16_State_Management/index.md). + +## Backend Controller Events + +Events triggered in various backend operations: + +| Name | EventType | Description | +|:-------------------------|:------------------------|:-------------------------------------------| +| `coreshop.*.pre_create` | ResourceControllerEvent | Fires before creating an object in backend | +| `coreshop.*.post_create` | ResourceControllerEvent | Fires after creating an object in backend | +| `coreshop.*.pre_save` | ResourceControllerEvent | Fires before saving an object in backend | +| `coreshop.*.post_save` | ResourceControllerEvent | Fires after saving an object in backend | +| `coreshop.*.pre_delete` | ResourceControllerEvent | Fires before deleting an object in backend | +| `coreshop.*.post_delete` | ResourceControllerEvent | Fires after deleting an object in backend | + +Replace `*` with a controller type (e.g., `configuration`, `payment_provider`). + +## Model Events + +Pimcore Events can be used for CoreShop's Pimcore Models. Learn more +at [Pimcore Events](https://pimcore.com/docs/platform/Pimcore/Extending_Pimcore/Event_API_and_Event_Manager). diff --git a/docs/03_Development/15_Frontend_Bundle/01_Controllers.md b/docs/03_Development/15_Frontend_Bundle/01_Controllers.md new file mode 100644 index 0000000000..6bb695fba2 --- /dev/null +++ b/docs/03_Development/15_Frontend_Bundle/01_Controllers.md @@ -0,0 +1,64 @@ +# Frontend Bundle Controllers + +CoreShop's FrontendBundle allows customization of its controllers. You can modify the controllers used by changing the +configuration settings in your application. + +## Configuring Frontend Controllers + +To specify which controllers to use, adjust the `core_shop_frontend` configuration in your `yaml` file: + +```yaml +core_shop_frontend: +controllers: +index: CoreShop\Bundle\FrontendBundle\Controller\IndexController +register: CoreShop\Bundle\FrontendBundle\Controller\RegisterController +customer: CoreShop\Bundle\FrontendBundle\Controller\CustomerController +currency: CoreShop\Bundle\FrontendBundle\Controller\CurrencyController +language: CoreShop\Bundle\FrontendBundle\Controller\LanguageController +search: CoreShop\Bundle\FrontendBundle\Controller\SearchController +cart: CoreShop\Bundle\FrontendBundle\Controller\CartController +checkout: CoreShop\Bundle\FrontendBundle\Controller\CheckoutController +category: CoreShop\Bundle\FrontendBundle\Controller\CategoryController +product: CoreShop\Bundle\FrontendBundle\Controller\ProductController +quote: CoreShop\Bundle\FrontendBundle\Controller\QuoteController +security: CoreShop\Bundle\FrontendBundle\Controller\SecurityController +payment: CoreShop\Bundle\PayumBundle\Controller\PaymentController +``` + +## Implementing a Custom ProductController + +### Step 1: Create a New Controller + +Create a new controller by inheriting from the CoreShop FrontendController: + +```php + *WARNING*: If you change these settings in an existing installation with orders, products, etc., you also need to +> create a migration to change all the values from a precision of 2 to your new setting. + +For handling payment values with a precision of, for example, 4, a new order property called `paymentTotal` is +introduced. In payments, dealing with a precision greater than 2 isn't feasible since a currency only has, for example, +100 cents. Therefore, the `total` Cart/Order value is rounded to a precision of 2 in the `paymentTotal` value. + +For example, if your Cart/Order total is "€ 1,000.5498", the payment total would be "€ 1,000.55". + +To display the payment total in your cart, you can use this template: + +```twig +{% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %} + + + {{ 'coreshop.ui.payment_total'|trans }}: + + + {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }} + + +{% endif %} +``` diff --git a/docs/03_Development/index.md b/docs/03_Development/index.md new file mode 100644 index 0000000000..fb93f261df --- /dev/null +++ b/docs/03_Development/index.md @@ -0,0 +1,46 @@ +# Development + +This guide is intended for developers who aim to harness the flexibility and robust features of CoreShop. It outlines +the key concepts and components used in CoreShop, providing insights into its architecture and how to effectively work +with it. + +## Introduction + +CoreShop offers a rich set of tools and features for building sophisticated eCommerce solutions. Understanding the +underlying concepts and models is crucial for leveraging its full potential. + +## Resources + +CoreShop utilizes Doctrine ORM for its custom resources, offering great flexibility and extendability for managing +simple models such as currencies, countries, etc. Here are the primary resources implemented as ORM models in CoreShop: + +- **Currency**: Handling various currencies. +- **Country and State**: Geographical models for location-based functionality. +- **Tax Rate and Tax Rules**: For applying taxes in different scenarios. +- **Price Rules**: Rules that define pricing under various conditions. +- **Carrier**: Shipping carriers and their configurations. +- **Shipping Rules**: Rules for handling shipping logic and pricing. +- **Index and Filter Configuration**: For product indexing and filtering. +- **Notification Rule Configuration**: Setting up rules for notifications. +- **Stores**: Representing different stores or sales channels. +- **Payments**: Handling payment methods and transactions. + +In CoreShop, the term 'Resource' refers to these ORM Models. + +## Pimcore Models + +Leveraging Pimcore's flexible data model, CoreShop uses Data Objects for frequently used and modified entities. The +following are the key objects implemented using Pimcore Data Objects: + +- **Product**: The core entity in any eCommerce platform. +- **Product Category**: Organizing products into categories. +- **Manufacturer**: Information about product manufacturers. +- **Order**: Managing customer cart/orders. +- **Order Invoice**: Generating and handling invoices. +- **Order Shipment**: Managing the shipment of orders. +- **Quote**: Handling quotes for customers. +- **Customer**: Customer data and profiles. +- **Customer Group**: Grouping customers for specific functionalities or offers. +- **Addresses**: Managing customer addresses. + +When discussing 'Objects' in the context of CoreShop, it refers to these Pimcore Data Objects. diff --git a/docs/babel.config.js b/docs/babel.config.js deleted file mode 100644 index e00595dae7..0000000000 --- a/docs/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/docs/composer.lock b/docs/composer.lock deleted file mode 100644 index 14c4659fbd..0000000000 --- a/docs/composer.lock +++ /dev/null @@ -1,2064 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "3810e970362b6d46d842acbfd335957d", - "packages": [ - { - "name": "daux/daux.io", - "version": "0.9.4", - "source": { - "type": "git", - "url": "https://github.com/dauxio/daux.io.git", - "reference": "a1875a2726b8efc8fc1359d9835374a2402498c8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dauxio/daux.io/zipball/a1875a2726b8efc8fc1359d9835374a2402498c8", - "reference": "a1875a2726b8efc8fc1359d9835374a2402498c8", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "~6.0", - "league/commonmark": "^0.18", - "league/plates": "~3.1", - "myclabs/deep-copy": "^1.5", - "php": ">=7.1.3", - "symfony/console": "^4.0", - "symfony/http-foundation": "^4.0", - "symfony/polyfill-intl-icu": "^1.10", - "symfony/process": "^4.0", - "webuni/commonmark-table-extension": "0.9.*", - "webuni/front-matter": "^1.0.0" - }, - "replace": { - "justinwalsh/daux.io": "*" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "~7.4" - }, - "suggest": { - "ext-intl": "Allows to translate the modified at date" - }, - "bin": [ - "bin/daux" - ], - "type": "project", - "autoload": { - "psr-4": { - "Todaymade\\Daux\\": "libs/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stéphane Goetz", - "homepage": "http://onigoetz.ch/" - }, - { - "name": "Justin Walsh", - "homepage": "http://todaymade.com/" - } - ], - "description": "Documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly", - "homepage": "https://dauxio.github.io/", - "keywords": [ - "docs", - "documentation", - "markdown", - "md" - ], - "support": { - "issues": "https://github.com/dauxio/daux.io/issues", - "source": "https://github.com/dauxio/daux.io/tree/master" - }, - "time": "2019-08-08T12:21:31+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.8", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2022-06-20T22:16:07+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:56:57+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", - "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.9.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2023-04-17T16:00:37+00:00" - }, - { - "name": "league/commonmark", - "version": "0.18.5", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "f94e18d68260f43a7d846279cad88405854b1306" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/f94e18d68260f43a7d846279cad88405854b1306", - "reference": "f94e18d68260f43a7d846279cad88405854b1306", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.6.5" - }, - "replace": { - "colinodell/commonmark-php": "*" - }, - "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.28", - "erusev/parsedown": "~1.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.2", - "phpunit/phpunit": "^5.7.27|^6.5.14", - "scrutinizer/ocular": "^1.1", - "symfony/finder": "^3.0|^4.0" - }, - "suggest": { - "league/commonmark-extras": "Library of useful extensions including smart punctuation" - }, - "bin": [ - "bin/commonmark" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.19-dev" - } - }, - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "PHP Markdown parser based on the CommonMark spec", - "homepage": "https://github.com/thephpleague/commonmark", - "keywords": [ - "commonmark", - "markdown", - "parser" - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "time": "2019-03-28T13:52:31+00:00" - }, - { - "name": "league/plates", - "version": "v3.4.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/plates.git", - "reference": "6d3ee31199b536a4e003b34a356ca20f6f75496a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/plates/zipball/6d3ee31199b536a4e003b34a356ca20f6f75496a", - "reference": "6d3ee31199b536a4e003b34a356ca20f6f75496a", - "shasum": "" - }, - "require": { - "php": "^7.0|^8.0" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Plates\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Reinink", - "email": "jonathan@reinink.ca", - "role": "Developer" - }, - { - "name": "RJ Garcia", - "email": "ragboyjr@icloud.com", - "role": "Developer" - } - ], - "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", - "homepage": "https://platesphp.com", - "keywords": [ - "league", - "package", - "templates", - "templating", - "views" - ], - "support": { - "issues": "https://github.com/thephpleague/plates/issues", - "source": "https://github.com/thephpleague/plates/tree/v3.4.0" - }, - "time": "2020-12-25T05:00:37+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2022-03-03T13:19:32+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/http-message", - "version": "1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" - }, - "time": "2023-04-04T09:50:52+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/console", - "version": "v4.4.41", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "0e1e62083b20ccb39c2431293de060f756af905c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0e1e62083b20ccb39c2431293de060f756af905c", - "reference": "0e1e62083b20ccb39c2431293de060f756af905c", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v4.4.41" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-04-12T15:19:55+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v4.4.41", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "27441220aebeb096b4eb8267acaaa7feb5e4266c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27441220aebeb096b4eb8267acaaa7feb5e4266c", - "reference": "27441220aebeb096b4eb8267acaaa7feb5e4266c", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/mime": "^4.3|^5.0", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/expression-language": "^3.4|^4.0|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v4.4.41" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-04-21T07:22:34+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "af49bc163ec3272f677bde3bc44c0d766c1fd662" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/af49bc163ec3272f677bde3bc44c0d766c1fd662", - "reference": "af49bc163ec3272f677bde3bc44c0d766c1fd662", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-04-12T15:48:08+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-10-20T20:35:02+00:00" - }, - { - "name": "symfony/polyfill-intl-icu", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "c023a439b8551e320cc3c8433b198e408a623af1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/c023a439b8551e320cc3c8433b198e408a623af1", - "reference": "c023a439b8551e320cc3c8433b198e408a623af1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance and support of other locales than \"en\"" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Icu\\": "" - }, - "classmap": [ - "Resources/stubs" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's ICU-related data and classes", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "icu", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-10-26T17:16:04+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-06-05T21:20:04+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-03-04T08:16:47+00:00" - }, - { - "name": "symfony/process", - "version": "v4.4.41", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "9eedd60225506d56e42210a70c21bb80ca8456ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/9eedd60225506d56e42210a70c21bb80ca8456ce", - "reference": "9eedd60225506d56e42210a70c21bb80ca8456ce", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v4.4.41" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-04-04T10:19:07+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-03-13T20:07:29+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.3.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "c441e9d2e340642ac8b951b753dea962d55b669d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c441e9d2e340642ac8b951b753dea962d55b669d", - "reference": "c441e9d2e340642ac8b951b753dea962d55b669d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.14" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-26T16:05:39+00:00" - }, - { - "name": "webuni/commonmark-table-extension", - "version": "0.9.0", - "source": { - "type": "git", - "url": "https://github.com/webuni/commonmark-table-extension.git", - "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/94bc98d802d0b706e748716854e5fa0bd3644df3", - "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3", - "shasum": "" - }, - "require": { - "league/commonmark": "^0.16|^0.17|^0.18", - "php": "^5.6|^7.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.9", - "phpunit/phpunit": "^5.4|^6.0", - "symfony/var-dumper": "^3.0|^4.0", - "vimeo/psalm": "~0.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.9-dev" - } - }, - "autoload": { - "psr-4": { - "Webuni\\CommonMark\\TableExtension\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Martin Hasoň", - "email": "martin.hason@gmail.com" - }, - { - "name": "Webuni s.r.o.", - "homepage": "https://www.webuni.cz" - } - ], - "description": "The table extension for CommonMark PHP implementation", - "homepage": "https://github.com/webuni/commonmark-table-extension", - "keywords": [ - "commonmark", - "markdown", - "table" - ], - "support": { - "issues": "https://github.com/webuni/commonmark-table-extension/issues", - "source": "https://github.com/webuni/commonmark-table-extension/tree/0.9.0" - }, - "abandoned": "league/commonmark", - "time": "2018-11-28T11:29:11+00:00" - }, - { - "name": "webuni/front-matter", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/webuni/front-matter.git", - "reference": "334e3532546d62d28164580208edef1c5c853024" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webuni/front-matter/zipball/334e3532546d62d28164580208edef1c5c853024", - "reference": "334e3532546d62d28164580208edef1c5c853024", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/yaml": "^3.4.31 || ^4.3.4 || ^5.0" - }, - "require-dev": { - "ext-json": "*", - "league/commonmark": "^1.4", - "mthaml/mthaml": "^1.3", - "nette/neon": "^2.2 || ^3.0", - "twig/twig": "^3.0", - "yosymfony/toml": "^1.0" - }, - "suggest": { - "nette/neon": "If you want to use NEON as front matter", - "yosymfony/toml": "If you want to use TOML as front matter" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webuni\\FrontMatter\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Martin Hasoň", - "email": "martin.hason@gmail.com", - "homepage": "https://www.martinhason.cz" - }, - { - "name": "Webuni s.r.o.", - "homepage": "https://www.webuni.cz" - } - ], - "description": "Front matter parser and dumper for PHP", - "homepage": "https://github.com/webuni/front-matter", - "keywords": [ - "commonmark", - "front-matter", - "json", - "neon", - "toml", - "yaml" - ], - "support": { - "issues": "https://github.com/webuni/front-matter/issues", - "source": "https://github.com/webuni/front-matter/tree/1.3.0" - }, - "time": "2021-06-14T20:44:30+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/docs/config.json b/docs/config.json deleted file mode 100644 index 0848270a8a..0000000000 --- a/docs/config.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title" : "CoreShop 4.0.x - Pimcore eCommerce - Documentation", - "sub_title": "", - "tagline" : "CoreShop 4.0.x - Pimcore eCommerce", - "author": "", - "languages": [], - "format": "html", - "processor": "", - "ignore": { - "files": ["generate-api.sh", "generate-docs.sh", "generate-docs-local.sh", "config.json", "composer.json", "composer.lock"], - "folders": ["vendor", "themes", "generated_docs"] - }, - "timezone": "Europe/Vienna", - "live": { - "clean_urls": true - }, - "html": { - "ribbon_text": "", - "theme": "coreshop", - "breadcrumbs": true, - "breadcrumb_separator": "Chevrons", - "toggle_code": false, - "date_modified": false, - "float": false, - "search": true, - "inherit_index": true, - "repo": "coreshop/coreshop", - "twitter": false, - "links": { - "Website": "https://www.coreshop.org", - "Github": "https://github.com/coreshop/CoreShop" - }, - "google_analytics": "UA-75356862-4", - "banner": { - - }, - "linked_docs": { - "pimcore": { - "title": "Pimcore", - "description": "Picmore Docs", - "link": "https://pimcore.com/docs/", - "css_classes": "enterprise", - "ribbon_text": "Pimcore" - } - }, - "edit_on_github": "coreshop/CoreShop/edit/master/doc", - "disqus": { - "include": false, - "url_prefix": "https://coreshop.org/docs/latest/" - }, - "version_info": { - "include": true, - "source_url": "https://github.com/coreshop/CoreShop/commit/{commit_hash}", - "source_name": "coreshop/CoreShop@{short_commit_hash}" - } - } -} diff --git a/docs/docs/00_Introduction.md b/docs/docs/00_Introduction.md deleted file mode 100644 index e0e4db5f9a..0000000000 --- a/docs/docs/00_Introduction.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -slug: / -title: Introduction ---- - -# Introduction - -> This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework -> -> We've aimed this part of the documentation at a developer's audience. - -CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit [pimcore.com](https://pimcore.com). - -## Documentation Overview - -The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform: - -* See the [Getting Started](./01_Getting_Started/index.md) section for an overview and information about the installation process. -* See the [Bundles](./03_Bundles/index.md) section for details about the different Bundles CoreShop provides. -* See the [User Documentation](./02_User_Documentation/index.md) section for documentation configuration of CoreShop. -* See the [Development](./03_Development/index.md) section for documentation about developing with CoreShop. - -## Additional resources for getting started with CoreShop -- [CoreShop Demo](https://demo3.coreshop.org): See CoreShop in action and also use it as a blueprint application for your own implementations. - diff --git a/docs/docs/01_Getting_Started/00_Installation.md b/docs/docs/01_Getting_Started/00_Installation.md deleted file mode 100644 index 514adaa3ba..0000000000 --- a/docs/docs/01_Getting_Started/00_Installation.md +++ /dev/null @@ -1,24 +0,0 @@ -# CoreShop Installation - -You need a running instance of Pimcore on your system before you can install CoreShop. - -You can setup your own example: - - Install with composer ```composer require coreshop/core-shop ^3.0``` - - Run enable Bundle command - ```php bin/console pimcore:bundle:enable CoreShopCoreBundle``` - - Run Install Command - `php bin/console coreshop:install` - - Optional: Install Demo Data `php bin/console coreshop:install:demo` - -## Messenger -CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data -``` -bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300 -``` - -## Payment -CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers. - -Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer - -[Payum Documentation](https://github.com/Payum/Payum/blob/master/docs/index.md#symfony-payum-bundle) diff --git a/docs/docs/01_Getting_Started/01_Architecture_Overview.md b/docs/docs/01_Getting_Started/01_Architecture_Overview.md deleted file mode 100644 index 4558bde951..0000000000 --- a/docs/docs/01_Getting_Started/01_Architecture_Overview.md +++ /dev/null @@ -1,46 +0,0 @@ -# CoreShop Architecture - -CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies. - -What are our core values and what makes us different from other solutions? - - - Components based approach - - Unlimited flexibility and simple customization - - Developer-friendly, using latest technologies - - Highest quality of code - -# The Three Natures of CoreShop - -CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. -It is also a set of Symfony bundles, which integrate the components into the full-stack framework. -On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks. - -It is your choice how to use CoreShop, you can benefit from the components with any framework, -integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite. - -# CoreShop Suite - -This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems. - -# Leveraging Symfony Bundles - -If you prefer to build your very custom system step by step and from scratch, -you can integrate the standalone Symfony bundles. -For the installation instructions, please refer to the appropriate bundle documentation. - -## Difference to the official Pimcore eCommerce Framework - -The eCommerce Framework provides you with a basic Toolset for eCommerce Development. -CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions. - -> **Example I:** the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. -> You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that. - -CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features. - -# Architecture Overview - -CoreShop Suite is build on CoreShop Components and Bundles. -The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions. - -![Architecture](img/architecture.png) diff --git a/docs/docs/01_Getting_Started/02_Upgrade_Notes.md b/docs/docs/01_Getting_Started/02_Upgrade_Notes.md deleted file mode 100644 index 5d7b4eef62..0000000000 --- a/docs/docs/01_Getting_Started/02_Upgrade_Notes.md +++ /dev/null @@ -1,1191 +0,0 @@ -# CoreShop Upgrade Notes - -Always check this page for some important upgrade notes before updating to the latest coreshop build. - -# 4.0.0-beta.1 - -> CoreShop 4.0.0 is the same as 3.1.0, but with Pimcore 11 compatibility. Updating CoreShop therefore is quite easy. Since Symfony now doesn't have a full container anymore, we use Service Containers now for our Controllers. So your overwritten Controllers probably need changes. - -- Pimcore 11 Compatibility (https://github.com/coreshop/CoreShop/pull/2252, https://github.com/coreshop/CoreShop/pull/2340, https://github.com/coreshop/CoreShop/pull/2345, https://github.com/coreshop/CoreShop/pull/2352, https://github.com/coreshop/CoreShop/pull/2321, https://github.com/coreshop/CoreShop/pull/2347) - -## Pimcore 10.6 -If you update to Pimcore 10.6 and you get following error: ```"You have requested a non-existent parameter "coreshop.model.user.class"``` then check if you have this config in your `security.yaml`: - -```yaml -pimcore: - security: - encoder_factories: - ‘%coreshop.model.user.class%’: coreshop.security.user.password_encoder_factory -``` - -If you have that, remove that entry. CoreShop internally sets that anyway. - -## 3.0.x -### 3.0.4 - -#### Bugs -- [PimcoreBundle] fix SluggableLinkGenerator DI Config (https://github.com/coreshop/CoreShop/pull/2218) -- [CoreBundle] Fix Grid Column Config (https://github.com/coreshop/CoreShop/pull/2215) -- [CoreBundle] Improve payment detail rendering (https://github.com/coreshop/CoreShop/pull/2207) -- [CoreBundle] Move Cart Subtotal Calculation To Dedicated Cart Processor (https://github.com/coreshop/CoreShop/pull/2205) -- [FrontendBundle] fix only showing customer orders and not cars too (https://github.com/coreshop/CoreShop/pull/2201) -- [IndexBundle] check recursively child elements (https://github.com/coreshop/CoreShop/pull/2200) -- [CoreBundle] set corret store value attributes (https://github.com/coreshop/CoreShop/pull/2197) -- [Core] allow decoration of StackRepository (https://github.com/coreshop/CoreShop/pull/2196) -- [CoreBundle] surcharge is possible to be more than item value (https://github.com/coreshop/CoreShop/pull/2192) -- [ShippingBundle] allow min.amount from to be 0 (https://github.com/coreshop/CoreShop/pull/2195) -- [Payum] don't use dev version (https://github.com/coreshop/CoreShop/pull/2193) - -### 3.0.3 - -- Feature - - [StorageList] allow for shareable StorageLists (eg. wishlist) (https://github.com/coreshop/CoreShop/pull/2150) - -- Bugs - - [StorageListItem] add definitive StorageList (Order/Wishlist) field to Item (https://github.com/coreshop/CoreShop/pull/2117) - - [FrontendBundle] keep a reference to the just-removed Product (https://github.com/coreshop/CoreShop/pull/2125) - - [MessengerBundle] only allow to list ListableReceiverInterface (https://github.com/coreshop/CoreShop/pull/2127) - - [MessengerBundle] standalone fixes (https://github.com/coreshop/CoreShop/pull/2130) - - [Slug] improve slug generation and don't store slugs for every site if the same (https://github.com/coreshop/CoreShop/pull/2131) - - [MoneyBundle] fix issue with not-nullable types and null values (https://github.com/coreshop/CoreShop/pull/2138) - - [Resource] add return types for BigIntIntegerType (https://github.com/coreshop/CoreShop/pull/2140) - - [LinkGeneration] introduce possibility to disable slugs and use fallback routes (https://github.com/coreshop/CoreShop/pull/2143) - - [Payum] use stable payum release (https://github.com/coreshop/CoreShop/pull/2141) - - [FrontendBundle] use asset() helper for logo image (https://github.com/coreshop/CoreShop/pull/2137) - - [CoreBundle] Fix migration for price_rules in OrderItem class (https://github.com/coreshop/CoreShop/pull/2145) - - [CoreBundle] Add layout price_rules only once to OrderItem (https://github.com/coreshop/CoreShop/pull/2148) - - [StorageList & Slug] fixes for shared wishlist & slugs (https://github.com/coreshop/CoreShop/pull/2151) - - [CoreBundle] Use valid key in user migration (https://github.com/coreshop/CoreShop/pull/2159) - - [CoreBundle] fix price_rule migration section (https://github.com/coreshop/CoreShop/pull/2160) - - [StorageList] Fix SessionStorageManager (https://github.com/coreshop/CoreShop/pull/2165) - - [IndexBundle] check if index value is null before exploding (https://github.com/coreshop/CoreShop/pull/2163) - - [IndexBundle] process children within same Handler (https://github.com/coreshop/CoreShop/pull/2171) - -### 3.0.2 - -> Please make sure you also start the messenger worker for the CoreShop Tasks -> ```bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300``` - -- Features - - [Messenger] introduce Messenger Bundle (https://github.com/coreshop/CoreShop/pull/2105, https://github.com/coreshop/CoreShop/pull/2114, https://github.com/coreshop/CoreShop/pull/2112, https://github.com/coreshop/CoreShop/pull/2106) - -- Bugs - - [CartPiceRules] fix OrderItem not finding Order with CartItemPriceRules (https://github.com/coreshop/CoreShop/pull/2116) - - [StorageList] fix storage-list priority (https://github.com/coreshop/CoreShop/pull/2113) - - [ResourceBundle] class names with lower-case names (https://github.com/coreshop/CoreShop/pull/2097) - - [Checkout] introduce Payment Provider Validator to check if the selected one is still valid (https://github.com/coreshop/CoreShop/pull/2111) - - [Unit] fix issues with unit selection in ui (https://github.com/coreshop/CoreShop/pull/2104) - - [CustomerAssignment] Fix typo when passing the company ID to the router (https://github.com/coreshop/CoreShop/pull/2102) - - [CoreBundle] fix cart-item-rule discount action form (https://github.com/coreshop/CoreShop/pull/2101) - - [IndexBundle] fix: index table o_classId type fix (https://github.com/coreshop/CoreShop/pull/2095) - - [Menu] Use correct permission definition for product unit menu item (https://github.com/coreshop/CoreShop/pull/2094) - -## 3.0.1 - -- Bugs - - [Translations] fix order object translations (https://github.com/coreshop/CoreShop/pull/2091) - - [Psalm] fixes (https://github.com/coreshop/CoreShop/pull/2089) - - [CustomerTransformHelper] Use company's name initial as parent folder for companies (https://github.com/coreshop/CoreShop/pull/2082) - - [StorageListBundle] PimcoreStorageListRepository: Comply to PSR-4 autoloading standards (https://github.com/coreshop/CoreShop/pull/2081) - - [ProductVariantTrait] Prevent MySQL syntax error (https://github.com/coreshop/CoreShop/pull/2086) - - [Wishlist] add tests and fix routing (https://github.com/coreshop/CoreShop/pull/2084) - -## 3.0.0 - -CoreShop is now Licenced under CCL and GPLv3! (https://github.com/coreshop/CoreShop/pull/2061) - -- Feature - - [IndexBundle] clone index, change default name of cloned item (https://github.com/coreshop/CoreShop/pull/2056) - - [CartPriceRules] introduce feature to allow cart-price rules based on cart-items (https://github.com/coreshop/CoreShop/pull/2057, https://github.com/coreshop/CoreShop/pull/2060) - - [Wishlist] Introduce a persisted wishlist - StorageListBundle now works as a base for Order and Wishlist (https://github.com/coreshop/CoreShop/pull/2030, https://github.com/coreshop/CoreShop/pull/2066) - - [Reports] Support filtering for order type (https://github.com/coreshop/CoreShop/pull/2055) - - [Symfony] fix Injecting @session is deprecated with Symfony (https://github.com/coreshop/CoreShop/pull/2035) - - [AccessManagement] prepare CoreShop for advanced access-management (https://github.com/coreshop/CoreShop/pull/2063) - - [Pimcore] 10.5 as min requirement (https://github.com/coreshop/CoreShop/pull/2067) - -- Bugs - - [VariantBundle] Serializer: Allow $innerObject to be null (https://github.com/coreshop/CoreShop/pull/2058, https://github.com/coreshop/CoreShop/pull/2069) - - [DataHub] Fix non unique typename (https://github.com/coreshop/CoreShop/pull/2004) - - [Translations] Update admin-translations.yml (https://github.com/coreshop/CoreShop/pull/2064) - - [Pimcore UI] Make default Product Unit unselectable (https://github.com/coreshop/CoreShop/pull/2065) - - [Variant] allow recursive attributes and variants (https://github.com/coreshop/CoreShop/pull/2068) - -### 3.0.0-beta.5 -> This will be the last BETA for the final release. - -- Bugs - - [Frontend] fix controller overwriting (https://github.com/coreshop/CoreShop/pull/2017) - - Replaced old Registration Service with Customer Manager (https://github.com/coreshop/CoreShop/pull/2020) - - Update install guide while it is in beta (https://github.com/coreshop/CoreShop/pull/2019) - - [Frontend] fix getQuantityModifier return type (https://github.com/coreshop/CoreShop/pull/2024) - - Fix TagManagerEnhancedEcommerce (https://github.com/coreshop/CoreShop/pull/2027) - - [ProductBundle] fix saving of Price Rule Conditions and Actions when creating (https://github.com/coreshop/CoreShop/pull/2029) - - [FrontendBundle] Consider UrlSlugs in the locale switcher (https://github.com/coreshop/CoreShop/pull/2032) - - [DB] Remove Migrate and ClassUpdate rename and fix psalm issues (https://github.com/coreshop/CoreShop/pull/2034) - - fix: property must not be accessed before initialization (https://github.com/coreshop/CoreShop/pull/2036) - - [MoneyBundle] bugfix unmarshalVersion for coreShopMoney (https://github.com/coreshop/CoreShop/pull/2037) - - [ThemeBundle] add document pre_renderer listener to resolve theme (https://github.com/coreshop/CoreShop/pull/2041) - - [OrderBundle] fix "coreshop_admin_order_find" route (https://github.com/coreshop/CoreShop/pull/2045) - - [Pimcore] add tests for ^10.5 (https://github.com/coreshop/CoreShop/pull/2043) - - [Events] fix pimcore events BC break (https://github.com/coreshop/CoreShop/pull/2046) - - [Tests] test against pimcore ^11.0 (https://github.com/coreshop/CoreShop/pull/2047) - - [CoreBundle] add typecasts for MoneyFormatter in Reports, bugfix SQL (https://github.com/coreshop/CoreShop/pull/2048) - - [MoneyBundle] bugfix marshalVersion for coreShopMoney (https://github.com/coreshop/CoreShop/pull/2051) - - [MoneyBundle] bugfix setter code for FieldCollection (https://github.com/coreshop/CoreShop/pull/2052) - - [CoreBundle] check for null value in CartStockAvailabilityValidator (https://github.com/coreshop/CoreShop/pull/2053) - -### 3.0.0-beta.4 -- Feature - - [Variants] introduce Variant Bundle (https://github.com/coreshop/CoreShop/pull/1990) @breakone - - [Pimcore] require min 10.4 (https://github.com/coreshop/CoreShop/pull/2013) - -- Bugs - - [Store] add Store Resolver for document save from Pimcore Admin (https://github.com/coreshop/CoreShop/pull/1962) - - [ResourceBundle] add feature to clone resources (https://github.com/coreshop/CoreShop/pull/1965) - - [CartPriceRules] fix cart-price-rules with over 100% discount (https://github.com/coreshop/CoreShop/pull/1966) - - [Tests] re-enable cart tests (https://github.com/coreshop/CoreShop/pull/1970) - - [FrontendBundle] fix: paginator.html.twig prepends four spaces to URLs (https://github.com/coreshop/CoreShop/pull/1968) - - [IndexBundle] fix Argument #2 ($values) must be of type array, string given (https://github.com/coreshop/CoreShop/pull/1967) - - [CoreBundle] use themeHelper to resolve template in StoreMailActionProcessor (https://github.com/coreshop/CoreShop/pull/1973) - - [Condition] fix rules being active even if inactive when having no conditions (https://github.com/coreshop/CoreShop/pull/1977) - - [CoreBundle] Handle null addresses when persisting customers (https://github.com/coreshop/CoreShop/pull/1979) - - [ResourceBundle] fix ResourceSettingsController getConfigAction (https://github.com/coreshop/CoreShop/pull/1981) - - [CoreBundle] fix registered user validator (https://github.com/coreshop/CoreShop/pull/1980) - - [CustomerBundle] fix: wiring non-existing User classes which were migrated to CustomerBundle (https://github.com/coreshop/CoreShop/pull/1984) - - [CoreBundle] Remove duplicate assignment (https://github.com/coreshop/CoreShop/pull/1985) - - [CoreBundle] Fix Typo in notifcation.yml (https://github.com/coreshop/CoreShop/pull/1988) - - [ResourceBundle] Fix grid view for orders/quotes/carts in admin (https://github.com/coreshop/CoreShop/pull/1989) - - [OrderBundle] Fix for order grid configs (https://github.com/coreshop/CoreShop/pull/1992) - - [Taxation] pass context into TaxCalculatorFactory (https://github.com/coreshop/CoreShop/pull/1978) - - [CoreBundle] use TaxationDisplayProvider in CarrierChoiceType (https://github.com/coreshop/CoreShop/pull/1994) - - [CoreBundle] Fix newsletter double opt in mail not sending (https://github.com/coreshop/CoreShop/pull/1993) - - [CoreBundle] added newline before phoneNumber in CountryFixture (https://github.com/coreshop/CoreShop/pull/1995) - - [CoreBundle] fix variant js, added variant select template (https://github.com/coreshop/CoreShop/pull/1997) - - [Checkout] change thank-you to work with token and fix strict samesite cookies (https://github.com/coreshop/CoreShop/pull/1999) - - [Variant] add concrete return type to ui configuration (https://github.com/coreshop/CoreShop/pull/1996) - - [CoreBundle] fix event listeners for variants (https://github.com/coreshop/CoreShop/pull/2000) - - [Rule] use tags for TraceableRuleConditionsValidationProcessor (https://github.com/coreshop/CoreShop/pull/2002) - - [Guest] improve guest checkout to change address or use different one for shipping (https://github.com/coreshop/CoreShop/pull/2003) - - [CoreBundle] use the index for categories to allow fine tuning the menus (https://github.com/coreshop/CoreShop/pull/1915) - - [Pimcore] add dirname() and basename() to expression function provider (https://github.com/coreshop/CoreShop/pull/2007) - - [Product Model] Allow getIndexableName() to return null (https://github.com/coreshop/CoreShop/pull/2009) - - [Doctrine] Use doctrine-extension 3.6.0 (https://github.com/coreshop/CoreShop/pull/2012) - -### 3.0.0-beta.3 -- [IndexBundle] fix: generate the correct menu route (https://github.com/coreshop/CoreShop/pull/1815) -- [All] rename document coreshop editables (https://github.com/coreshop/CoreShop/pull/1822) -- [CoreBundle] Fix fetch of checkout_finisher url from request (https://github.com/coreshop/CoreShop/pull/1814) -- [FrontendBundle] Fix "Invoice Address is Shipping Address" in checkout address step (https://github.com/coreshop/CoreShop/pull/1823) -- [CoreBundle] Add address parent check (https://github.com/coreshop/CoreShop/pull/1825) -- [Core] add is_null in isNewEntity for Customer (https://github.com/coreshop/CoreShop/pull/1830) -- [IndexBundle] add boolean filter condition (https://github.com/coreshop/CoreShop/pull/1834) -- [IndexBundle] add clear button for filter preSelect combos (https://github.com/coreshop/CoreShop/pull/1833) -- [OrderBundle] fix session cart subscriber when no session is available (https://github.com/coreshop/CoreShop/pull/1836) -- [OrderBundle] cart context returns latest cart even if multiple found (https://github.com/coreshop/CoreShop/pull/1800) -- [ResourceBundle] fix resource list calling Pimcore Event and CoreShop Event to open object (https://github.com/coreshop/CoreShop/pull/1838) -- [CoreBundle] Fix doctrine type in migration (followup of #1839) (https://github.com/coreshop/CoreShop/pull/1840) -- [List] fix open CoreShop Entry and Pimcore DataObject (https://github.com/coreshop/CoreShop/pull/1845) -- [Cache] optimize Pimcore cache with doctrine entities (https://github.com/coreshop/CoreShop/pull/1843) -- [FrontendBundle] fix: Since symfony/http-kernel 5.1: Referencing controllers with a single colon is deprecated (https://github.com/coreshop/CoreShop/pull/1848/commits) -- [IndexBundle] Migrate to SettingsStoreAwareInstaller (https://github.com/coreshop/CoreShop/pull/1847) -- [FrontendBundle] Make category sort options configurable (https://github.com/coreshop/CoreShop/pull/1850) -- [Theme] fallback to SettableThemeContext (https://github.com/coreshop/CoreShop/pull/1851) -- [PimcoreBundle] added SluggableSlugger for SluggableListener (https://github.com/coreshop/CoreShop/pull/1857) -- [Pimcore] Definition Updater: check if we should use 'childs' or 'children' (https://github.com/coreshop/CoreShop/pull/1858) -- [Core] address assignment manager should check for null (https://github.com/coreshop/CoreShop/pull/1863) -- [IndexBundle] decimal should be 10,2 (https://github.com/coreshop/CoreShop/pull/1862) -- [IndexBundle] QuantityValue ID's are strings (https://github.com/coreshop/CoreShop/pull/1861) -- [IndexBundle] Add pimcore.dataobject.postAdd event to index DataObjects (https://github.com/coreshop/CoreShop/pull/1866) -- [PaymentBundle] Added payum payment model fields to coreshop payment model (https://github.com/coreshop/CoreShop/pull/1854) -- [Taxation] add taxRate to TaxItemInterface (https://github.com/coreshop/CoreShop/pull/1867) -- [CoreBundle] fix quote notification sending (https://github.com/coreshop/CoreShop/pull/1868) -- [CoreBundle] fix quote notification sending 3.x (https://github.com/coreshop/CoreShop/pull/1869) -- [FrontendBundle] fix createQuoteAction (https://github.com/coreshop/CoreShop/pull/1870) -- [IndexBundle] FIX:double click on field group adds them to indices (https://github.com/coreshop/CoreShop/pull/1871) -- [CoreBundle] fix user-reset password notification sending (https://github.com/coreshop/CoreShop/pull/1877) -- [IndexBundle] FIX: localized fields from brick and fieldcollections can be added to index (https://github.com/coreshop/CoreShop/pull/1872) -- [CurrencyBundle] fix exchange rate saving/deleting (https://github.com/coreshop/CoreShop/pull/1879) -- [PaymentBundle] FIX: coreshop_payment_provider editable select, wrong property name (https://github.com/coreshop/CoreShop/pull/1883) -- [ResourceBundle] Make stack of classes not extended in CoreBundle working (https://github.com/coreshop/CoreShop/pull/1882) -- [IndexBundle] FIX: select from multiselect throws error if no value is pre-selected (https://github.com/coreshop/CoreShop/pull/1880) -- [ThemeBundle] improve loading theme when document cannot be loaded (https://github.com/coreshop/CoreShop/pull/1884) -- [ResourceBundle] fix entity-merger to delete collection entries (https://github.com/coreshop/CoreShop/pull/1887) -- [ProductBundle] fix translations (https://github.com/coreshop/CoreShop/pull/1888) -- [IndexBundle] fixed issue 1891, fix totalCount for pagination (https://github.com/coreshop/CoreShop/pull/1892) -- [UserBundle] Email field required on request reset password form (https://github.com/coreshop/CoreShop/pull/1893) -- [FrontendBundle] Category select template fix (https://github.com/coreshop/CoreShop/pull/1890) -- [IndexBundle] category multiselect (https://github.com/coreshop/CoreShop/pull/1899) -- [IndexBundle] extending condition proccesor adds empty tag (https://github.com/coreshop/CoreShop/pull/1900) -- [OrderBundle] Error during serialization of OrderInvoice (https://github.com/coreshop/CoreShop/pull/1903) -- [CoreBundle] don't load settings if user has no permission (https://github.com/coreshop/CoreShop/pull/1902) -- [NotificationBundle] Fixed invoice, payment, shipment state condition in notifications (https://github.com/coreshop/CoreShop/pull/1905) -- [CoreBundle] Order mail note fix (https://github.com/coreshop/CoreShop/pull/1906) -- [ShippingBundle] Removed free shipping checkbog from carrier (https://github.com/coreshop/CoreShop/pull/1910) -- [FrontendBundle] logo in _header.html.twig no longer hardcoded (https://github.com/coreshop/CoreShop/pull/1908) -- [ProductBundle] duplicated unit definition title in product view in admin (https://github.com/coreshop/CoreShop/pull/1894/files) -- [OrderBundle] Fix xvfb error (https://github.com/coreshop/CoreShop/pull/1911) -- [FrontendBundle] fix: paginator prev/next links point to first/last page (https://github.com/coreshop/CoreShop/pull/1923) -- [CoreBundle] fix currency conversion (https://github.com/coreshop/CoreShop/pull/1889) -- [FrontendBundle] fix: use only first-level categories in CategoryController::menuAction (https://github.com/coreshop/CoreShop/pull/1914) -- [FrontendBundle] fix configuration for controller names (https://github.com/coreshop/CoreShop/pull/1919) -- [IndexBundle] don't lower-case interpreter types (https://github.com/coreshop/CoreShop/pull/1925) -- [IndexBundle] Category multiselect filter condition (https://github.com/coreshop/CoreShop/pull/1909) -- [PimcoreBundle] make command "coreshop:app:migration:generate" not hidden (https://github.com/coreshop/CoreShop/pull/1927) -- [Installer] mark migrations as migrated in the installer (https://github.com/coreshop/CoreShop/pull/1928) -- [IndexBundle] fix saving quantity values for index conditions ([IndexBundle] fix saving quantity values for index conditions) -- [IndexBundle] Search filter (https://github.com/coreshop/CoreShop/pull/1924) -- [NotificationBundle] fix reloading of Notification Conditions/Actions (https://github.com/coreshop/CoreShop/pull/1930) -- [Slug] fallback to ID if nameForSlug is null (https://github.com/coreshop/CoreShop/pull/1932) -- [ResourceBundle] fix creating static routes (https://github.com/coreshop/CoreShop/pull/1934) -- [FrontendBundle] Cart update and checkout validation for cart (https://github.com/coreshop/CoreShop/pull/1920) -- [FrontendBundle] fix styling of reset-password-request submit button (https://github.com/coreshop/CoreShop/pull/1935) -- [ProductBundle] fix ProductUnitDefinition unmarshal (https://github.com/coreshop/CoreShop/pull/1936) -- [Routing] fix route name coreshop_cart_create_quote (https://github.com/coreshop/CoreShop/pull/1937) -- [IndexBundle] Search filter dynamic name (https://github.com/coreshop/CoreShop/pull/1938) -- [IndexBundle] Fixed wrong categories returned when concatenator is AND (https://github.com/coreshop/CoreShop/pull/1939) -- [CoreBundle] Profiler fix (https://github.com/coreshop/CoreShop/pull/1941) -- [FrontendBundle] Fix redirect to profile if customer is present (https://github.com/coreshop/CoreShop/pull/1942/files) -- [MoneyBundle] allow Money to be nullable (https://github.com/coreshop/CoreShop/pull/1949) -- [Pimcore] use min Pimcore 10.3 and fix tests ([Pimcore] use min Pimcore 10.3 and fix tests) -- [Quotes] introduce simple state machine (https://github.com/coreshop/CoreShop/pull/1948) -- [FrontendBundle] Add submit buttons for voucher submit and form update in cart form (https://github.com/coreshop/CoreShop/pull/1950) -- [NotificationBundle] fix saving multiple emails (https://github.com/coreshop/CoreShop/pull/1954) -- - - -### 3.0.0-beta.2 - -- [Order] remove unused CartRepository (https://github.com/coreshop/CoreShop/pull/1801) -- [PimcoreBundle] add coreshop:migration:migrate and coreshop:migration:generate (https://github.com/coreshop/CoreShop/pull/1802) -- [FrontendBundle] fix new form namespace (https://github.com/coreshop/CoreShop/pull/1807) -- [Index] make ListingInterface a Pimcore PaginateListingInterface (https://github.com/coreshop/CoreShop/pull/1790) -- [Cart] fix existing cart initialization on customer login (https://github.com/coreshop/CoreShop/pull/1779) -- [CoreBundle] fix saving stores in PaymentProvider (https://github.com/coreshop/CoreShop/pull/1783) -- [Index] make IndexProcess compatible with the interface (https://github.com/coreshop/CoreShop/pull/1782) -- [User] remove md5 password and use password_hash (https://github.com/coreshop/CoreShop/pull/1780) -- [ThemeBundle] refactor theme-context to work with area-bricks (https://github.com/coreshop/CoreShop/pull/1778) -- [ThemeBundle] remove sylius theme-aware-translator, that doesn't work well with Pimcore (https://github.com/coreshop/CoreShop/pull/1777) -- [ResourceBundle] allow easier custom resources (https://github.com/coreshop/CoreShop/pull/1776) -- [Index] remove dbal connection in AbstractListing (https://github.com/coreshop/CoreShop/pull/1769) -- [Store select / multiselect] Support getOptions() via option provider (https://github.com/coreshop/CoreShop/pull/1773) -- [CoreExtensions] refactor how Doctrine Entities are cloned (https://github.com/coreshop/CoreShop/pull/1770) -- [Faker] use fakerphp/faker (https://github.com/coreshop/CoreShop/pull/1768) -- [CoreBundle] remove duplicate paymentTotal and convertedPaymentTotal from class definition (https://github.com/coreshop/CoreShop/pull/1766) -- [OrderBundle] fix admin en translations (https://github.com/coreshop/CoreShop/pull/1764) -- [All] remove installed translations and use symfony translations instead (https://github.com/coreshop/CoreShop/pull/1762) - -### 3.0.0-beta.1 - -- PHP8.0 Return Types (https://github.com/coreshop/CoreShop/pull/1288, https://github.com/coreshop/CoreShop/pull/1666) -- Cart eq Order eq Quote - one Object to rule them all (https://github.com/coreshop/CoreShop/pull/1289) -- Strict Types (https://github.com/coreshop/CoreShop/pull/1294) -- make service-aliases deprecated and change all internal uses of it (https://github.com/coreshop/CoreShop/pull/1320) -- change IndexableInterface and pass IndexInterface (https://github.com/coreshop/CoreShop/pull/1326) -- remove php template helpers (https://github.com/coreshop/CoreShop/pull/1323) -- [Panther] Implement ui-tests (https://github.com/coreshop/CoreShop/pull/1335, https://github.com/coreshop/CoreShop/pull/1347) -- introduce class translations (https://github.com/coreshop/CoreShop/pull/1349) -- change cart/order base-currency conversion (https://github.com/coreshop/CoreShop/pull/1324) -- Allow to create a new Customer within the order-creation Process (https://github.com/coreshop/CoreShop/pull/1236) -- introduce currency fraction display provider service (https://github.com/coreshop/CoreShop/pull/1394) -- introduce tax-display service (https://github.com/coreshop/CoreShop/pull/1393) -- integration to dachcom-digital/pimcore-seo (https://github.com/coreshop/CoreShop/pull/1399) -- remove usage of ItemKeyTransformer Service and use DataObject\Service directly (https://github.com/coreshop/CoreShop/pull/1411) -- create default address if customer doesn't have one (https://github.com/coreshop/CoreShop/pull/1435) -- apply confirm and pay transition for orders with value of 0 (https://github.com/coreshop/CoreShop/pull/1434) -- resolve theme only if not in admin (https://github.com/coreshop/CoreShop/pull/1505) -- Pimcore X Compatibility (https://github.com/coreshop/CoreShop/pull/1511, https://github.com/coreshop/CoreShop/pull/1574, https://github.com/coreshop/CoreShop/pull/1599, https://github.com/coreshop/CoreShop/pull/1621) -- migrate to sylius/theme-bundle (https://github.com/coreshop/CoreShop/pull/1513) -- implement new JS Routing and start with first backend tests (https://github.com/coreshop/CoreShop/pull/1420) -- some JMS fixes and payum concurrency test (https://github.com/coreshop/CoreShop/pull/1550) -- cleanup proposal stuff and fix serialization of Doctrine collections (https://github.com/coreshop/CoreShop/pull/1641) -- migrate migrations to Doctrine Migrations Bundle (https://github.com/coreshop/CoreShop/pull/1635) -- Feature/customer list (https://github.com/coreshop/CoreShop/pull/1667) -- Fix merge for index-conditions (https://github.com/coreshop/CoreShop/pull/1673) -- fix voucher modifier with empty voucher code (https://github.com/coreshop/CoreShop/pull/1672) -- [ResourceBundle] fix unserialization of CoreShop entities saved by pimcore auto save (https://github.com/coreshop/CoreShop/pull/1674) -- split customer and user into seperate entities (https://github.com/coreshop/CoreShop/pull/1669) -- add proper events for cart-item add and remove (https://github.com/coreshop/CoreShop/pull/1676) -- Introduce a folder creation service which loads the paths directly from the metadata (https://github.com/coreshop/CoreShop/pull/1677) -- Introduce payum payment bundle (https://github.com/coreshop/CoreShop/pull/1675) -- [Slug] default generate slugs and use instead of static routes for product and category (https://github.com/coreshop/CoreShop/pull/1678, https://github.com/coreshop/CoreShop/pull/1701) -- [FrontendBundle] Macro "price" is not defined in template (https://github.com/coreshop/CoreShop/pull/1684) -- [SEO - ImageExtractor] Add thumbnail definition coreshop_seo (https://github.com/coreshop/CoreShop/pull/1688) -- [Shipping] Ability to hide carrier from checkout (https://github.com/coreshop/CoreShop/pull/1693) -- [Psalm] Introduce Psaml Tests for Components (https://github.com/coreshop/CoreShop/pull/1727) -- Removed security.yaml, since Pimcore 10, you have to define the security config yourself, just copy following to config/packages/security.yaml (https://github.com/coreshop/CoreShop/pull/1599) - -```yaml -parameters: - coreshop.security.frontend_regex: "^/(?!admin)[^/]++" - -security: - providers: - coreshop_customer: - id: CoreShop\Bundle\CoreBundle\Security\ObjectUserProvider - firewalls: - coreshop_frontend: - anonymous: ~ - provider: coreshop_customer - pattern: '%coreshop.security.frontend_regex%' - context: shop - form_login: - login_path: coreshop_login - check_path: coreshop_login_check - provider: coreshop_customer - failure_path: coreshop_login - default_target_path: coreshop_index - use_forward: false - use_referer: true - remember_me: - secret: "%secret%" - name: APP_CORESHOP_REMEMBER_ME - lifetime: 31536000 - remember_me_parameter: _remember_me - logout: - path: coreshop_logout - target: coreshop_login - invalidate_session: false - success_handler: CoreShop\Bundle\CoreBundle\EventListener\ShopUserLogoutHandler - - access_control: - - { path: "%coreshop.security.frontend_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } - - { path: "%coreshop.security.frontend_regex%/_partial", role: ROLE_NO_ACCESS } - -``` - - -## 2.2.x - -### 2.2.14 -- Bugs: - - [ProductQuantityPriceRules] remove variable variables sign (https://github.com/coreshop/CoreShop/pull/1991) - -### 2.2.13 -- Bugs: - - [ResourceBundle] fix ResourceSettingsController getConfigAction (https://github.com/coreshop/CoreShop/pull/1981) - -### 2.2.12 -- Bugs: - - [FrontendBundle] Fix "Invoice Address is Shipping Address" in checkout address step (https://github.com/coreshop/CoreShop/pull/1823) - - [OrderBundle] cart context returns latest cart even if multiple found (https://github.com/coreshop/CoreShop/pull/1837) - - [FrontendBundle] Password reset: Clearer form labels (https://github.com/coreshop/CoreShop/pull/1855) - - [ResourceBundle] Fatal error when saving object with product-specific prices -> EntityMerger got object of wrong class (https://github.com/coreshop/CoreShop/pull/1864) - - [ProductBundle] Add isEqual() for product-specific price (https://github.com/coreshop/CoreShop/pull/1844) - - [Pimcore] Fix delete icons in Pimcore backend (https://github.com/coreshop/CoreShop/pull/1885) - -### 2.2.11 -- Bugs: - - [CoreExtensions] refactor how Doctrine Entities are cloned (https://github.com/coreshop/CoreShop/pull/1770) - - [Frontend] After renaming formtypes with coreshop[], form elements where not found (https://github.com/coreshop/CoreShop/pull/1791) - - [Checkout] fix new form namespace (https://github.com/coreshop/CoreShop/pull/1807) - -### 2.2.10 -- Bugs: - - [Shipping] make shipping calculation more independent from cart (https://github.com/coreshop/CoreShop/pull/1562) - - [PaymentBundle] Add PaymentProvider Multiselect CoreExtension (https://github.com/coreshop/CoreShop/pull/1585) - - [Address] prevent empty lines in address formatter (https://github.com/coreshop/CoreShop/pull/1587/files) - - [Core] remove country-aware currency context as it messes with the Storage Based Currency Context (https://github.com/coreshop/CoreShop/pull/1588) - - [DoctrineCache] remove doctrine cache and all usages of useQueryCache and useResultCache (https://github.com/coreshop/CoreShop/pull/1596) - - [FrontendBundle] use named forms where applicable (https://github.com/coreshop/CoreShop/pull/1597) - - [All] Add italian translations for validators (https://github.com/coreshop/CoreShop/pull/1595) - - [PaymentBundle] Fix provider multiselect (https://github.com/coreshop/CoreShop/pull/1601) - - [IndexBundle] Fix range filter to work if min/max value = 0 (https://github.com/coreshop/CoreShop/pull/1606) - - [Docs] Fixed typo (https://github.com/coreshop/CoreShop/pull/1608) - - [FrontendBundle] clear password reset hash after reset (https://github.com/coreshop/CoreShop/pull/1631) - - [ShippingBundle] fix configuration (https://github.com/coreshop/CoreShop/pull/1632) - - [PimcoreBundle] fix missing Multiselect (https://github.com/coreshop/CoreShop/pull/1614) - - [Fixtures] fix region_short for address format (https://github.com/coreshop/CoreShop/pull/1636) - - [Docs] Add missing process conditions in docs (https://github.com/coreshop/CoreShop/pull/1643) - - [FrontendBundle] fix having unique form-ids for cart add (https://github.com/coreshop/CoreShop/pull/1648) - - [Core] fix cloning and serializing (with DeepCopy) of UnitDefinitions (https://github.com/coreshop/CoreShop/pull/1649) - - [Tracking] enable auto-configuration and auto-wiring with configuration (https://github.com/coreshop/CoreShop/pull/1656) - - [Rule] refactor Rule conditions and actions persistence (https://github.com/coreshop/CoreShop/pull/1657) - - [OrderBundle] fix pagination in voucher codes and add pagination for csv export (https://github.com/coreshop/CoreShop/pull/1662) - - [CoreBundle] remove zones from shipping rules installer (https://github.com/coreshop/CoreShop/pull/1664) - - [IndexBundle] add feature to rename tables when index get's renamed (https://github.com/coreshop/CoreShop/pull/1663) - - [FrontendBundle] Print cart price rule label instead name if available (https://github.com/coreshop/CoreShop/pull/1668) - - [Tests] Add Pimcore ~6.9.0 in behat test matrix (https://github.com/coreshop/CoreShop/pull/1670) - - [CoreBundle] Use right permission for tax rate (https://github.com/coreshop/CoreShop/pull/1681) - - [SEO] Add thumbnail definition coreshop_seo (https://github.com/coreshop/CoreShop/pull/1688) - - [Core] Fix: ProductRepository: Added missing placeholder (https://github.com/coreshop/CoreShop/pull/1708) - - [Docs] Quantity Price Rules (https://github.com/coreshop/CoreShop/pull/1716) - - [PimcoreBundle] super-select box readonly (https://github.com/coreshop/CoreShop/pull/1739) - -- Feature: - - [ProductQuantityPriceRules] add interface for QuantityPriceFetcher and QuantityRuleFetcher (https://github.com/coreshop/CoreShop/pull/1628) - - [Payment] make payment description translatable (https://github.com/coreshop/CoreShop/pull/1633) - -### 2.2.9 -- Bugs: - - [ResourceBundle] fix compatibility with Doctrine EventSubscriber (https://github.com/coreshop/CoreShop/pull/1580) - - [All] replace all usages of href with manyToOneRelation and multihref with manyToManyRelation (https://github.com/coreshop/CoreShop/pull/1576) - - [OptimisticEntityLockBundle] fix version for Pimcore Extensions UI (https://github.com/coreshop/CoreShop/pull/1577) - - [Models] strict defining of model trait methods (https://github.com/coreshop/CoreShop/pull/1578) - - [ProductBundle] use full unit definition label in choice field (https://github.com/coreshop/CoreShop/pull/1569) - - [ResourceBundle] check if instance is null before calling class_implements (https://github.com/coreshop/CoreShop/pull/1566) - - [Admin] use form.Panel instead of form.FieldSet (panel supports isDirty) (https://github.com/coreshop/CoreShop/pull/1561) - - [Resource] Provide Pimcore driver for Stack Repository (https://github.com/coreshop/CoreShop/pull/1567) - - [StoreBundle] fix cached store context decoration (https://github.com/coreshop/CoreShop/pull/1565) - - [Mailer] remove usages of PimcoreBundle\MailerInterface and fix interface deprecation (https://github.com/coreshop/CoreShop/pull/1568) - -### 2.2.8 -- Bugs: - - [OptimisticEntityLockBundle] fix Version loading with Composer v3 (https://github.com/coreshop/CoreShop/pull/1558) - -### 2.2.7 -- Features: - - [OptimisticLock] allow to optimistically lock Pimcore DataObjects (https://github.com/coreshop/CoreShop/pull/1537) - - [Pimcore] introduce DataObjectBatchListing (https://github.com/coreshop/CoreShop/pull/1519) - -- Bugs: - - [Payment] Concurrency issues (https://github.com/coreshop/CoreShop/issues/1536, https://github.com/coreshop/CoreShop/pull/1549) - - [Frontend] fix addressAccessType check and improve view (https://github.com/coreshop/CoreShop/pull/1544) - - [Payment] Payment Details can be null (https://github.com/coreshop/CoreShop/issues/1545) - - [ProductBundle] fix UnitDefinition without id (https://github.com/coreshop/CoreShop/pull/1547) - - [Order] fix payment provider (https://github.com/coreshop/CoreShop/pull/1548) - - [Payment] ignore failed payments in total amount check (https://github.com/coreshop/CoreShop/pull/1543) - - [Checkout] Fix checkout with addressAccessType COMPANY_ONLY (https://github.com/coreshop/CoreShop/pull/1526) - - [CompilerPass] rework compiler passes (simplify) (https://github.com/coreshop/CoreShop/pull/1535) - - [Admin Order detail] Carrier name not shown with legacy serialization of Orders (https://github.com/coreshop/CoreShop/issues/1540) - - [composer2] make getVersion compatible (https://github.com/coreshop/CoreShop/pull/1539) - - [DynmicDropdown] support class override and fix order by id (https://github.com/coreshop/CoreShop/pull/1538) - - [DeepCopy] Order details are no longer working (https://github.com/coreshop/CoreShop/issues/1507, https://github.com/coreshop/CoreShop/pull/1534) - - [OrderBundle] fix voucher code export (https://github.com/coreshop/CoreShop/pull/1530) - - [Resources] Reset Id on __clone (https://github.com/coreshop/CoreShop/issues/1501, https://github.com/coreshop/CoreShop/pull/1502) - - [Document] Document saving failed (https://github.com/coreshop/CoreShop/issues/1498, https://github.com/coreshop/CoreShop/pull/1518) - - [Admin] fix payment details in backend order view (https://github.com/coreshop/CoreShop/pull/1525) - - [Notification] fix return of store on notification rule (https://github.com/coreshop/CoreShop/pull/1520) - - [Locale] Fix PSR-4 namespace (https://github.com/coreshop/CoreShop/pull/1509) - -- Docs: - - [Docs] add docu for product units (https://github.com/coreshop/CoreShop/pull/1551) - -- Tests: - - [Actions] add tests for packages (https://github.com/coreshop/CoreShop/pull/1542) - -### 2.2.6 -- Bugs: - - [Product] fix cloning of ProductUnitDefinitions and add test for it. (https://github.com/coreshop/CoreShop/pull/1502) - - [CoreBundle] interactive login: cart might not be available for several reasons, ignore exception and don't assign a cart (https://github.com/coreshop/CoreShop/pull/1500) - -### 2.2.5 -- Bugs: - - [OrderBundle] fix permission keys for order-creation (https://github.com/coreshop/CoreShop/pull/1474) - - [ProductBundle] fix persistance of spefiic-product-price-rule label (https://github.com/coreshop/CoreShop/pull/1472) - - [OrderBundle] remove 'applyOn' from DiscountPercent and SurchagePercent (https://github.com/coreshop/CoreShop/pull/1479) - - [QPR] Wrong Pseudo-Price in Grid-View (https://github.com/coreshop/CoreShop/issues/1488) - - [Pimcore] fix hasDefinition with pimcore.implementation_loader.document.tag (https://github.com/coreshop/CoreShop/pull/1490) - - [OrderBundle, LocaleBundle] fix backend order-creation localeCode selection (https://github.com/coreshop/CoreShop/pull/1481) - - [CoreBundle] fix setting price-values for inherited store-values (https://github.com/coreshop/CoreShop/pull/1491) - - [CoreBundle] don't set product for store-values on pre-get-data (https://github.com/coreshop/CoreShop/pull/1492) - -- Features: - - [Core] pass cart-item to price calculation context (https://github.com/coreshop/CoreShop/pull/1482) - - [Index] allow to define column config with index-extensions (https://github.com/coreshop/CoreShop/pull/1494) - -### 2.2.4 -- Bugs: - - [CoreBundle] Don't validate maximum or minimum order quantity when value is 0 (https://github.com/coreshop/CoreShop/issues/1467, https://github.com/coreshop/CoreShop/pull/1468) - - [Specific Price Rule] Unable to edit saved rule (https://github.com/coreshop/CoreShop/issues/1437, https://github.com/coreshop/CoreShop/pull/1452) - - [Pimcore] Fix Ext Item Selector (https://github.com/coreshop/CoreShop/pull/1465) - - [Core, Order] fix surchage amount processor and remove apply-on (https://github.com/coreshop/CoreShop/pull/1462) - - [All] fix for copying data-objects with complex doctrine entities (https://github.com/coreshop/CoreShop/pull/1404) - - [CoreBundle] fix installation of address format (https://github.com/coreshop/CoreShop/pull/1455, https://github.com/coreshop/CoreShop/issues/1432) - - [Orders] Unable to edit grid options to add/remove fields (https://github.com/coreshop/CoreShop/issues/1438, https://github.com/coreshop/CoreShop/pull/1454) - - [Voucher] Voucher code generator returns always the same code (https://github.com/coreshop/CoreShop/issues/1448, https://github.com/coreshop/CoreShop/pull/1451) - - [ProductBundle] fix serialization of translation labels in product-price rules (https://github.com/coreshop/CoreShop/pull/1447) - -- Features: - - [OrderBundle] check if generation of a certain amount of codes is possible before actually generating them (https://github.com/coreshop/CoreShop/pull/1456, https://github.com/coreshop/CoreShop/issues/1453) - -### 2.2.3 -- Bugs: - - [FrontendBundle] apply confirm and pay transition for orders with value of 0 (https://github.com/coreshop/CoreShop/pull/1442) - - [Core] create default address if customer doesn't have one (https://github.com/coreshop/CoreShop/pull/1444) - - [OrderBundle] Values should be zero, if amount should not be defined (https://github.com/coreshop/CoreShop/pull/1443) - - [OrderBundle] Voucher Credit and Tax rounding issue (https://github.com/coreshop/CoreShop/pull/1441) - - [OrderBundle] Add currency property (https://github.com/coreshop/CoreShop/pull/1436) - - [Docs] Fix typo in the docs (https://github.com/coreshop/CoreShop/pull/1426) - - [CoreBundle] assert default address type (https://github.com/coreshop/CoreShop/pull/1440, https://github.com/coreshop/CoreShop/issues/1257) - -- Features: - - [OrderBundle] Voucher Credit and Tax rounding issue (https://github.com/coreshop/CoreShop/pull/1441) - -### 2.2.2 -- Bugs: - - [IndexBundle] fix range filter condition (https://github.com/coreshop/CoreShop/pull/1416, https://github.com/coreshop/CoreShop/issues/1387) - - [OrderBundle] Fix currency formatting in sale detail related components (https://github.com/coreshop/CoreShop/pull/1421) - - [OrderBundle] Fix order expire command (https://github.com/coreshop/CoreShop/pull/1422) - - [Product] re-add id reset on entity clone (https://github.com/coreshop/CoreShop/pull/1419) - - [ProductBundle] fix quantity price rule condition (https://github.com/coreshop/CoreShop/pull/1412) - - [Installer] fix output of thumbnail installer (https://github.com/coreshop/CoreShop/pull/1413) - - [IndexBundle] fix saving of nested filters (https://github.com/coreshop/CoreShop/pull/1415, https://github.com/coreshop/CoreShop/issues/1414) - - [CoreBundle] fix typo in query condition to fetch product variants (https://github.com/coreshop/CoreShop/pull/1418) - - [FrontendBundle] Fixed issue with saving address changes (https://github.com/coreshop/CoreShop/pull/1408) - - [RuleBundle] improve dirty detection (https://github.com/coreshop/CoreShop/pull/1410) - - [CurrencyBundle] fix cache issue with money-currency type (https://github.com/coreshop/CoreShop/pull/1406) - - [QuantityPriceRules] fix decimal precision display (https://github.com/coreshop/CoreShop/pull/1398, https://github.com/coreshop/CoreShop/issues/1395) - -- Features: - - [FrontendBundle] add italian translations (https://github.com/coreshop/CoreShop/pull/1417) big thanks to @ramundomario - -### 2.2.1 -- Bugs: - - [CoreBundle] fix registration service (https://github.com/coreshop/CoreShop/pull/1391) - - [CoreBundle] fix validation groups (https://github.com/coreshop/CoreShop/pull/1390) - - [PimcoreBundle] Dynamic Dropdowns Issues (https://github.com/coreshop/CoreShop/issues/1380, https://github.com/coreshop/CoreShop/pull/1382) - - [FrontendBundle] revert url-forward, doesn't work for all cases (https://github.com/coreshop/CoreShop/pull/1386, https://github.com/coreshop/CoreShop/issues/1383) - -### 2.2.0 -- Features: - - [Order] don't allow order-revise when completed payment has been made (https://github.com/coreshop/CoreShop/pull/1334) - - [Order] persist internal cancellation reasons (https://github.com/coreshop/CoreShop/pull/1333) - - [Pimcore] require min 6.6 (https://github.com/coreshop/CoreShop/pull/1338) - - [GithubAction] add stan test (https://github.com/coreshop/CoreShop/pull/1341) - - [OrderBundle] show price rules without tax in backend (https://github.com/coreshop/CoreShop/pull/1346) - - [ThemeBundle] introduce theme inheritance (https://github.com/coreshop/CoreShop/pull/1353, https://github.com/coreshop/CoreShop/pull/1359) - - [Order] introduce paymentTotal Property to store the rounded payment value with a precision of 2 (https://github.com/coreshop/CoreShop/pull/1360) - - [Order] use Javascript intl for currency format (https://github.com/coreshop/CoreShop/pull/1366) - - [FrontendBundle] allow preview from admin-mode and redirect to right URL if wrong (https://github.com/coreshop/CoreShop/pull/1367) - -- Bugs: - - [SecurityValidator] only trigger when Pimcore Frontend request (https://github.com/coreshop/CoreShop/pull/1339) - - [PimcoreBundle] Fix loading dynamic dropdown options (https://github.com/coreshop/CoreShop/pull/1340) - - [PimcoreBundle] fix dynamic dropdown extensions (https://github.com/coreshop/CoreShop/pull/1337) - - [PimcoreBundle] Fix data persistence for class definition and database (https://github.com/coreshop/CoreShop/pull/1343) - - [PimcoreBundle] add dependency resolving (https://github.com/coreshop/CoreShop/pull/1348) - - [CoreBundle] add missing alias for taxed product price calculator (https://github.com/coreshop/CoreShop/pull/1355) - - [Migration] move migration before other migration in order to avoid missing db columns (https://github.com/coreshop/CoreShop/pull/1356) - - [Payment] Revert "decouple Payment from Payum and consider decimal factor" (https://github.com/coreshop/CoreShop/pull/1358) - - [Pimcore] fix getDataForEditmode (https://github.com/coreshop/CoreShop/pull/1361) - - [ThemeBundle] fix pimcore bc-break (https://github.com/coreshop/CoreShop/pull/1363) - - [Product] serialize stopPropogation property (https://github.com/coreshop/CoreShop/pull/1365) - - [Product] fix null value for pricing (https://github.com/coreshop/CoreShop/pull/1370) - - [ResourceBundle] ignore length for name of CoreShop doctrine assets (also fixes the error on cancel) (https://github.com/coreshop/CoreShop/pull/1369) - - [CoreBundle] only show restore-inheritance when actually inheritable (https://github.com/coreshop/CoreShop/pull/1368) - - -### 2.2.0-RC.2 -- Features: - - [IndexBundle] allow configuring if versions should be indexed or not (https://github.com/coreshop/CoreShop/pull/1303) - - [IndexBundle] add possibility to store extra information into relational table (https://github.com/coreshop/CoreShop/pull/1306) - - [Pimcore] Compatibility with Pimcore 6.5.3 (https://github.com/coreshop/CoreShop/pull/1310) - - [Shipping] Calculate shipping tax using cart items (https://github.com/coreshop/CoreShop/pull/1283) - - [Doctrine] remove usage of deprecated merge (https://github.com/coreshop/CoreShop/pull/1314) - - [Docs] Add Documentation for Unit Definitions (https://github.com/coreshop/CoreShop/pull/1312) - - [Payment] decouple Payment from Payum and consider decimal factor (https://github.com/coreshop/CoreShop/pull/1021) - - [Installer] change installer colors (https://github.com/coreshop/CoreShop/pull/1325) - - [Github Actions] introduce testing with Github Actions (https://github.com/coreshop/CoreShop/pull/1329) - -- Bugs: - - [CoreBundle] fix typo in validation groups and fix guest-registration type (https://github.com/coreshop/CoreShop/pull/1304) - - [Frontend] Fixes the category items-per-page dropdown in the frontend (https://github.com/coreshop/CoreShop/pull/1313) - - [Customer] fix missing username field (https://github.com/coreshop/CoreShop/pull/1315) - - [FrontendBundle/CoreBundle] prevent _fragment calls by using ACL's (https://github.com/coreshop/CoreShop/pull/1309) - - [Reports] fix export params (https://github.com/coreshop/CoreShop/pull/1328) - -### 2.2.0 -- Features: - - [Core] Implement Username/Email Login Identifier @solverat (https://github.com/coreshop/CoreShop/issues/1290, https://github.com/coreshop/CoreShop/pull/1291) - - [Pimcore] require min Pimcore 6.5 (https://github.com/coreshop/CoreShop/pull/1286) - - [Core] Company - Customer Workflow @solverat (https://github.com/coreshop/CoreShop/issues/1266, https://github.com/coreshop/CoreShop/pull/1284) - - [Scrutinizer] remove unused-code (https://github.com/coreshop/CoreShop/pull/1226) - - [STAN] fixes (https://github.com/coreshop/CoreShop/pull/1239) - - [PHPStan] level-3 (https://github.com/coreshop/CoreShop/pull/1220) - - [Pimcore] remove pimcore bc layers (https://github.com/coreshop/CoreShop/pull/1221) - - [CoreBundle] support version marshall und unmarshall to merge with existing data (https://github.com/coreshop/CoreShop/pull/1145) -- Bugs: - - [CoreExtensions] fix issue with CoreShop CoreExtensions Recycle Bin (https://github.com/coreshop/CoreShop/pull/1254) - - -## 2.1.x - -### 2.1.9 -- Bugs: - - [OrderBundle] fix usage of inherited values in backend-cart/order controllers (https://github.com/coreshop/CoreShop/pull/1461, https://github.com/coreshop/CoreShop/issues/1459) - -### 2.1.8 -- Bugs: - - [ResourceBundle] Fix unique entity validator (https://github.com/coreshop/CoreShop/pull/1385) - - [DataHub] fix integration (https://github.com/coreshop/CoreShop/pull/1389) - -- Features: - - [WorkflowBundle] Add enabled option to workflow callbacks (https://github.com/coreshop/CoreShop/pull/1392) - -### 2.1.7 -- Bugs: - - [Pimcore] fix getDataForEditmode (https://github.com/coreshop/CoreShop/pull/1372, https://github.com/coreshop/CoreShop/pull/1361) - -### 2.1.6 -- Bugs: - - [CoreBundle][2.1] Fix name of country combo (https://github.com/coreshop/CoreShop/pull/1350) - -### 2.1.5 -- Bugs: - - [Translations] fix: add missing translation (https://github.com/coreshop/CoreShop/pull/1308) - - [IndexBundle] index ui improvements (https://github.com/coreshop/CoreShop/pull/1300) - - [ThemeBundle] fix configuration for default resolvers (https://github.com/coreshop/CoreShop/pull/1301) - - [AddressBundle] introduce filter-active action and filter store-base countries by those (https://github.com/coreshop/CoreShop/pull/1302) - -### 2.1.4 -- Feature: - - [CoreBundle] allow store-values to be reset and inherit again (https://github.com/coreshop/CoreShop/pull/1273) -- Bugs: - - [IndexBundle] Change return type of WorkerInterface::getList (https://github.com/coreshop/CoreShop/pull/1280) - - [ThemeBundle] fix default theme-resolvers (https://github.com/coreshop/CoreShop/pull/1281) - - [Pimcore] make compatible with Pimcore 6.5 (https://github.com/coreshop/CoreShop/pull/1285) - - [Core] fix bug where we calculated item-discount and item-discount-prices (https://github.com/coreshop/CoreShop/pull/1293) - -### 2.1.3 -- Bugs: - - [Address, Order, Core] fix release (https://github.com/coreshop/CoreShop/pull/1269) - -### 2.1.2 -- Features: - - [FrontendBundle] Change function from private to protected (https://github.com/coreshop/CoreShop/pull/1248) - - [Installer] update logo (https://github.com/coreshop/CoreShop/pull/1264) - - [Cart] introduce cart-context resolver to allow better extendability of the context used for the cart (https://github.com/coreshop/CoreShop/pull/1267) - -- Bugs: - - [ThemeBundle] fix Undefined index: default_resolvers (https://github.com/coreshop/CoreShop/pull/1235) - - [IndexBundle] $indexIds is always an array, hence the condition is now empty (https://github.com/coreshop/CoreShop/pull/1241) - - [Stan] fixes for 2.1 (https://github.com/coreshop/CoreShop/pull/1244) - - [CurrencyBundle] fix money-currency type is rounding prices wrong (https://github.com/coreshop/CoreShop/pull/1238) - - [CoreBundle] Change repository so that unit definition deletion works with multiple product models (https://github.com/coreshop/CoreShop/pull/1252) - - [Order] fix throwing/catching right exceptions in purchasable calculalator (https://github.com/coreshop/CoreShop/pull/1250) - - [Core] allow non QuantityPriceRangeAware Products in cart-processor (https://github.com/coreshop/CoreShop/pull/1249) - - [IndexBundle] fix index columns form (https://github.com/coreshop/CoreShop/pull/1259) - - [Country] don't call the request based resolvers every time (https://github.com/coreshop/CoreShop/pull/1261) - -### 2.1.1 -- Features: - - [CoreBundle] Implement Variant Unit and QPR Solidifier (https://github.com/coreshop/CoreShop/issues/1157) - - [AddressBundle] Improve Country Address Formatting (https://github.com/coreshop/CoreShop/pull/1153) - - [OrderBundle] properly implement AddMultipleToCart (https://github.com/coreshop/CoreShop/pull/1154) - - [IndexBundle] allow to query relations also by relation type (https://github.com/coreshop/CoreShop/pull/1156) - - [SEOBundle] add priority to extractors (https://github.com/coreshop/CoreShop/pull/1155) - - [QuantityPriceRules] Allow Object Deletion without removing QPR first (https://github.com/coreshop/CoreShop/issues/1160) - - [CoreBundle] Improve Unit Definition <=> QPR Dependency (https://github.com/coreshop/CoreShop/pull/1161) - - [StorageList] introduce service to resolve if cart-items are equal (https://github.com/coreshop/CoreShop/pull/1188) - - [OrderBundle] Allow Item Data per Row in Order Overview (https://github.com/coreshop/CoreShop/pull/1193) - - [OrderBundle] add sale-detail event (https://github.com/coreshop/CoreShop/pull/1192) - - [IndexBundle] Argument for re-index command (https://github.com/coreshop/CoreShop/pull/1219) - - [CoreBundle] Maximum Quantity to Order (https://github.com/coreshop/CoreShop/issues/1209) - -- Bugs: - - [StoreBundle] add missing store dependency (https://github.com/coreshop/CoreShop/pull/1159) - - [Install] add dummy migration (https://github.com/coreshop/CoreShop/pull/1172) - - [CoreBundle] Remove Store Values after Store has been removed (https://github.com/coreshop/CoreShop/pull/1171) - - [Order] Fix Character Length Count in Voucher Code Generator (https://github.com/coreshop/CoreShop/pull/1194/files) - - [Order] fix item price for items without tax-rule (https://github.com/coreshop/CoreShop/pull/1200) - - [TRACKING] use single item price in order item extractor (https://github.com/coreshop/CoreShop/pull/1232) - -### 2.1.0 -- If you have a custom validation File for *AddToCart* or *Cart*, make sure to use the new 2 MinimumQuantity and MaximumQuantity Constraints. Otherwise it will happen that a validation is triggered twice. - -### 2.1.0 -- Bugs: - - [ThemeBundle] add missing dependency to pimcore-bundle (https://github.com/coreshop/CoreShop/pull/1138, https://github.com/coreshop/CoreShop/pull/1140) - - [ResourceBundle] fix naming of parameter sortBy (https://github.com/coreshop/CoreShop/pull/1132) - - [Quantity Price Rules] Check Inherited Product Quantity Price Range Data (https://github.com/coreshop/CoreShop/pull/1143) - - [FrontendBundle] allow usage of auto-wired Frontend Controllers (https://github.com/coreshop/CoreShop/pull/1141) - - [OrderBundle] CartItem Quantity has to be > 0 (https://github.com/coreshop/CoreShop/pull/1144) - -### 2.1.0-rc.2 -- Features: - - [IndexBundle] allow for more complex doctrine types in index (https://github.com/coreshop/CoreShop/pull/1110) - - [IndexBundle] add Select and Multiselect Filter Processor from Multiselect (https://github.com/coreshop/CoreShop/pull/1111) - - [Autowire] improvement: allow service registries to be autowired (https://github.com/coreshop/CoreShop/pull/1113, https://github.com/coreshop/CoreShop/pull/1116, https://github.com/coreshop/CoreShop/pull/1122) - - [QuantityPriceRules] allow price range ordering @solverat (https://github.com/coreshop/CoreShop/pull/1121) - - [Payment] Fix payment provider logo @davidhoeck (https://github.com/coreshop/CoreShop/pull/1124) - - [ResourceBundle, OrderBundle, CoreBundle] introduce more memory efficient (https://github.com/coreshop/CoreShop/pull/1126, https://github.com/coreshop/CoreShop/pull/1129) - - [Shipping, ShippingBundle] Add logo field to carrier @davidhoeck (https://github.com/coreshop/CoreShop/pull/1127) - - - -- Bugs: - - [Tests] exit code (https://github.com/coreshop/CoreShop/pull/1119) - - [Tracking] remove decimal factor multiplier in order extractor @solverat (https://github.com/coreshop/CoreShop/pull/1128) - - [QuantityPriceRules] Move migration for Quantity Rule Range Unit to Sales Unit migration (https://github.com/coreshop/CoreShop/pull/1123) - -### 2.1.0 -- BC-Break: Introduced `array $options` parameter into `CoreShop\Component\Index\Listing\ListingInterface` to allow certain variations for loading data - -- Introduced WholesalePrice Calculators, this deprecates the "wholesalePrice" property in the Product Class and adds the "wholesaleBuyingPrice" Property with a currency attached. We've added a migration for that, but since we need a currency now, we just assume the buying currency as the defaults store currency. If you have a different one, create a custom migration that changes it. - -- `CoreShop\Component\StorageList\StorageListModifierInterface` got completely refactored and works a bit different now. Since deciding what StorageListItem belongs to what product, can be a bit more complicated, we decided to introduce a BC break. - - `CoreShop\Component\StorageList\StorageListModifierInterface` added `addToList` function - - `CoreShop\Component\StorageList\StorageListModifierInterface` removed `remove` to `removeFromList` - - `CoreShop\Component\StorageList\Model\StorageListItemInterface` added `equals` function - - `CoreShop\Component\StorageList\Model\StorageListInterface` removed `getItemForProduct` function - - `CoreShop\Component\StorageList\Model\StorageListProductInterface` got deprecated, since not it's not needed anymore -- `CoreShop\Component\Order\Factory\CartItemFactoryInterface` introduced a new function `public function createWithPurchasable(PurchasableInterface $purchasable, $quantity = 1);` - -- Introduced Theme-Bundle to handle Themes (https://github.com/coreshop/CoreShop/pull/749, https://github.com/coreshop/CoreShop/pull/756, https://github.com/coreshop/CoreShop/pull/755) - - deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeHelper](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeHelper.php) in favor of [CoreShop\Bundle\ThemeBundle\Service\ThemeHelper](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeHelper.php) - - deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeHelperInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeHelperInterface.php) in favor of [CoreShop\Bundle\ThemeBundle\Service\ThemeHelperInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeHelperInterface.php) - - deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeResolver.php) in favor of [CoreShop\Bundle\ThemeBundle\Service\ThemeResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeResolver.php) - - deprecated [CoreShop\Bundle\StoreBundle\Theme\ThemeResolverInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/StoreBundle/Theme/ThemeResolverInterface.php) in favor of [CoreShop\Bundle\ThemeBundle\Service\ThemeResolverInterface](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ThemeBundle/Service/ThemeResolverInterface.php) - -- Introduce AddToCartFormType and QuantityType. This allows to use validators to check if its allowed to add a product to the cart. If you update from CoreShop 2.0.* change the add-to-cart form in your templates to the following: (https://github.com/coreshop/CoreShop/pull/812/files#diff-3e06a5f0e813be230a0cd232e916738eL29) (https://github.com/coreshop/CoreShop/pull/812, https://github.com/coreshop/CoreShop/pull/864) - - `{{ render(url('coreshop_cart_add', {'product': product.id})) }}` - - Be sure you have adopted the new form template in `views/Product/_addToCart.html.twig` - -- Introduced Store Unit: (https://github.com/coreshop/CoreShop/pull/877, https://github.com/coreshop/CoreShop/pull/883, https://github.com/coreshop/CoreShop/pull/950, https://github.com/coreshop/CoreShop/pull/902, https://github.com/coreshop/CoreShop/pull/896) - - Please add `product_unit` to permission table. - - Remove `storePrice` field from all product classes - - If you don't use the `Store Price` element in your classes besides the `storePrice` field, you should delete the `coreshop_product_store_price` table after migration. - - We introduced a new jquery plugin `$.coreshopQuantitySelector()` which allows you to add more numeric control to your quantity field, checkout our demo [example](https://github.com/coreshop/CoreShop/blob/7d05ccd89aed99f9fd93c585e096cd1edaf20010/src/CoreShop/Bundle/FrontendBundle/Resources/public/static/js/shop.js#L20). - -- Features: - - *Product Quantity Rules*, big thanks to @solverat (https://github.com/coreshop/CoreShop/pull/791, https://github.com/coreshop/CoreShop/pull/954, https://github.com/coreshop/CoreShop/pull/951, https://github.com/coreshop/CoreShop/pull/898, https://github.com/coreshop/CoreShop/pull/813) - - *Product Units*, big thanks to @solverat (https://github.com/coreshop/CoreShop/pull/861, https://github.com/coreshop/CoreShop/pull/911, https://github.com/coreshop/CoreShop/pull/900, https://github.com/coreshop/CoreShop/pull/897, https://github.com/coreshop/CoreShop/pull/891, https://github.com/coreshop/CoreShop/pull/875) - - *Minimum Order Quantity and Item Quantity Factor* big thanks to @solverat (https://github.com/coreshop/CoreShop/pull/881) - - Introduce Menu Bundle (https://github.com/coreshop/CoreShop/pull/854, https://github.com/coreshop/CoreShop/pull/880, https://github.com/coreshop/CoreShop/pull/878, https://github.com/coreshop/CoreShop/pull/876) - - Introduce Theme Bundle (https://github.com/coreshop/CoreShop/pull/749, https://github.com/coreshop/CoreShop/pull/756, https://github.com/coreshop/CoreShop/pull/755) - - [Store Values] swap store-prices with store-values and make them extendable for custom store values (https://github.com/coreshop/CoreShop/pull/877, https://github.com/coreshop/CoreShop/pull/883, https://github.com/coreshop/CoreShop/pull/950, https://github.com/coreshop/CoreShop/pull/902, https://github.com/coreshop/CoreShop/pull/896) - - [ResourceBundle] Add group to ThumbnailInstaller (https://github.com/coreshop/CoreShop/pull/1017) @AndiKeiser - - [All] AutoWiring (https://github.com/coreshop/CoreShop/pull/850) - - [All] Pimcore 6/Symfony 4 compatibilty (https://github.com/coreshop/CoreShop/pull/996, https://github.com/coreshop/CoreShop/pull/1062, https://github.com/coreshop/CoreShop/pull/1035) - - [Tests] Update to friends-of-behat/symfony-extension:^2.0 (https://github.com/coreshop/CoreShop/pull/1024) - - [Travis] add setup for Pimcore 6 changed system.yml config (https://github.com/coreshop/CoreShop/pull/1029) - - [All] Introduce configurable decimal precision and factor (https://github.com/coreshop/CoreShop/pull/1030) - - [All] change db type for pricing fields to BIGINT (https://github.com/coreshop/CoreShop/pull/1032, https://github.com/coreshop/CoreShop/pull/1098) - - [ShippingBundle] introduce gross/net checkbox for amount condition (https://github.com/coreshop/CoreShop/pull/1042) - - [Graphql] Add Support for Pimcore GraphQl Data Hub (https://github.com/coreshop/CoreShop/pull/1052) - - [Tracking] Add Decimal Precision to Order Extractor (https://github.com/coreshop/CoreShop/pull/1058) - - [MoneyBundle] add fallback in money-bundle for decimal precision (https://github.com/coreshop/CoreShop/pull/1061) - - [Docs] Added visualization for coreshop_order Workflow (https://github.com/coreshop/CoreShop/pull/1067) @davidhoeck - - [Pimcore] add conflict for Pimcore 6.1.0 and Pimcore 6.1.1 (https://github.com/coreshop/CoreShop/pull/1069) - - [Docs] Update 03_Theme.md (https://github.com/coreshop/CoreShop/pull/1072) @D37R4C7 - - [FQCN] FQCN Services (https://github.com/coreshop/CoreShop/pull/1079, https://github.com/coreshop/CoreShop/pull/1084, https://github.com/coreshop/CoreShop/issues/1085, https://github.com/coreshop/CoreShop/pull/1086, https://github.com/coreshop/CoreShop/pull/1090) - - [Product] Unit Definition - Precision (https://github.com/coreshop/CoreShop/pull/1081, https://github.com/coreshop/CoreShop/pull/1091, https://github.com/coreshop/CoreShop/pull/1092) @solverat - - [IndexBundle] split conditions into pre_conditions and user_conditions (https://github.com/coreshop/CoreShop/pull/1055) - - [Quantity Price Rules] Remove "to" field from quantity price range (https://github.com/coreshop/CoreShop/pull/1003, https://github.com/coreshop/CoreShop/pull/1095) - - [Order] Introduce backend cart-creation and cart-details (https://github.com/coreshop/CoreShop/pull/963) - - [PermissionSetup] add category to Permission (https://github.com/coreshop/CoreShop/pull/1101) - - [ShippingBundle] add more carrier price options (https://github.com/coreshop/CoreShop/pull/1015) - - [FrontendBundle] show discount/surcharge label in order overview (https://github.com/coreshop/CoreShop/pull/1006) - - [Index, IndexBundle] allow options for the listing load function (https://github.com/coreshop/CoreShop/pull/1001) - - [ResourceBundle] add connection interface into Pimcore Repository (https://github.com/coreshop/CoreShop/pull/1000) - - [ProductBundle, CoreBundle] set itemQuantityFactor min value to null (https://github.com/coreshop/CoreShop/pull/993) - - [Core] use default unit quanity in onhold inventory (https://github.com/coreshop/CoreShop/pull/990) @solverat - - [Maintenance] refactor to use new maintenance task from pimcore 5.8 (https://github.com/coreshop/CoreShop/pull/986) - - [All] require min Pimcore 5.8 and PHP 7.2 (https://github.com/coreshop/CoreShop/pull/973) - - [CoreBundle] introduce store-preview for products (https://github.com/coreshop/CoreShop/pull/982) - - [Adjustments] remove return type AdjustmentInterface (https://github.com/coreshop/CoreShop/pull/978) @solverat - - [Taxation] fix tax collection on gross values - 2.1 (https://github.com/coreshop/CoreShop/pull/974) - - [Order] introduce translatable cart-price-rules (https://github.com/coreshop/CoreShop/pull/969) - - [WholesaleCalculator] introduce purchasable wholesale calculator (https://github.com/coreshop/CoreShop/pull/957) - - [Product] introduce stop propagation flag for price-rules (https://github.com/coreshop/CoreShop/pull/946) - - [Pimcore] make CoreShop 2.1 compatible with Pimcore 5.7.2 (https://github.com/coreshop/CoreShop/pull/915) - - [CoreBundle] serialize relational values (product and store) as relation (https://github.com/coreshop/CoreShop/pull/916) - - [Core] Disable Customer Deletion if bounded Orders are available (https://github.com/coreshop/CoreShop/pull/732) - - [PriceRules] add priority to product-price-rules (https://github.com/coreshop/CoreShop/pull/905) - - [Product] add translation to product price rules (https://github.com/coreshop/CoreShop/pull/879) - - [All] Min 5.7 (https://github.com/coreshop/CoreShop/pull/871) - - [Core] Refactor how we identify CartItem - Product (https://github.com/coreshop/CoreShop/pull/866) - - [Core/Cart] Refactor add to cart (https://github.com/coreshop/CoreShop/pull/864) - - [Cart] implement add-to-cart as Symfony Form (https://github.com/coreshop/CoreShop/pull/812) - - [Core, Order, Product] throw exceptions for when a price can't be found (https://github.com/coreshop/CoreShop/pull/811) - - [Order] make accessor protected for OrderDocument Processor (https://github.com/coreshop/CoreShop/pull/775) - - [WorkflowBundle, OrderBundle] always load all available coreshop states into js (https://github.com/coreshop/CoreShop/pull/773) - - [Core, Order] also apply discounts to cart-items (https://github.com/coreshop/CoreShop/pull/770) - - [OrderBundle, Pimcore] extract DataLoader from Controller to be used oustide (https://github.com/coreshop/CoreShop/pull/771) - - [OrderBundle] add event to prepare sale in order to better extend details (https://github.com/coreshop/CoreShop/pull/772) - - [IndexBundle] implement optional inclusion into ProcessManager (https://github.com/coreshop/CoreShop/pull/758) - -- Bugs: - - [Product] remove getIsAvailableWhenOutOfStock and setIsAvailableWhenOutOfStock (https://github.com/coreshop/CoreShop/pull/1019) - - [CoreBundle] fix inheritance for store-values (https://github.com/coreshop/CoreShop/pull/1028) - - [ResourceBundle] Fix missing coreshop.helper namespace (https://github.com/coreshop/CoreShop/pull/1039) - - [PimcoreBundle] fix dynamic-dropdown for pimcore-6 (https://github.com/coreshop/CoreShop/pull/1040) - - [All] fix related to element.href and this pimcore PR: pimcore/pimcore#4496 (https://github.com/coreshop/CoreShop/pull/1041) - - [Core] Store Values - default value to 0 instead of null, fix setting inherited store values (https://github.com/coreshop/CoreShop/pull/1093) - - [FrontendBundle] fix wishlist remove and allow purchasables (https://github.com/coreshop/CoreShop/pull/997) - - [Bundles] provide proper version strings and names (https://github.com/coreshop/CoreShop/pull/970) - - [Migration] only add indices to store_price table if table actually exists (https://github.com/coreshop/CoreShop/pull/967) - - [IndexBundle] improve standalone usage (https://github.com/coreshop/CoreShop/pull/965) - - [Product] allow price rule labels to be null and fix error with two trait constructors (https://github.com/coreshop/CoreShop/pull/953) - - [ProductBundle] re-add active to list serializer group (https://github.com/coreshop/CoreShop/pull/912) - - [CoreBundle] fix cart-stock validation (https://github.com/coreshop/CoreShop/pull/894) - - [Tests] [Behat] the cart tests haven't been ran since the theme-bundle was introduced (https://github.com/coreshop/CoreShop/pull/872) - -## 2.0.x - -### 2.0.12 -- Translations: - - New Crowdin translations (https://github.com/coreshop/CoreShop/pull/1165) -- Tests - - [Tests] add conflict for monolog (https://github.com/coreshop/CoreShop/pull/1178) -- Bug - - [TRACKING] use single item price in order item extractor (https://github.com/coreshop/CoreShop/pull/1231) - -### 2.0.11 -- Bugs: - - [IndexBundle] use doctrine schema-config to create index-table schema (https://github.com/coreshop/CoreShop/pull/1142) - -### 2.0.10 -- Bugs: - - [PayumBundle]: add sandbox to PayPal Configuration (https://github.com/coreshop/CoreShop/pull/1112) - -### 2.0.9 -- Bugs: - - [Pimcore] fix stan tests on 2.0 (https://github.com/coreshop/CoreShop/pull/998) - - [CurrencyBundle] fix for money-currency editable when data comes from pimcore editmode (https://github.com/coreshop/CoreShop/pull/1023) - - [PimcoreBundle] use reflection to get class methods (https://github.com/coreshop/CoreShop/pull/1038) - - [CoreExtensions] don't allow any diff until properly implemented (https://github.com/coreshop/CoreShop/pull/1050) - - [ProductBundle] specific price rules: keep id on save (https://github.com/coreshop/CoreShop/pull/1045) - - [TrackingBundle] fix total tax in tag manager tracker (https://github.com/coreshop/CoreShop/pull/1053) @solverat - - [IndexBundle] fix iterator and nested interpreter (https://github.com/coreshop/CoreShop/pull/1054) - - [IndexBundle] fix index iterator interpreter (https://github.com/coreshop/CoreShop/pull/1076) - - [ResourceBundle] fix resource-select options (https://github.com/coreshop/CoreShop/pull/1077) - - [Tests] fix stan and travis tests (https://github.com/coreshop/CoreShop/pull/1078) - - [Docs] Fix extend docs (https://github.com/coreshop/CoreShop/pull/1082) - - [PimcoreBundle] embedd CoreExtension - Protected members are available only via getters (https://github.com/coreshop/CoreShop/pull/1089) @rishadomar - - [IndexBundle] fix order-direction now serialized properly (https://github.com/coreshop/CoreShop/pull/1097) - - [All] Fixing Configuration Keys (https://github.com/coreshop/CoreShop/pull/1100) @khusseini - - [FrontendBundle] CategoryController perPage Configuration fix (https://github.com/coreshop/CoreShop/pull/1105) - -- Features: - - [All] make CoreShop stores more async, don't load them initially (https://github.com/coreshop/CoreShop/pull/1025) - - [Order] introduce checkout events (https://github.com/coreshop/CoreShop/pull/1043) - - [CoreShop] Update CI (https://github.com/coreshop/CoreShop/pull/1056) - - [CoreShop] Smaller CI changes (https://github.com/coreshop/CoreShop/pull/1060) - -### 2.0.8 -- Bug: - - [Pimcore] Make CoreShop compatible with Pimcore 5.8.0 (https://github.com/coreshop/CoreShop/pull/977) - - [Order] remove wrong type hints (https://github.com/coreshop/CoreShop/pull/978) - - [Core] fix setting customer and persisting cart on user login (https://github.com/coreshop/CoreShop/pull/980) - -### 2.0.7 -- Bug: - - [Taxation] Wrong Tax Calculation when using Store Gross Values (https://github.com/coreshop/CoreShop/issues/971) - - [Core] remove unused Helper Classes (https://github.com/coreshop/CoreShop/pull/966) - - [Core] add index to StorePrice Table for better performance (https://github.com/coreshop/CoreShop/pull/962) - - [Core] remove result cache for Store Price due to issues with inheritance (https://github.com/coreshop/CoreShop/pull/961) - - [Core] strip_tags for meta description in Category (https://github.com/coreshop/CoreShop/pull/959) - - [Currency] MoneyCurrency fixes and improvements (https://github.com/coreshop/CoreShop/pull/958) - - [Purchasable] When using custom purchasable, CoreShop always assumed that your class has a weight, even though it didn't had to. That's why we moved all weight related fields to the Core Component and CoreBundle. - - [Core] prevent empty carts from being persisted (https://github.com/coreshop/CoreShop/issues/920) - - [Core] move weight/total weight to Core Component (https://github.com/coreshop/CoreShop/pull/938) - - [Address] use isoCode as fallback if no language value is set (https://github.com/coreshop/CoreShop/pull/939) - -- Features - - [JMS Serializer] Updated JMS Serializer to 2.0 (https://github.com/coreshop/CoreShop/pull/955) - -### 2.0.6: -- Bug: - - [Adjustments] in the classes "CoreShopOrderItem", "CoreShopQuoteItem", was a typo `basePdjustmentItems` instead of `baseAdjustmentItems`. Please manually rename them to `baseAdjustmentItems` - - [ProductBundle] Fix extjs layout crash price rule is inactive (https://github.com/coreshop/CoreShop/pull/908) - - [FrontendBundle] fix address creation redirect (https://github.com/coreshop/CoreShop/pull/910) - - [StorageList] Storage List and Storage List Item is not a Pimcore Object (https://github.com/coreshop/CoreShop/pull/907) - - [Order] fix typo in OrderItem and QuoteItem (https://github.com/coreshop/CoreShop/pull/906) - - [NotificationBundle] fix typo in serializer namespace declaration (https://github.com/coreshop/CoreShop/pull/901) - - [CoreBundle] fix notification rule setting for order mail action (https://github.com/coreshop/CoreShop/pull/886) - - [Core] use PriceCalculatorInterface in product tracking extractor (https://github.com/coreshop/CoreShop/pull/892) - - [Core] fix not passing full configuration in store based email (https://github.com/coreshop/CoreShop/pull/917) - - [Core] fix copying object brick data from cart to sale (https://github.com/coreshop/CoreShop/pull/918) - - [CoreBundle/OrderBundle] KernelResponse Event should ignore Profile Toolbar (https://github.com/coreshop/CoreShop/pull/919) - - [Pimcore] Make CoreShop compatible with Pimcore 5.7.2 (https://github.com/coreshop/CoreShop/pull/914) - -- Features: - - [FrontendBundle] make private method protected (https://github.com/coreshop/CoreShop/pull/890) - - [AddressBundle] introduce address-identifiers (https://github.com/coreshop/CoreShop/issues/830 & https://github.com/coreshop/CoreShop/pull/913) - -### 2.0.5: -- Deprecations: - - [WorkflowBundle] refactor state change logging (https://github.com/coreshop/CoreShop/pull/835) - - `CoreShop\Bundle\OrderBundle\Workflow\OrderHistoryLogger` has been deprecated, use `CoreShop\Bundle\WorkflowBundle\History\HistoryLoggerInterface` instead - - `CoreShop\Bundle\OrderBundle\Workflow\OrderStateHistoryLogger` has been deprecated, use `CoreShop\Bundle\WorkflowBundle\History\StateHistoryLoggerInterface` instead - - `CoreShop\Bundle\OrderBundle\Workflow\WorkflowStateManager` has been deprecated, use `CoreShop\Bundle\WorkflowBundle\StateManager\WorkflowStateInfoManagerInterface` instead -- Bugs - - [PimcoreBundle] Make embedded classes work for Pimcore 5.6 (https://github.com/coreshop/CoreShop/pull/867) - - [All] Make CoreShop 2.0.x compatible with Pimcore 5.7 (https://github.com/coreshop/CoreShop/pull/869) - - [All] fix PHP5 sort issues by removing them (https://github.com/coreshop/CoreShop/issues/840) - - [Shipping] if cart has no shippables, don't force carriage calculation (https://github.com/coreshop/CoreShop/pull/863) - - [Checkout] validate cart before submitting the order (https://github.com/coreshop/CoreShop/pull/858) - - [Frontend] remove unused property in templates (https://github.com/coreshop/CoreShop/pull/859) - - [Permissions] prefix permission labels (https://github.com/coreshop/CoreShop/pull/855) - - [Order] refactor creation of invoices/shipments (https://github.com/coreshop/CoreShop/pull/852 + https://github.com/coreshop/CoreShop/pull/849) - - [Order] introduce options for order-document-items (https://github.com/coreshop/CoreShop/pull/848) - - [Autoloading] fix paths (https://github.com/coreshop/CoreShop/pull/846) - - [ResourceBundle] Introduce more basic resource-types (https://github.com/coreshop/CoreShop/pull/838 + https://github.com/coreshop/CoreShop/pull/845) - - [AddressBundle] add missing translations (https://github.com/coreshop/CoreShop/pull/836) - -- Features - - [Index] Introduce advanced sorting for indexes (https://github.com/coreshop/CoreShop/pull/856) - -### 2.0.4 -- Features: - - [Reports] Reports Grid Sorting (https://github.com/coreshop/CoreShop/pull/828) - - [Reports] Add Paginator To All Reports (https://github.com/coreshop/CoreShop/pull/826) - - [Pimcore] introduce twig placeholder (https://github.com/coreshop/CoreShop/pull/827) - - [Resource] add serialization for pimcore types (https://github.com/coreshop/CoreShop/pull/818) - - [Resource] add more doctrine-pimcore-types (https://github.com/coreshop/CoreShop/pull/816) - -- Bugs: - - [Order] fix code-generator length (https://github.com/coreshop/CoreShop/pull/833) - - [JS] Split JS Helpers into several regions of usability (https://github.com/coreshop/CoreShop/pull/829) - - [Core] fix for cart-item digital product never set (https://github.com/coreshop/CoreShop/pull/821) - - [Docs] Fix dead link (https://github.com/coreshop/CoreShop/pull/822) - - [Resource] move settings icon to resource-bundle (https://github.com/coreshop/CoreShop/pull/815) - - [Tracker] Update CompositeTracker::trackCheckoutStep (https://github.com/coreshop/CoreShop/pull/810) - -### 2.0.3 -- Features: - - [All] Replace intval with int cast (https://github.com/coreshop/CoreShop/pull/805) - - [Core] Store Price Dirty Detection if installed Pimcore Version >= 5.5 (https://github.com/coreshop/CoreShop/pull/807) - - [Core] Allow Variants in Product Rule Conditions (https://github.com/coreshop/CoreShop/pull/794) - - [Core] Add Event for Settings (https://github.com/coreshop/CoreShop/pull/785) - - [Core] Extract CartItem Processor (https://github.com/coreshop/CoreShop/pull/784) - - [Core] Decouple Shipping Calculator from Cart (https://github.com/coreshop/CoreShop/pull/783) - - [Order] extract DataLoader into Pimcore Component (https://github.com/coreshop/CoreShop/pull/782) - - [Order] rename Pimcore Grid Operators to be more CoreShop specific (https://github.com/coreshop/CoreShop/pull/787) - - [Order] Check also for CurrencyAwareInterface in PriceFormatter Gird Operator (https://github.com/coreshop/CoreShop/pull/788) - - [Index] Introduce Iterator Interpreter (https://github.com/coreshop/CoreShop/pull/802) - - [Index] Introduce new Abstract function in AbstractWorker to allow handling of array data (https://github.com/coreshop/CoreShop/pull/803) - - [Pimcore] add object_method twig function (https://github.com/coreshop/CoreShop/pull/809) -- Bugs: - - [Core] Fix Gift Cart Price Rule Action (https://github.com/coreshop/CoreShop/pull/796) - - [Core] Fix Invoice WKHTML Settings (https://github.com/coreshop/CoreShop/pull/786) - - [Core] Rule Conditions: Check on type (https://github.com/coreshop/CoreShop/pull/779) - - [Core] Add Translation for Adjustments (https://github.com/coreshop/CoreShop/pull/774) - - [Pimcore] allow spaces in DynamicDropdown (https://github.com/coreshop/CoreShop/pull/781) - -### 2.0.2 -- Pimcore: - - This release makes CoreShop compatible with Pimcore 5.6.0 (https://github.com/coreshop/CoreShop/pull/762) -- Features: - - [Core] Adds a new CoreShop JS Event to add custom Menu Items to the CoreShop Menu (https://github.com/coreshop/CoreShop/pull/765) - - [Resource] [ResourceBundle] add JMS Serializer Handler for Pimcore Objects (https://github.com/coreshop/CoreShop/pull/766) -- Bugs: -- [Tracking] Fixes a Bug in the Tracking Manager when a Product does not have any categories applied (https://github.com/coreshop/CoreShop/pull/767) - -### 2.0.1 -- Features: - - [Core] Remove login customer after successfully registration (https://github.com/coreshop/CoreShop/pull/735) -- Bugs: - - [Core] Countries are removed when removing Store (https://github.com/coreshop/CoreShop/pull/746) - - [Core] order Document State Resolver when a Document is cancelled (https://github.com/coreshop/CoreShop/pull/738) - - [Core] safe path for folders (https://github.com/coreshop/CoreShop/pull/742) - - [Core] Fix for StoreMailActionProcessor exception in Notification Rule (https://github.com/coreshop/CoreShop/pull/740) - - [Shipping] is invalid when no Shipping Rules are given (https://github.com/coreshop/CoreShop/pull/741) - - [Frontend] Inaccurate Store Filter Query in Category Controller (https://github.com/coreshop/CoreShop/pull/744) - -### 2.0.0 -- CoreShop\Component\Index\Condition\RendererInterface has been deprecated in favor of CoreShop\Component\Index\Condition\DynamicRendererInterface to allow dynamic registration of condition renderers - -### 2.0.0-RC.1 -- Flash Messages are translated in the Controllers now, not in views anymore. If you have custom Flash Messages, translate them in your Controller instead of the view. - -### 2.0.0-beta.4 -- Completely remove FOSRestBundle, you still can use it, but you need to install it yourself. CoreShop only used the BodyListener to decode POST/PUT Requests, this Listener is now added by CoreShop if FOSRestBundle is not installed. - -## 2.0.0-beta.3 to 2.0.0-beta.4 -- **BC break**: All occurrences of parameters `coreshop.all.stack.pimcore_class_ids`, `"application".model."class".pimcore_class_id`, `coreshop.all.pimcore_classes.ids` have been removed. Inject the corresponding Repository and use `classId` function instead -- **Pimcore**: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use/update CoreShop. - -### Product Price Calculation -In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API. - -Following interfaces have changed: - -- ```CoreShop\Component\Core\Product\TaxedProductPriceCalculatorInterface``` -- ```CoreShop\Component\Order\Calculator\PurchasableDiscountCalculatorInterface``` -- ```CoreShop\Component\Order\Calculator\PurchasableDiscountPriceCalculatorInterface``` -- ```CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface``` -- ```CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface``` -- ```CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface``` -- ```CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface``` -- ```CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface``` -- ```CoreShop\Component\Product\Calculator\ProductRetailPriceCalculatorInterface``` -- ```CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface``` -- ```CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface``` -- ```CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface``` -- ```CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface``` -- ```CoreShop\Component\Product\Rule\Fetcher\ValidRulesFetcherInterface``` - -If you have anything customized with those classes, please change them accordingly. - -If you use the PriceCalculator Service directly, you also need to change the call from - -``` -$this->priceCalculator->getPrice($object, true) -``` - -to - -``` -$this->priceCalculator->getPrice($object, [ - 'store' => $store, - 'country' => $country, - 'customer' => $customer, - 'currency' $currency, - 'cart' => $cart -], true) -``` - -The new second argument, is the Context for which you want to get the Price. This is highly depends on your -need. On a default CoreShop setup, the context can be fetched form the `ShopperContext` Service like this: - -``` -return [ - 'store' => $this->shopperContext->getStore(), - 'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null, - 'currency' => $this->shopperContext->getCurrency(), - 'country' => $this->shopperContext->getCountry(), - 'cart' => $this->shopperContext->getCart() -]; -``` - -CoreShop makes that easier for you, you can just use ```$this->shoppperContext->getContext()```. But be aware, the Shopper Context is only in a Web Request available. -When you work on a CLI Level, you have to define the context yourself. - -If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart - -``` -$context = [ - 'store' => $cart->getStore(), - 'customer' => $cart->getCustomer() ?: null, - 'currency' => $cart->getCurrency(), - 'country' => $cart->getStore()->getBaseCountry(), - 'cart' => $cart -]; -``` - -### Taxation -Tax Rule Store relation has been removed as it makes currently no sense. - -### Tracking -Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes. - -### Order Invoice -Due to changes in adjustments, we also need to change OrderInvoice/OrderInvoiceItem. - -After you have migrated to the latest version you also have to remove some fields: - -#### CoreShopOrderInvoice -- totalTax -- baseTotalTax -- subtotalTax -- baseSubtotalTax -- shippingTax -- baseShippingTax -- taxes -- baseTaxes -- discountTax -- baseDiscountTax -- discountNet -- discountGross -- baseDiscountNet -- baseDiscountGross -- shippingNet -- shippingGross -- baseShippingNet -- baseShippingGross -- shippingTaxRate - -#### CoreShopOrderInvoiceItem -- totalTax -- baseTotalTax -- taxes -- baseTaxes - -### Adjustments -> **BC break / New Feature** - -There are several deprecated class fields. -After you have migrated to the latest version you also have to remove them: - -#### CoreShopOrder / CoreShopQuote -- shippingGross -- shippingNet -- shippingTax -- discountGross -- discountNet -- discountTax -- baseShippingNet -- baseShippingGross -- baseShippingTax -- baseDiscountNet -- baseDiscountGross -- totalTax -- baseTotalTax -- subTotalTax -- baseSubtotalTax - -#### CoreShopOrderItem / CoreShopQuoteItem -- totalTax -- baseTotalTax - -#### CoreShopCart -- shippingGross -- shippingNet -- discountGross -- discountNet - -## 2.0.0-beta.2 to 2.0.0-beta.3 -- **BC break** Signature of following interfaces changed: - - `CoreShop\Component\Index\Interpreter\InterpreterInterface`: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []); - - `CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface`: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []); - - `CoreShop\Component\Index\Interpreter\RelationInterpreterInterface`: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []); - - `CoreShop\Component\Customer\Model\UserInterface::ROLE_DEFAULT` renamed `CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_DEFAULT` - - `CoreShop\Component\Customer\Model\UserInterface::ROLE_SUPER_ADMIN` renamed `CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_SUPER_ADMIN` - -- **BC break** Shipment / Invoice Creation via API changed - - Before adding a new Shipment / Invoice you need to dispatch a request state to your order. Read more about it [here](../03_Development/06_Order/05_Invoice/01_Invoice_Creation.md) and [here](../03_Development/06_Order/06_Shipment/01_Shipment_Creation.md). -- **BC break** getName in `CoreShop\Component\Index\Model\IndexableInterface` has been changed to `getIndexableName` as `getName` could eventually conflict with a non localized Pimcore Field -- **BC break** getEnabled in `CoreShop\Component\Index\Model\IndexableInterface` has been changed to `getIndexableEnabled` as `getEnabled` could eventually conflict with a localized Pimcore Field - -## 2.0.0-beta.1 to 2.0.0-beta.2 -- Link Generator implemented. If you want to use nice urls, you need to add the link generator service: - - CoreShopProduct: add `@coreshop.object.link_generator.product` as Link Provider - - CoreShopCategory: add `@coreshop.object.link_generator.category` as Link Provider - - Change `{{ path('') }}` to `{{ coreshop_path('') }}`. You may want to checkout the FrontendBundle to get a deeper insight. -- Deprecated Field Names in - CoreShop\Component\Payment\Model\PaymentInterface`: - - getName is now getTitle - - getOrderId is now getOrder and directly returns a OrderInterface -- Deprecated Field Names in - `CoreShop\Component\Shipping\Model\CarrierInterface`: - - getLabel is not getTitle - - getName is now getIdentifier - - -## 2.0.0-alpha.4 to 2.0.0-beta.1 -- **BC break** Signature of following interfaces changed: - - `CoreShop\Component\Index\Interpreter\InterpreterInterface`: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config); - - `CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface`: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config); - - `CoreShop\Component\Index\Interpreter\RelationInterpreterInterface`: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config); - -- **BC break** CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, - all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. - To solve the issues, check following things: - - remove `RegisterBundles` entry from `app/AppKernel.php` - - remove loading CoreShopCoreBundle Configuration in `app/config.yml` - - enable CoreShopCoreBundle via CLI or manually in `var/config/extensions.php`: `"CoreShop\\Bundle\\CoreBundle\\CoreShopCoreBundle" => TRUE` -- **BC break** Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade. - -## 2.0.0-alpha.4 to 2.0.0-alpha.5 -- **BC break** added Component\Core\Model\OrderItem and Component\Core\Model\QuoteItem. If you already customized them, inherit them from the Core Models. -- **BC break** changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from `CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker` and implement `isCartRuleValid` instead of `isValid` -- Deprecated: remove `cart/add-price-rule/` static route. - -## 2.0.0-alpha.3 to 2.0.0-alpha.4 -- **BC break** decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from - **coreshop_convert_money** to **coreshop_convert_currency**. If you use it directly in your code, please rename all of them. -- Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. - * Installation has been moved to CoreShopCoreBundle - * Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself. - -## 2.0.0-alpha.2 to 2.0.0-alpha.3 -- **BC break** getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant. - - If you still want to use the old getPrice, create a new Subclass of \CoreShop\Component\Core\Model\Product, implement \CoreShop\Component\Order\Model\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents. - -# V1 to V2 -- CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2. -- [Export from CoreShop1](https://github.com/coreshop/CoreShopExport) -- [Import into CoreShop2](https://github.com/coreshop/ImportBundle) - -# Within V1 -- Nothing available diff --git a/docs/docs/01_Getting_Started/04_Difference_to_ecommerce_Framework.md b/docs/docs/01_Getting_Started/04_Difference_to_ecommerce_Framework.md deleted file mode 100644 index bdafed215c..0000000000 --- a/docs/docs/01_Getting_Started/04_Difference_to_ecommerce_Framework.md +++ /dev/null @@ -1,81 +0,0 @@ -# CoreShop vs. eCommerce Framework - -The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building -eCommerce applications and heavily depends on you doing all the things. - -CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your -ecommerce Application. In other words: CoreShop is the framework on steroids :) - -Feature Comparison - -| Feature | eCommerce Framework | CoreShop | -| ----------------------------- |:-------------------:|:---------:| -| Product Management | √ | √ | -| Product Restrictions | X | √ | -| Product Variants | √ | √ | -| Category Management | √ | √ | -| Customer Management | X | √ | -| Customer Address Management | X | √ | -| Localization | X | √ | -| Currency Management | X | √ | -| Country Management | X | √ | -| Taxation | √ | √ | -| Payment Management | √ | √ | -| Supported Payment Providers | | | -| - Wirecard Qpay | √ | √ | -| - Wirecard Seamless | √ | √ | -| - Datatrans | √ | √ | -| - Klarna | √ | √ | -| - Recurring Payments | √ | √ | -| - PayPal Express | X | √ | -| - PayPal Pro Checkout | X | √ | -| - PayPal Pro Hosted | X | √ | -| - PayPal Masspay | X | √ | -| - PayPal Rest | X | √ | -| - Stripe.js | X | √ | -| - Stripe Checkout | X | √ | -| - Authorize.NET AIM | X | √ | -| - Be2Bill Credit Card | X | √ | -| - Be2Bill Offsite | X | √ | -| - Payex | X | √ | -| - Offline | X | √ | -| - Payum and Omnipay | X | √ | -| Voucher Codes | √ | √ | -| Catalog Price Rules | √ | √ | -| Product Specific Price Rules | X | √ | -| Product Facet Index | √ | √ | -| Multi Theme Supported | X | √ | -| Carrier Management | X | √ | -| Shipping Calculation | X | √ | -| Order Management | √ | √ | -| Order Workflow | X | √ | -| Order Invoice Generation | X | √ | -| Order Shipment Generation | X | √ | -| Quotes Management | X | √ | -| Reporting | X | √ | -| Multi Store/Tenant | √ | √ | -| eCommerce Tracking | √ | √ | -| Configurable Mail Rules | X | √ | -| Backend Functionality | | | -| - Country Management | X | √ | -| - Currency Management | X | √ | -| - Taxation Management | X | √ | -| - Taxation Management | X | √ | -| - Index Management | X | √ | -| - Filter Management | X | √ | -| - Order Management | X (partial) | √ | -| - Voucher Rules | √ | √ | -| - Price Rules | √ | √ | -| - Order Overview | X (partial) | √ | -| - Quote Overview | X | √ | -| - Order Detail | X (partial) | √ | -| - Quote Detail | X | √ | -| - Order Creation | X | √ | -| - Quote Creation | X | √ | -| Checkout Manager | √ | √ | -| Modular/Componentized | X (partial) | √ | -| Extendable | √ | √ | - -To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed -to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box -features to quickly create rich ecommerce systems. \ No newline at end of file diff --git a/docs/docs/01_Getting_Started/index.md b/docs/docs/01_Getting_Started/index.md deleted file mode 100644 index 4ace6552f6..0000000000 --- a/docs/docs/01_Getting_Started/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Getting Started with CoreShop - -This section provides a quick getting started tutorial for CoreShop and covers the following topics: - -1. [Installation of Pimcore](./00_Installation.md) -2. [Architecture Overview](./01_Architecture_Overview.md) -3. [Upgrade Notes](./02_Upgrade_Notes.md) -4. [Difference to the eCommerce Framework](./04_Difference_to_ecommerce_Framework.md) -5. [UI Documentation](../02_User_Documentation/index.md) -6. [Developer Documentation](../03_Development/index.md) diff --git a/docs/docs/02_User_Documentation/01_Stores.md b/docs/docs/02_User_Documentation/01_Stores.md deleted file mode 100644 index 0500f9d0e3..0000000000 --- a/docs/docs/02_User_Documentation/01_Stores.md +++ /dev/null @@ -1,30 +0,0 @@ -# CoreShop Stores -Every CoreShop Installation is bounded to a default Store. -By default a store is connected with a pimcore Site. - -![Stores](img/stores.png) - -## Domain based Store -This is CoreShops default behaviour. One store for your default page, which is also your default store. -If you have multiple Domains it's possible to add a store to each domain. - -> **Tip:** Learn more about pimcore multi sites: [Pimcore Sites](https://pimcore.com/docs/pimcore/current/Development_Documentation/MVC/Routing_and_URLs/Working_with_Sites.html) - -## Custom Store Locator -Sometimes you have just one site installation but you want do use different Stores. -Example: `/de-at` should use a austrian store and `/de-de` a german one. -For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved. - -## Configure CoreShop Stores -Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. -To create a new store, click on the "Add" button. Proceed wih configuring your new store. - -## Examples -Stores can be used in many ways, checkout the examples to find out which solution suits you most. - -### Example 1: Global Store -Use a Store to handle multiple currencies, countries and tax calculations. -Depending on your product and price strategy, it's possible to use it within one store. - -### Example 2: Country Store -Use a Store for each Country. This allows you to restrict your shop within a country context. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/02_Settings.md b/docs/docs/02_User_Documentation/02_Settings.md deleted file mode 100644 index 544dedff28..0000000000 --- a/docs/docs/02_User_Documentation/02_Settings.md +++ /dev/null @@ -1,68 +0,0 @@ -CoreShop's Settings are divided into each "sub"-shop and some system settings. - -### Shop-Settings - -Settings can be different for each Store. - -![Settings](img/settings-shop.png) - -#### Base - -- Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed. -- Guest-Checkout: Enables or disables guest-checkout feature - -#### Customer Service - - Customer Email Document: Email document used to send customer messages - - Customer Re Email Document: Email document used to send customer reply messages - - Contact Email Document: Email document used to send contact messages - - Contact Sales: Default contact used for sales messages - - Contact Technology: Default contact used for technology messages - -#### Stock - - Default Stock Behaviour: Describes the default stock behaviour for products - -#### Tax - - Validate VAT: Describes if the VAT-Number for European Countries should be validated - - Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country - - Taxation Address: Describes witch address is responsibly for taxation - -#### Prices - - Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included. - -#### Shipping - - Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules - - Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules - - Carrier Sort: Describes how the Carriers should be sorted - -#### Product - - Default Image: Defines an default image for products if no image is available. - - Number of days as new: Defines the time of days a product is marked as new. - -#### Category - - Default Image: Defines an default image for categories if no image is available. - -#### Invoice - - Create Invoice for Orders: Defines if invoices are going to be created on an paid order. - - Prefix: Prefix string for Order and Invoice numbers - - Suffix: Suffix string for Orders and Invoice numbers. - - WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF - -#### Mail Settings - - admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders - - Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails - -#### Cart - - Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts - -### System - Settings - -System Settings are defined one time for all shops. - -![System Settings](img/settings-system.png) - -#### System Settings - - Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer - -#### Currency - - Automatic Exchange Rates: Describes if exchange rates should be fetched automatically - - Exchange Rate Provider: Describes which exchange rate provider should be used. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md b/docs/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md deleted file mode 100644 index 013798adb4..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md +++ /dev/null @@ -1,28 +0,0 @@ -# CoreShop Cart Price Rules Documentation - -Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop. - -![Cart Price Rules](img/cart-pricerule.png) - -## Available Actions - -- [Free Shipping](./06_Actions.md#free-shipping) -- [Gift Product](./06_Actions.md#gift-product) -- [Discount Amount](./06_Actions.md#discount-amount) -- [Discount Percent](./06_Actions.md#discount-percent) - -## Available Conditions - -- [Customers](./07_Conditions.md#customers) -- [Customer Groups](./07_Conditions.md#customer-groups) -- [Time Span](./07_Conditions.md#time-span) -- [Voucher](./07_Conditions.md#voucher) -- [Amount](./07_Conditions.md#amount) -- [Countries](./07_Conditions.md#countries) -- [Zones](./07_Conditions.md#zones) -- [Stores](./07_Conditions.md#stores) -- [Currencies](./07_Conditions.md#currencies) -- [Carriers](./07_Conditions.md#carriers) -- [Nested Rules](./07_Conditions.md#nested-rules) -- [Products](./07_Conditions.md#products) -- [Categories](./07_Conditions.md#categories) diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md b/docs/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md deleted file mode 100644 index 67f9cf6cf4..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md +++ /dev/null @@ -1,26 +0,0 @@ -# CoreShop Product Price Rules Documentation - -Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop. - -![Cart Price Rules](img/product-pricerule.png) - -## Available Actions - -- [Price](./06_Actions.md#new-price) -- [Discount Price](./06_Actions.md#discount-price) -- [Discount Amount](./06_Actions.md#discount-amount) -- [Discount Percent](./06_Actions.md#discount-percent) - -## Available Conditions - -- [Customers](./07_Conditions.md#customers) -- [Customer Groups](./07_Conditions.md#customer-groups) -- [Time Span](./07_Conditions.md#time-span) -- [Voucher](./07_Conditions.md#voucher) -- [Countries](./07_Conditions.md#countries) -- [Zones](./07_Conditions.md#zones) -- [Stores](./07_Conditions.md#stores) -- [Currencies](./07_Conditions.md#currencies) -- [Nested Rules](./07_Conditions.md#nested-rules) -- [Products](./07_Conditions.md#products) -- [Categories](./07_Conditions.md#categories) diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md b/docs/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md deleted file mode 100644 index 9f6cb01cfe..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md +++ /dev/null @@ -1,23 +0,0 @@ -# CoreShop Specific Price Rules Documentation - -Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop. - -![Specific Price Rules](img/specific-price-rules.png) - -## Available Actions - -- [Price](./06_Actions.md#new-price) -- [Discount Price](./06_Actions.md#discount-price) -- [Discount Amount](./06_Actions.md#discount-amount) -- [Discount Percent](./06_Actions.md#discount-percent) - -## Available Conditions - -- [Customers](./07_Conditions.md#customers) -- [Customer Groups](./07_Conditions.md#customer-groups) -- [Time Span](./07_Conditions.md#time-span) -- [Countries](./07_Conditions.md#countries) -- [Zones](./07_Conditions.md#zones) -- [Stores](./07_Conditions.md#stores) -- [Currencies](./07_Conditions.md#currencies) -- [Nested Rules](./07_Conditions.md#nested-rules) diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md b/docs/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md deleted file mode 100644 index f5c19e9da0..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md +++ /dev/null @@ -1,16 +0,0 @@ -# CoreShop Quantity Price Rules Documentation - -CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop. - -![Specific Price Rules](img/quantity-price-rules.png) - -## Available Conditions - -- [Customers](./07_Conditions.md#customers) -- [Customer Groups](./07_Conditions.md#customer-groups) -- [Time Span](./07_Conditions.md#time-span) -- [Countries](./07_Conditions.md#countries) -- [Zones](./07_Conditions.md#zones) -- [Stores](./07_Conditions.md#stores) -- [Currencies](./07_Conditions.md#currencies) -- [Nested Rules](./07_Conditions.md#nested-rules) diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/05_Vouchers.md b/docs/docs/02_User_Documentation/03_Price_Rules/05_Vouchers.md deleted file mode 100644 index c019a3dc76..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/05_Vouchers.md +++ /dev/null @@ -1,55 +0,0 @@ -# CoreShop Vouchers - -> **Info**: In CoreShop Vouchers are Price Rules too. -> To use or generate Vouchers you need to add a Cart Price Rule. - -## How to create Vouchers -Simple create a new [cart price rule](./01_Cart_Price_Rules.md) and activate "Is Voucher Rule". -With that, the "Voucher Codes" tab gets enabled. - -![Voucher](./img/vouchers-1.png) - -### Voucher Condition -![Voucher](./img/vouchers-2.png) - -If you need more control about handling Vouchers you need to add the "Voucher" Condition: - -| Name | Description| -|:-----|:--------------------| -| Max. Usage per Code | Define how often a voucher code can be used. | -| Allow only one Voucher per Code | If checked, only one Voucher per Cart is allowed. | - -### Voucher Codes -![Voucher](./img/vouchers-3.png) - -Within the "Voucher Codes" tab you're able to manage codes for the current price rule. -It's also possible to export generated codes to csv file. - -> If you need more globally statistics about vouchers please use the [voucher report](../09_Reports/09_Vouchers.md). - -| Name | Description| -|:-----|:--------------------| -| Code | Generated voucher code | -| Creation Date | Voucher creation date | -| Used | If the Voucher has been used you'll see a true statement | -| Uses | Amount of uses per code | -| Action | It's possible to delete voucher codes as long they're not in use | - -### Create Voucher Code -There are two ways to generate Codes: - -#### Single Voucher Code -Create a single voucher code. -The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message. - -#### Voucher Codes Generator -This is the more advanced option to generate voucher codes: - -| Name | Description| -|:-----|:--------------------| -| Amount | Define how many voucher codes should be generated | -| Length| Define the Voucher Code Length | -| Format | Voucher Format. Possible Values: `Alphanumeric`, `Alphabetic`, `Numeric` | -| Prefix | Define a prefix for each code. For example `SHOP-` | -| Suffix | Define a suffix for each code. For example `-SHOP` | -| Hyphens all X characters | Add a Dash (`-`) after every X character | diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/06_Actions.md b/docs/docs/02_User_Documentation/03_Price_Rules/06_Actions.md deleted file mode 100644 index 3c6102fd19..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/06_Actions.md +++ /dev/null @@ -1,71 +0,0 @@ -# CoreShop Price Rule Actions -Get a brief overview of all the available *Price Rule Actions* in CoreShop. - -## Free Shipping -> **Available for**: Cart Price Rules - -Add this action to allow free shipping. - -## Gift Product -> **Available for**: Cart Price Rules - -Add this action to place a gift in customers cart. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Gift Product | Needs to be a coreshop registered product object | - -## Discount Amount -> **Available for**: Cart Price Rules, Specific Product Price, Product Price - -Set a arbitrary amount of discount. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Amount | Define Amount | -| Gross | If given Amount has included VAT, check it | -| Currency | Set Currency of given amount | -| Apply On | Select Between `total` and `subtotal`. **Note:** This option is only available in the cart rule context | - -## Discount Percent -> **Available for**: Cart Price Rules, Specific Product Price, Product Price - -Set a arbitrary percentage amount of discount. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Percent | Define Amount | -| Apply On | Select Between `total` and `subtotal`. **Note:** This option is only available in the cart rule context | - - -## New Price -> **Available for**: Specific Product Price, Product Price - -Define a new Price. -> **Note**: This will be used as a new price in frontend so there is no "special discount price" labelling. -> If you need a highlighted discount price, use the `Discount Price` Action. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Price | Set new Price | -| Currency | Set Currency of given amount | - -## Discount Price -> **Available for**: Specific Product Price, Product Price - -Define a discount Price. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Price | Set discount Price | -| Currency | Set Currency of given amount | \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/07_Conditions.md b/docs/docs/02_User_Documentation/03_Price_Rules/07_Conditions.md deleted file mode 100644 index a9d8507c1f..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/07_Conditions.md +++ /dev/null @@ -1,153 +0,0 @@ -# CoreShop Price Rules Conditions -Get a brief overview of all the available *Price Rule Conditions* in CoreShop. - -## Customers -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Define one ore more customers to whom the price rule should get applied. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Customers | One ore multiple CoreShop Customer Objects | - -## Customer Groups -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Define one ore more customer groups to whom the price rule should get applied. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Groups | One ore multiple CoreShop Customer Group Objects | - -## Time Span -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Define a time span in which range the price rule is valid - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Date From | Date/Time Start | -| Date To | Date/Time End | - -## Voucher -> **Available for**: Cart Price Rules - -Define some Voucher Conditions. Check out the [Voucher Section](./05_Vouchers.md) to learn more about Voucher Configuration. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Max. Usage per Code | Define how often a voucher code can be used. | -| Allow only one Voucher per Code | If checked, only one Voucher per Cart is allowed. | - -## Amount -> **Available for**: Cart Price Rules - -Define a Price range within the price rule should get applied. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Min Amount | The min amount of cart | -| Max Amount | The max amount of cart | - -## Countries -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Bind a specific country to the price rule. -**Important**: This Condition is connected with the `Country Context Resolver`. -This Condition does not implies to use the Users current location since the Resolver could be also store related. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Countries | Select one or multiple Countries | - -## Zones -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Bind a specific zone to the price rule. -**Important**: This Condition is connected with the `Country Context Resolver`. -This Condition does not implies to use the Users current location since the Resolver could be also store related. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Zones | Select one or multiple Zones | - -## Stores -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Bind a specific store to the price rule. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Stores | Select one or multiple Stores | - -## Currencies -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Define which currencies are valid to apply the price rule - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Currencies | Select one or multiple Currencies | - -## Carriers -> **Available for**: Cart Price Rules - -Define which carriers are valid to apply the price rule - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Carriers | Select one or multiple Carriers | - -## Nested Rules -> **Available for**: Cart Price Rules, Specific Product Prices, Product Price - -Build complex `AND`, `OR` and `NOT` nested conditions. -Within a nested rules it's possible to add any other condition again. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Operator | `AND`, `OR` and `NOT` | - -## Products -> **Available for**: Cart Price Rules, Product Price - -Apply rule only if given products are available. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Products | One ore multiple CoreShop Product Objects | - -## Categories -> **Available for**: Cart Price Rules, Product Price - -Apply rule only if products linked with given categories are available. - -#### Options - -| Name | Description| -|:-----|:--------------------| -| Categories | One ore multiple CoreShop Category Objects | diff --git a/docs/docs/02_User_Documentation/03_Price_Rules/index.md b/docs/docs/02_User_Documentation/03_Price_Rules/index.md deleted file mode 100644 index 367d17653a..0000000000 --- a/docs/docs/02_User_Documentation/03_Price_Rules/index.md +++ /dev/null @@ -1,48 +0,0 @@ -# CoreShop Price Rules -CoreShop Price Rules are very powerful tools for price calculation. -This section will help you to get a detailed overview about how price calculation works in CoreShop: - -## Types of Price Rules -There are three Price Rule Types. - -#### 1. Cart Price Rules -Apply Price Rule to the customers cart. - -#### 2. Product Price Rules -Apply Price Rule globally. - -#### 3. Specific Product Prices -Apply Price Rules to specific products. - -## Global Priority -- Product Price Rules first -- Specific Price Rules second - -#### Example 1: -- Given: Product A with price 100,- -- Product Price Rule for Product A: New Price 50,- -- Specific Price Rule for Product A: New Price: 20,- -- Given Price: 20,- - -#### Example 2: -- Given: Product A with price 100,- -- Product Price Rule for Product A: Discount Percentage 50% -- Specific Price Rule for Product A: New Price: 50,- -- Given Price: 25,- - -## Specific Price Priority -Since it's possible to add multiple Specific Price Rules per Product you can adjust the -priority via the priority number field. - -## Automatic Rule Availability Checker -Rules with time-span elements included on root level will be disabled automatically if they're outdated. -Read more about automation [here](../10_Automation/index.md). - -## More Information - -- [Cart Price Rules](./01_Cart_Price_Rules.md) -- [Product Price Rules](./02_Product_Price_Rules.md) -- [Specific Product Prices](./03_Specific_Price_Rules.md) -- [Vouchers](./05_Vouchers.md) -- [Available Actions](./06_Actions.md) -- [Available Conditions](./07_Conditions.md) diff --git a/docs/docs/02_User_Documentation/04_Localization/01_Countries.md b/docs/docs/02_User_Documentation/04_Localization/01_Countries.md deleted file mode 100644 index 67c79dd620..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/01_Countries.md +++ /dev/null @@ -1,13 +0,0 @@ -# CoreShop Country - -A Country consists of following values: - - - Name - - ISO-Code - - Active: Determines if customers from this country are able to purchase from your store - - Use Store default Currency: If checked, your stores default currency will be applied to the country - - Currency - - Zone - - Stores: Determines for which Stores this Country is available. - -![Countries](img/countries.png) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/04_Localization/02_States.md b/docs/docs/02_User_Documentation/04_Localization/02_States.md deleted file mode 100644 index d0c6d6d864..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/02_States.md +++ /dev/null @@ -1,10 +0,0 @@ -# CoreShop State - -A State/County consists of following values: - - - Name - - Iso Code - - Active - - Country - -![States](img/states.png) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/04_Localization/03_Zones.md b/docs/docs/02_User_Documentation/04_Localization/03_Zones.md deleted file mode 100644 index d40ffbda17..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/03_Zones.md +++ /dev/null @@ -1,10 +0,0 @@ -# CoreShop Zone - -A Country consists of following values: - - - Name - - Active - -Zones are basically just a group of countries and can be used for Price Rules and Shipping Rules. - -![Zones](img/zones.png) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/04_Localization/04_Currencies.md b/docs/docs/02_User_Documentation/04_Localization/04_Currencies.md deleted file mode 100644 index b518fd0f70..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/04_Currencies.md +++ /dev/null @@ -1,27 +0,0 @@ -# CoreShop Currencies - - -A Currency consists of following values: - - - Name - - ISO Code - - Numeric ISO Code - - Symbol - - Exchange Rate: Is used to convert between different currencies - -If you are going to use Currency conversion, you need to update exchange ranges regularly. - -![Currencies](img/currencies.png) - -## Automated Exchange Rates - -CoreShop supports mulitple providers to get exchange ranges from. Currently supported: - - - CentralBankOfRepulicTurkey - - EuropeanCentralBank - - GoogleFinance - - NationalBankOfRomania - - YahooFinance - - WebserviceX - -To activate this feature, enable it within CoreShop Settings and choose your provider. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/04_Localization/05_Taxes.md b/docs/docs/02_User_Documentation/04_Localization/05_Taxes.md deleted file mode 100644 index 46737eee9c..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/05_Taxes.md +++ /dev/null @@ -1,11 +0,0 @@ -# CoreShop Taxes - -A Tax Rate consists of following values: - - - Localized Name: This name can also be seen in the cart or on invoices - - Rate: Tax Rate, for example 20% - - Active - -Taxes are going to be used in Tax Rules. - -![Taxes](img/taxes.png) diff --git a/docs/docs/02_User_Documentation/04_Localization/06_TaxRules.md b/docs/docs/02_User_Documentation/04_Localization/06_TaxRules.md deleted file mode 100644 index 4ba1f4979f..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/06_TaxRules.md +++ /dev/null @@ -1,12 +0,0 @@ -# CoreShop Tax Rules - -Tax Rules determine which Tax Rate should be used for the customers country/state. This Tax Rule is then applied to a product. - -A Tax Rule consists of following values: - - - Name - - Active - - Stores: In which Stores this Tax-Rule can be used. - - Rules: Which Country and/or State should use which Tax Rate and what should happen when multiple Tax Rates apply. - -![Tax Rules](img/taxrules.png) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/04_Localization/index.md b/docs/docs/02_User_Documentation/04_Localization/index.md deleted file mode 100644 index 2873c7c0c4..0000000000 --- a/docs/docs/02_User_Documentation/04_Localization/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# CoreShop Localization - - * [Countries](./01_Countries.md) - * [States](./02_States.md) - * [Zones](./03_Zones.md) - * [Currencies](./04_Currencies.md) - * [Taxes](./05_Taxes.md) - * [TaxRules](./06_TaxRules.md) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/05_Shipping/01_Carriers.md b/docs/docs/02_User_Documentation/05_Shipping/01_Carriers.md deleted file mode 100644 index c9ef0dabc5..0000000000 --- a/docs/docs/02_User_Documentation/05_Shipping/01_Carriers.md +++ /dev/null @@ -1,24 +0,0 @@ -# CoreShop Carriers Documentation - -CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop. - -## Creating a Carrier - -To create a carrier, follow these steps: - - - Log in to the CoreShop admin interface. - - Navigate to the "Shipping" tab and click on "Carriers." - - Click the "Add new" button to create a new carrier. - - Enter a name for the carrier and configure the other available options as needed. - -## Carrier Options - -When creating a carrier, you can configure various options to customize its behavior: - - - Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL). - - Tracking Url: A string value that indicates the tracking url - - Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier. - - Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost. - -## Summary -CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md b/docs/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md deleted file mode 100644 index 47da42f5dd..0000000000 --- a/docs/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md +++ /dev/null @@ -1,53 +0,0 @@ -# CoreShop Shipping Rules Documentation - -CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination. - -## Overview - -Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs. - -CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios. - -## Creating Shipping Rules - - - Navigate to the "Shipping" tab and click on "Shipping Rules." - - Click the "Add new" button to create a new shipping rule. - - Enter a name for the rule and configure the other available options as needed. - -## Configuring Conditions - -Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including: - - - Weight: Based on the total weight of the order. - - Price: Based on the total price of the order. - - Dimension: Based on the dimensions (length, width, and height) of the order. - - Quantity: Based on the total quantity of items in the order. - - Countries: Based on the shipping destination country. - - Zones: Based on the shipping destination zone (a group of countries). - -To add a condition to your shipping rule: - - - Click the "Add Condition" button in the "Conditions" section of the shipping rule. - - Choose the desired condition type from the dropdown menu. - - Configure the condition parameters as needed. - -For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg. - -## Configuring Actions -Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including: - - - Discount Amount: Apply a fixed discount amount to the shipping cost. - - Discount Percentage: Apply a percentage discount to the shipping cost. - - Add Amount: Add a fixed amount to the shipping cost. - - Add Percentage: Add a percentage amount to the shipping cost. - -To add an action to your shipping rule: - - - Click the "Add Action" button in the "Actions" section of the shipping rule. - - Choose the desired action type from the dropdown menu. - - Configure the action parameters as needed. - -For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20. - -# Summary -CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/05_Shipping/index.md b/docs/docs/02_User_Documentation/05_Shipping/index.md deleted file mode 100644 index c50fa16054..0000000000 --- a/docs/docs/02_User_Documentation/05_Shipping/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Shipping - -CoreShop provides a comprehensive shipping management system that allows you to define and configure various aspects of shipping, such as carriers, shipping rules, and carrier services. - -* [Carriers](./01_Carriers.md) -* [Shipping Rules](./02_Shipping_Rules.md) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/06_Cart/index.md b/docs/docs/02_User_Documentation/06_Cart/index.md deleted file mode 100644 index bc36fc9ddd..0000000000 --- a/docs/docs/02_User_Documentation/06_Cart/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# CoreShop Cart - -## Inventory Change -If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up. - -## Disable / Delete Products -If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. -A form error will notify every customer in frontend if the cart has been modified. - -## Abandoned Carts -No cart gets deleted by default. This allows you to: -- check abandoned cart statistics -- build your own business logic in case you want to inform customers within a follow-up email for example - -There is a expire cart command to remove abandoned carts, please checkout the [development section](../../03_Development/04_Cart/05_Commands.md). \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/06_Order/01_Orders.md b/docs/docs/02_User_Documentation/06_Order/01_Orders.md deleted file mode 100644 index a1f938cd44..0000000000 --- a/docs/docs/02_User_Documentation/06_Order/01_Orders.md +++ /dev/null @@ -1,15 +0,0 @@ -# CoreShop Orders - -## Grid View -The default order list is based on the pimcore grid view. -CoreShop comes with a default column configuration: -- On the right side, click "Column configuration" and select "Order Overview". -- Now click that button again and select "Set as favorite". - -## Filters in Grid View -It's possible to add custom filter definitions based on your project. -This has to be done via a php service. Read more about it [here](../../03_Development/06_Order/08_OrderList/01_Filter.md). - -## Apply Actions in Grid View -It's possible to apply custom bulk actions for selected orders. -This has to be done via a php service. Read more about it [here](../../03_Development/06_Order/08_OrderList/02_Action.md). \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/06_Order/02_Order_Detail.md b/docs/docs/02_User_Documentation/06_Order/02_Order_Detail.md deleted file mode 100644 index 19af456d61..0000000000 --- a/docs/docs/02_User_Documentation/06_Order/02_Order_Detail.md +++ /dev/null @@ -1,85 +0,0 @@ -# Order Detail - -## State / Price Overview - -Please read more about the order workflow process [here](./03_Order_Workflow.md) - -Besides some useful information about the order store and the total order amount, -there're also several order states: - -### State -This is the main state and represents the summary of all order states. - -| Name | Description | -|:-----|:-----------| -| new | New order has been placed. | -| confirmed | New order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state). | -| cancelled | Order has been cancelled. | -| complete | Order is complete. | - -### Payment State -Global payment states per order and represents the summary of all order payments: - -| Name | Description | -|:-----|:-----------| -| new | New payment has been created. | -| awaiting_payment | Waiting for payment: User is on payment offsite or payment is offline. | -| partially_paid | Some order payments have been paid. | -| paid | All payments have been paid. | -| cancelled | Order is complete. | -| partially_refunded | Some order payments have been refunded. | -| refunded | All payments have been refunded. | - -### Shipment State -Global shipment states per order and represents the summary of all order shipments: - -| Name | Description | -|:-----|:-----------| -| new | New shipment has been placed. | -| cancelled | Shipment has been cancelled | -| partially_shipped | Some order items have been shipped. | -| shipped | All items have been shipped. | - -### Invoice State -Global invoice states per order and represents the summary of all order invoices: - -| Name | Description | -|:-----|:-----------| -| new | New invoice has been created. | -| cancelled | Invoice has been cancelled | -| partially_invoiced | Some invoices have been invoiced. | -| invoiced | All invoices have been invoiced. | - - -## Carrier/Payment Provider Info -- Currency of Order -- Overall weight of Order Items -- Carrier -- Total Amount - -## Order History -The Order History shows you when specific states have been changed. - -## Payments --- - -## Shipments --- - -## Invoices --- - -## Mail Correspondence --- - -## Customer --- - -## Comments --- - -## Additional Data --- - -## Products --- diff --git a/docs/docs/02_User_Documentation/06_Order/03_Order_Workflow.md b/docs/docs/02_User_Documentation/06_Order/03_Order_Workflow.md deleted file mode 100644 index 40bd99eef5..0000000000 --- a/docs/docs/02_User_Documentation/06_Order/03_Order_Workflow.md +++ /dev/null @@ -1,72 +0,0 @@ -# Order Workflow - -> [Technical Overview](../../03_Development/17_State_Machine/index.md) of CoreShop Workflows. - -## Change States -States can be changed for: Order, Payment, Shipment and Invoice. -If any transition is available, you'll find a colored state button. -Click on that button to change the state. - -## Order Completion -In CoreShop a order is complete after the order payment reaches the `paid` state -and order shipment reaches the `shipped` state. If you also want to include the order invoice state `invoiced` -before a order gets completed, you need to enable a configuration flag: - -```yml -## app/config/config.yml -parameters: - coreshop.workflow.include_invoice_state_to_complete_order: true -``` - -#### Order Cancellation -In CoreShop a order rarely gets cancelled. Some reasons are: - -**Front-End Revise** -After a customer has cancelled his payment he will reach a so called revise page. -From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. -Only than the order gets cancelled. - -**Back-End Revise** -In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, -you're able to provide a revise link to your customer which then works the same as the Front-End revise process -(except that your customer is not able to restore a cart since there never was one). - -Please read more about the canceling process [here](../../03_Development/17_State_Machine/03_Things_To_Know.md) - -## Payment Workflow - -### Create a Payment -Just use the green bottom on the right top corner to add a new shipment. -A payment creation normally gets created by a frontend payment gateway. -This gateway also handles all the payment state changes. - -### Workflow Rules -- A payment reaches the `new` state after its creation. -- A payment can be canceled as long it's in the `new` or `processing` state. -- After a payment reaches `completed` state it only can get refunded. - -> **Attention**: The Refund process is not implemented yet in Coreshop! - -## Shipment Workflow - -### Create a Shipment -Just use the green bottom on the right top corner to add a new shipment. -If there are enough shippable items you can create a shipment. - -### Workflow Rules -- A shipment reaches the `ready` state (triggered by a `create` transition) after its creation. -- A shipment can be canceled as long it's in the `ready` state -- After you provoked the `ship` state a shipment can't be cancelled anymore. - -## Invoice Workflow - -### Create Invoice -Just use the green bottom on the right top corner to add a new invoice. -If there are enough invoiceable items you can create a invoice. - -### Workflow Rules -- A invoice reaches the `ready` state (triggered by a `create` transition) after its creation. -- A invoice can be canceled as long it's in the `ready` state. **Please note**: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one. -- After you provoked the `complete` state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process - -> **Attention**: The Refund process is not implemented yet in Coreshop! diff --git a/docs/docs/02_User_Documentation/06_Order/04_Order_Comments.md b/docs/docs/02_User_Documentation/06_Order/04_Order_Comments.md deleted file mode 100644 index d4d2422437..0000000000 --- a/docs/docs/02_User_Documentation/06_Order/04_Order_Comments.md +++ /dev/null @@ -1,9 +0,0 @@ -# Order Comments - -![Comment](img/comment2.png) -![Comment](img/comment1.png) - -CoreShop provides a simple comment interface which allows you to add simple notes to every order. -It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer". - -> **Note:** You need a valid Notification Rule to send comments to user. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/06_Order/index.md b/docs/docs/02_User_Documentation/06_Order/index.md deleted file mode 100644 index b68e08d676..0000000000 --- a/docs/docs/02_User_Documentation/06_Order/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Order - - * [Orders](./01_Orders.md) - * [Order Detail](./02_Order_Detail.md) - * [Order Workflow](./03_Order_Workflow.md) - * [Order Comments](./04_Order_Comments.md) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/07_Catalog/01_Products.md b/docs/docs/02_User_Documentation/07_Catalog/01_Products.md deleted file mode 100644 index 8ee93715a7..0000000000 --- a/docs/docs/02_User_Documentation/07_Catalog/01_Products.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Products Documentation - -Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md b/docs/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md deleted file mode 100644 index 8e02f22908..0000000000 --- a/docs/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md +++ /dev/null @@ -1,3 +0,0 @@ -# Product Variants - -CoreShop has the Variant Bundle to handle Variants, see [here](./../../03_Bundles/Variant_Bundle.md). \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/07_Catalog/03_Categories.md b/docs/docs/02_User_Documentation/07_Catalog/03_Categories.md deleted file mode 100644 index a1aa2e5963..0000000000 --- a/docs/docs/02_User_Documentation/07_Catalog/03_Categories.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Categories Documentation - -Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsAddBrick.png b/docs/docs/02_User_Documentation/07_Catalog/img/VariantsAddBrick.png deleted file mode 100644 index c4d9c4e915..0000000000 Binary files a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsAddBrick.png and /dev/null differ diff --git a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsExample.png b/docs/docs/02_User_Documentation/07_Catalog/img/VariantsExample.png deleted file mode 100644 index 628854e7e3..0000000000 Binary files a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsExample.png and /dev/null differ diff --git a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsInherited.png b/docs/docs/02_User_Documentation/07_Catalog/img/VariantsInherited.png deleted file mode 100644 index 857c22a4cd..0000000000 Binary files a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsInherited.png and /dev/null differ diff --git a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsToProject.png b/docs/docs/02_User_Documentation/07_Catalog/img/VariantsToProject.png deleted file mode 100644 index 4ede67001c..0000000000 Binary files a/docs/docs/02_User_Documentation/07_Catalog/img/VariantsToProject.png and /dev/null differ diff --git a/docs/docs/02_User_Documentation/07_Catalog/index.md b/docs/docs/02_User_Documentation/07_Catalog/index.md deleted file mode 100644 index 75e5c59a04..0000000000 --- a/docs/docs/02_User_Documentation/07_Catalog/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# CoreShop Catalog - - * [Products](./01_Products.md) - * [Product Variants](./02_Product_Variants.md) - * [Categories](./03_Categories.md) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/08_Geo_IP.md b/docs/docs/02_User_Documentation/08_Geo_IP.md deleted file mode 100644 index 3116b2fc04..0000000000 --- a/docs/docs/02_User_Documentation/08_Geo_IP.md +++ /dev/null @@ -1,3 +0,0 @@ -CoreShop can use GeoIP to locate visitors countries using IP-Addresses. - -CoreShop uses the already existing Pimcore GeoIP Database located in: ```/var/config/GeoLite2-City.mmdb``` \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/08_Inventory/index.md b/docs/docs/02_User_Documentation/08_Inventory/index.md deleted file mode 100644 index 49d36370d5..0000000000 --- a/docs/docs/02_User_Documentation/08_Inventory/index.md +++ /dev/null @@ -1,31 +0,0 @@ -# CoreShop Inventory -The Inventory is a complex topic since there is a lot of business logic you need to know about. - -## Product Inventory -Every Product object comes with a "Stock" Tab. Let's have a look about the configuration: - -| Name | Description | -|:-----|:------------| -| Is Tracked | Define if a product should get tracked | -| On Hand | Amount of available products. | -| On Hold | Defines how many elements are currently locked. Do not change that value unless you know what you're doing. | - -### Is Tracked -If you want to enable the inventory feature for a product, you need to check this setting. -After that this product is not orderable in frontend if stock is insufficient. - -> **Note**: Only if you enable "Is Tracked" the inventory stock is active! -> Otherwise the product is always available regardless of it's stock amount. - -### On Hand -Define a available amount for each product. -With every successfully order, an arbitrary amount will be subtracted. - -### On Hold -This one needs some further explanation: -After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete: -- If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand". -- If the order payment status switches to `paid`, the reserved "On Hold" amount gets subtracted. - -## Cart / Checkout -If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/01_Sales.md b/docs/docs/02_User_Documentation/09_Reports/01_Sales.md deleted file mode 100644 index a083c882c7..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/01_Sales.md +++ /dev/null @@ -1,29 +0,0 @@ -# CoreShop Sales Report - -![Sales Report](img/sales.png) - -| Type | Has Pagination | -|:-----|:-----------| -| Cartesian Chart | No | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | -| Group By | Group Filter by `Day`, `Month`, `Year` | - -## Available Chart Fields - -| Name | Description | -|:-----|:------------| -| Y | Amount (Sales) | -| X | Date | diff --git a/docs/docs/02_User_Documentation/09_Reports/02_Carts.md b/docs/docs/02_User_Documentation/09_Reports/02_Carts.md deleted file mode 100644 index 806cf3c1a9..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/02_Carts.md +++ /dev/null @@ -1,28 +0,0 @@ -# CoreShop Cart/Order Conversion Report - -![Carts Report](img/carts.png) - -| Type | Has Pagination | -|:-----|:-----------| -| Cartesian Chart | No | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Chart Fields - -| Name | Description | -|:-----|:------------| -| Y | Amount (Cart, Order) | -| X | Date | diff --git a/docs/docs/02_User_Documentation/09_Reports/03_Abandoned_Carts.md b/docs/docs/02_User_Documentation/09_Reports/03_Abandoned_Carts.md deleted file mode 100644 index 855f27edd8..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/03_Abandoned_Carts.md +++ /dev/null @@ -1,31 +0,0 @@ -# CoreShop Abandoned Carts Report - -| Type | Has Pagination | -|:-----|:-----------| -| List | Yes | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Grid Fields - -| Name | Description | -|:-----|:------------| -| Customer Name | Customer name (if available) | -| Email | Customer Email (if available) | -| Selected Payment | Name of selected Payment | -| Creation Date| Creation Date | -| Modification Date| Modification Date | -| Items in Cart| Amount of Items in Cart | -| Action| Open Cart Object | \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/04_Products.md b/docs/docs/02_User_Documentation/09_Reports/04_Products.md deleted file mode 100644 index 52e4a72c6c..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/04_Products.md +++ /dev/null @@ -1,41 +0,0 @@ -# CoreShop Products Report - -![Products Report](img/products.png) - -| Type | Has Pagination | -|:-----|:-----------| -| List | Yes | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | -| Product Types | Group Filter by `Main Products`, `Variants`, `Container Products` | - -## Product Types - -| Name | Description | -|:-----|:------------| -| Main Products | Only show Products without Variant inclusion | -| Variants | Only show Variant Product Types | -| Container Products | Show Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted! | - -## Available Grid Fields - -| Name | Description | -|:-----|:------------| -| Name | Product Name | -| Order Count | Amount of Order | -| Quantity | Quantity | -| Sale Price | Sale Price | -| Sales | Amount of Sales | -| Profit | Amount of Profit | \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/05_Categories.md b/docs/docs/02_User_Documentation/09_Reports/05_Categories.md deleted file mode 100644 index 15445f82a3..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/05_Categories.md +++ /dev/null @@ -1,31 +0,0 @@ -# CoreShop Categories Report - -![Categories Report](img/categories.png) - -| Type | Has Pagination | -|:-----|:-----------| -| List | No | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Grid Fields - -| Name | Description | -|:-----|:------------| -| Name | Product Name | -| Order Count | Amount of Orders | -| Quantity| Quantity | -| Sales | Sales | -| Profit | Profit | \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/06_Customers.md b/docs/docs/02_User_Documentation/09_Reports/06_Customers.md deleted file mode 100644 index abac240856..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/06_Customers.md +++ /dev/null @@ -1,29 +0,0 @@ -# CoreShop Customers Report - -![Customers Report](img/customers.png) - -| Type | Has Pagination | -|:-----|:-----------| -| List | No | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Grid Fields - -| Name | Description | -|:-----|:------------| -| Name | Customer Name | -| Order Count | Amount of Orders | -| Sales | Sales | \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/07_Carrier_Distribution.md b/docs/docs/02_User_Documentation/09_Reports/07_Carrier_Distribution.md deleted file mode 100644 index 1a06ba6b3f..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/07_Carrier_Distribution.md +++ /dev/null @@ -1,24 +0,0 @@ -# CoreShop Carrier Distribution Report - -![Carrier Distribution](img/carriers.png) - -| Type | Has Pagination | -|:-----|:-----------| -| Pie Chart | No | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Chart Fields -Carrier Distribution \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/08_Payment_Distribution.md b/docs/docs/02_User_Documentation/09_Reports/08_Payment_Distribution.md deleted file mode 100644 index 8202e16bdc..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/08_Payment_Distribution.md +++ /dev/null @@ -1,24 +0,0 @@ -# CoreShop Payment Distribution Report - -![Payment Distribution](img/payments.png) - -| Type | Has Pagination | -|:-----|:-----------| -| Pie Chart | No | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Chart Fields -Payment Provider Distribution \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/09_Vouchers.md b/docs/docs/02_User_Documentation/09_Reports/09_Vouchers.md deleted file mode 100644 index ac69fae892..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/09_Vouchers.md +++ /dev/null @@ -1,28 +0,0 @@ -# CoreShop Voucher Report - -| Type | Has Pagination | -|:-----|:-----------| -| List | Yes | - -## Available Filters - -| Name | Description | -|:-----|:------------| -| Store | Filter by Store | -| Day | Shortcut Filter by current Day | -| Month | Shortcut Filter by current Month | -| Year | Shortcut Filter by current Year | -| Day -1 | Shortcut Filter by last Day | -| Month -1 | Shortcut Filter by last Month | -| Year -1 | Shortcut Filter by last Year | -| From | Date to Start Filter | -| To | Date to End Filter | - -## Available Grid Fields - -| Name | Description | -|:-----|:------------| -| Code | Applied Code | -| Discount | Amount of Discount | -| Price Rule | Name of applied Price Rule | -| Applied Date | Applied Date | \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/09_Reports/index.md b/docs/docs/02_User_Documentation/09_Reports/index.md deleted file mode 100644 index 5b6bfd85b9..0000000000 --- a/docs/docs/02_User_Documentation/09_Reports/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# CoreShop Reports - * [Sales](./01_Sales.md) - * [Cart/Order Conversion](./02_Carts.md) - * [Abandoned Carts](./03_Abandoned_Carts.md) - * [Products](./04_Products.md) - * [Categories](./05_Categories.md) - * [Customers](./06_Customers.md) - * [Carrier Distribution](./07_Carrier_Distribution.md) - * [Payment Distribution](./08_Payment_Distribution.md) - * [Vouchers](./09_Vouchers.md) \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/10_Automation/index.md b/docs/docs/02_User_Documentation/10_Automation/index.md deleted file mode 100644 index da52a8593b..0000000000 --- a/docs/docs/02_User_Documentation/10_Automation/index.md +++ /dev/null @@ -1,70 +0,0 @@ -# CoreShop Automation -In CoreShop there are several automation mechanism implemented. - -## Order Cancellation -> Execution Time: Once per day via maintenance job - -CoreShop will automatically cancel orders older than `20` days. - -#### Change Orders Expiration Date -```yml -core_shop_storage_list: - list: - order: - expiration: - params: - order: - days: 30 -``` - -## Expired Carts -> Execution Time: Once per day via maintenance job - -> **Note**: By default, this feature is disabled. - -By default, this feature is disabled (`days = 0`) so no carts will be removed by default. -If you want to remove older carts, just enable it via configuration: - -#### Change Cart Expiration Date -```yml -core_shop_storage_list: - list: - order: - expiration: - params: - cart: - days: 20 - params: - anonymous: true - customer: false -``` - -## Expired Wishlists -> Execution Time: Once per day via maintenance job - -> **Note**: By default, this feature is disabled. - -By default, this feature is disabled (`days = 0`) so no wishlists will be removed by default. -If you want to remove older wishlists, just enable it via configuration: - -#### Change Wishlist Expiration Date -```yml -core_shop_storage_list: - list: - wishlist: - expiration: - service: ~ # use default service - enabled: true - days: 14 - params: - anonymous: true - customer: false -``` - -## Expired Rules -> Execution Time: Once per day via maintenance job - -If you're having a lot of active rules in your system, you may want to disable them via automation. -CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. -If you want do implement some further availability logic, you could use the `coreshop.rule.availability_check` Event to define -the availability of the rule. Just use the `setAvailability()` method to override the system availability suggestion. \ No newline at end of file diff --git a/docs/docs/02_User_Documentation/img/settings-system.png b/docs/docs/02_User_Documentation/img/settings-system.png deleted file mode 100644 index aa2cdf45b2..0000000000 Binary files a/docs/docs/02_User_Documentation/img/settings-system.png and /dev/null differ diff --git a/docs/docs/02_User_Documentation/index.md b/docs/docs/02_User_Documentation/index.md deleted file mode 100644 index fbbedf40ea..0000000000 --- a/docs/docs/02_User_Documentation/index.md +++ /dev/null @@ -1,46 +0,0 @@ -# User Documentation - -This section provides a quick getting started tutorial for CoreShop and covers the following topics: - -1. [Stores](./01_Stores.md) -2. [Settings](./02_Settings.md) -3. [Price Rules](./03_Price_Rules/index.md) - 1. [Cart Price Rules](./03_Price_Rules/01_Cart_Price_Rules.md) - 2. [Product Price Rules](./03_Price_Rules/02_Product_Price_Rules.md) - 3. [Specific Product Price](./03_Price_Rules/03_Specific_Price_Rules.md) - 4. [Vouchers](./03_Price_Rules/05_Vouchers.md) - 5. [Available Actions](./03_Price_Rules/06_Actions.md) - 6. [Available Conditions](./03_Price_Rules/07_Conditions.md) -4. [Localization](./04_Localization/index.md) - 1. [Countries](./04_Localization/01_Countries.md) - 2. [States](./04_Localization/02_States.md) - 3. [Zones](./04_Localization/03_Zones.md) - 4. [Taxes](./04_Localization/04_Currencies.md) - 5. [Taxes](./04_Localization/05_Taxes.md) - 6. [TaxRules](./04_Localization/06_TaxRules.md) -5. [Shipping](./05_Shipping/index.md) - 1. [Carriers](./05_Shipping/01_Carriers.md) - 2. [Shipping Rules](./05_Shipping/02_Shipping_Rules.md) -6. [Cart](./06_Cart/index.md) -7. [Order](./06_Order/index.md) - 1. [Orders](./06_Order/01_Orders.md) - 2. [Order Detail](./06_Order/02_Order_Detail.md) - 3. [Order Workflow](./06_Order/03_Order_Workflow.md) - 4. [Order Comments](./06_Order/04_Order_Comments.md) -8. [Catalog](./07_Catalog/index.md) - 1. [Products](./07_Catalog/01_Products.md) - 2. [Product Variants](./07_Catalog/02_Product_Variants.md) - 3. [Categories](./07_Catalog/03_Categories.md) -9. [Inventory](./08_Inventory/index.md) -10. [GEO IP](./08_Geo_IP.md) -11. [Reports](./09_Reports/index.md) - 1. [Sales](./09_Reports/01_Sales.md) - 2. [Cart/Order Conversion](./09_Reports/02_Carts.md) - 3. [Abandoned Carts](./09_Reports/03_Abandoned_Carts.md) - 4. [Products](./09_Reports/04_Products.md) - 5. [Categories](./09_Reports/05_Categories.md) - 6. [Customers](./09_Reports/06_Customers.md) - 7. [Carrier Distribution](./09_Reports/07_Carrier_Distribution.md) - 8. [Payment Distribution](./09_Reports/08_Payment_Distribution.md) - 9. [Vouchers](./09_Reports/09_Vouchers.md) -12. [Automation](./10_Automation/index.md) diff --git a/docs/docs/03_Bundles/Address_Bundle.md b/docs/docs/03_Bundles/Address_Bundle.md deleted file mode 100644 index 5eb4303f36..0000000000 --- a/docs/docs/03_Bundles/Address_Bundle.md +++ /dev/null @@ -1,10 +0,0 @@ -# Address Bundle - -CoreShop Address Bundle provides a basic set of data for Addressing Information like: - - Country - - State - - Address - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. - - diff --git a/docs/docs/03_Bundles/ClassDefinitionPatch_Bundle.md b/docs/docs/03_Bundles/ClassDefinitionPatch_Bundle.md deleted file mode 100644 index 45738c6632..0000000000 --- a/docs/docs/03_Bundles/ClassDefinitionPatch_Bundle.md +++ /dev/null @@ -1,55 +0,0 @@ -# Class Definition Patch Bundle - -CoreShop Class Definition Patch Bundle allows you to patch class definitions from other bundles. This is useful if you want to add new properties to existing classes with a configuration. - -## Installation -```bash -$ composer require coreshop/class-definitions-patch-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel. - -```php -addBundles([ - new \CoreShop\Bundle\ClassDefinitionPatchBundle\CoreShopClassDefinitionPatchBundle(), - ]); -} -``` - -### Usage - -Add a configuration to patch a certain pimcore class definition: - -```yaml -core_shop_class_definition_patch: - patches: - CoreShopCompany: - interface: 'blub' - fields: - name2: - before: 'addresses' - definition: - fieldtype: input - title: coreshop.company.name2 -``` - -You can then run the command to preview it: - -```bash -bin/console coreshop:patch:classes --dump -``` - - - -If you are happy with what you see, you can apply the patch. Since the patch is applied to your local definitions, and they should be part of your git repository, you should commit the changes and don't have to run the patch command on the deployment. - -```bash -bin/console coreshop:patch:classes --force -``` \ No newline at end of file diff --git a/docs/docs/03_Bundles/Configuration_Bundle.md b/docs/docs/03_Bundles/Configuration_Bundle.md deleted file mode 100644 index 15e57bf78f..0000000000 --- a/docs/docs/03_Bundles/Configuration_Bundle.md +++ /dev/null @@ -1,17 +0,0 @@ -# Configuration Bundle - -## Installation -```bash -$ composer require coreshop/configuration-bundle:^3.0 -``` - -## Usage - -Configuration Component helps you store your configurations in database. - -```php - $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory); - $service->set('key', 'value'); - - $service->get('key'); -``` \ No newline at end of file diff --git a/docs/docs/03_Bundles/Core_Bundle.md b/docs/docs/03_Bundles/Core_Bundle.md deleted file mode 100644 index 656c6ab9ba..0000000000 --- a/docs/docs/03_Bundles/Core_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Core Bundle - -Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly. - -> This Bundle is not advised to be installed seperately! diff --git a/docs/docs/03_Bundles/Currency_Bundle.md b/docs/docs/03_Bundles/Currency_Bundle.md deleted file mode 100644 index 6cb498a20b..0000000000 --- a/docs/docs/03_Bundles/Currency_Bundle.md +++ /dev/null @@ -1,63 +0,0 @@ -# Currency Bundle - -Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts. - - - Symfony Profiler - - Pimcore Core Extensions - - Doctrine Mappings - - Symfony Forms - - Money Formatter - - Twig Extensions - - Currency Formatting - - Currency Conversion - - Currency Code to Symbol - -## Installation - -```bash -$ composer require coreshop/currency-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\CurrencyBundle\CoreShopCurrencyBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -## Usage - -This Bundle integrates Currency Component into Symfony and Doctrine - -The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting - -## Doctrine Entities - - Currency - -## Pimcore UI - - - Currency - - Exchange Rate - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.currency', 'currency'); -coreshop.global.resource.open('coreshop.currency', 'exchange_rate'); -``` diff --git a/docs/docs/03_Bundles/Customer_Bundle.md b/docs/docs/03_Bundles/Customer_Bundle.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/docs/03_Bundles/Frontend_Bundle.md b/docs/docs/03_Bundles/Frontend_Bundle.md deleted file mode 100644 index 61b23e31a3..0000000000 --- a/docs/docs/03_Bundles/Frontend_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Frontend Bundle - -CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend. - -> This Bundle is not advised to be installed seperately! diff --git a/docs/docs/03_Bundles/Index_Bundle.md b/docs/docs/03_Bundles/Index_Bundle.md deleted file mode 100644 index 32f41b3c5e..0000000000 --- a/docs/docs/03_Bundles/Index_Bundle.md +++ /dev/null @@ -1,62 +0,0 @@ -# Index Bundle - -## Installation -```bash -$ composer require coreshop/index-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\IndexBundle\CoreShopIndexBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -## Usage - -This Bundle integrates Index Component into Symfony and Doctrine - -The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions - -It also provides you with ListingServices and FilterServices - -### Get Listing from Index - -How to get a Listing from an Index? - -```php -$filter = $this->get('coreshop.repository.filter')->find(1); //Get Filter by ID 1 -$filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request); -$filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE); -$filteredList->setCategory($category); -$this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query); -$filteredList->load(); -``` - -## Pimcore UI - - - Index Configuration - - Filter Configuration - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.index', 'index'); -coreshop.global.resource.open('coreshop.index', 'filter'); -``` diff --git a/docs/docs/03_Bundles/Inventory_Bundle.md b/docs/docs/03_Bundles/Inventory_Bundle.md deleted file mode 100644 index 770e7e90bc..0000000000 --- a/docs/docs/03_Bundles/Inventory_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Inventory Bundle - -CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Locale_Bundle.md b/docs/docs/03_Bundles/Locale_Bundle.md deleted file mode 100644 index c1ad5a8b60..0000000000 --- a/docs/docs/03_Bundles/Locale_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Locale Bundle - -CoreShop Locale Bundle provides a basic set of data for Locale Information. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Menu_Bundle.md b/docs/docs/03_Bundles/Menu_Bundle.md deleted file mode 100644 index f741b84a3e..0000000000 --- a/docs/docs/03_Bundles/Menu_Bundle.md +++ /dev/null @@ -1,94 +0,0 @@ -# Menu Bundle - -Menu Bundle makes it easy creating Pimcore Menus based on permissions. - -## Installation -```bash -$ composer require coreshop/menu-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\MenuBundle\CoreShopMenuBundle(), - ]); -} -``` - -### Usage - -Create a new Menu by creating a new Class, let's call it `MyMenuBuilder` - -```php - -namespace AppBundle\Menu; - -use CoreShop\Bundle\MenuBundle\Builder\MenuBuilderInterface; -use Knp\Menu\FactoryInterface; -use Knp\Menu\ItemInterface; - -class MyMenuBuilder implements MenuBuilderInterface -{ - public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) - { - //Create a new direct sub-menu item - $menuItem - ->addChild('my-menu-item') - ->setLabel('my-menu-item') - ->setAttribute('permission', 'my_menu_item') - ->setAttribute('iconCls', 'pimcore_icon_delete') - ; - } -} -``` - -You then need to register your class to the symfony container: - -```yml - app.my_menu: - class: AppBundle\Menu\MyMenuBuilder - tags: - - { name: coreshop.menu, type: my_menu, menu: my_menu } - -``` - -Where the `menu` attribute defines your unique identifier for your menu. You can also register multiple Builders -for your Menu with the same `menu` attribute, this will load them one after another. - -Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your -`Bundle.php` file, add this file to the `jsPaths` array: - -``` -'/admin/coreshop/coreshop.my_menu/menu.js' -``` - -Where `my_menu` here again is your defined identifier. This will load a basic helper file that will build your menu. -Now, let's actually build the menu. - -You should already have a `startup.js` somehwere in your Bundle. In there, you can instantiate the menu by calling: - -``` -new coreshop.menu.coreshop.my_menu(); -``` - -That will build the menu automatically for you. - -In order now to do something when a menu-item is clicked, you can attach to the event that is fired: - -```javascript -pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({ - coreshopMenuOpen: function(type, item) { - if (item.id === 'my-menu-item') { - alert('My Menu Item has been clicked'); - } - } -}))); -``` diff --git a/docs/docs/03_Bundles/Messenger_Bundle.md b/docs/docs/03_Bundles/Messenger_Bundle.md deleted file mode 100644 index 621cfe050b..0000000000 --- a/docs/docs/03_Bundles/Messenger_Bundle.md +++ /dev/null @@ -1,26 +0,0 @@ -# Messenger Bundle - -CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues: - -![Messenger](img/messenger.png) - -## Installation -```bash -$ composer require coreshop/messenger-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel. - -```php -addBundles([ - new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(), - ]); -} -``` \ No newline at end of file diff --git a/docs/docs/03_Bundles/Money_Bundle.md b/docs/docs/03_Bundles/Money_Bundle.md deleted file mode 100644 index 9d92499510..0000000000 --- a/docs/docs/03_Bundles/Money_Bundle.md +++ /dev/null @@ -1,33 +0,0 @@ -# Money Bundle - -## Installation -```bash -$ composer require coreshop/money-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\MoneyBundle\CoreShopMoneyBundle(), - ]); -} -``` - -## Usage - -Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer. - -You also get a Twig Extension to format money values. - -```twig -{{ value|coreshop_format_money('€', 'de'); }} -``` - diff --git a/docs/docs/03_Bundles/Notification_Bundle.md b/docs/docs/03_Bundles/Notification_Bundle.md deleted file mode 100644 index 64ccc30ed6..0000000000 --- a/docs/docs/03_Bundles/Notification_Bundle.md +++ /dev/null @@ -1,15 +0,0 @@ -# Notification Bundle - -CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like: - - Notification Rules - - Notification Rule Conditions - - Notification Rule Actions - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. - -## Usage -Notifications run async in a Symfony messenger queue: - -``` -bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300 -``` diff --git a/docs/docs/03_Bundles/OptimisticEntityLock_Bundle.md b/docs/docs/03_Bundles/OptimisticEntityLock_Bundle.md deleted file mode 100644 index d82316e63b..0000000000 --- a/docs/docs/03_Bundles/OptimisticEntityLock_Bundle.md +++ /dev/null @@ -1,33 +0,0 @@ -# Optimistic Entity Lock Bundle - -The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. -![Messenger](img/messenger.png) - -## Installation -```bash -$ composer require optimistic-entity-lock-bundle -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel. - -```php -addBundles([ - new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(), - ]); -} -``` - -## Usage - -Your Pimcore DataObject Class needs to implement the Interface `CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface`. - -You can therefore add the field `optimisticLockVersion` to your Pimcore Class Definition. - -From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Order_Bundle.md b/docs/docs/03_Bundles/Order_Bundle.md deleted file mode 100644 index 60cbd317d8..0000000000 --- a/docs/docs/03_Bundles/Order_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Order Bundle - -CoreShop Order Bundle provides a basic set of data for Orders. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Payment_Bundle.md b/docs/docs/03_Bundles/Payment_Bundle.md deleted file mode 100644 index 7088ec6366..0000000000 --- a/docs/docs/03_Bundles/Payment_Bundle.md +++ /dev/null @@ -1,51 +0,0 @@ -# Payment Bundle - -## Installation -```bash -$ composer require coreshop/payment-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\PaymentBundle\CoreShopPaymentBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -## Usage - -This Bundle integrates Payment Component into Symfony and Doctrine - -The Payment Bundle provides you with basic information needed for payment: Payment - -The Bundle also introduces an Address Formatter, which formats addresses in country based formats. - -## Doctrine Entities - - Payment - - ## Pimcore UI - - - Payment Provider - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.payment', 'payment_provider'); -``` - diff --git a/docs/docs/03_Bundles/PayumPayment_Bundle.md b/docs/docs/03_Bundles/PayumPayment_Bundle.md deleted file mode 100644 index f68131af2e..0000000000 --- a/docs/docs/03_Bundles/PayumPayment_Bundle.md +++ /dev/null @@ -1,3 +0,0 @@ -# Payum Payment Bundle - -Integrates CoreShop Payment Bundle with Payum. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Payum_Bundle.md b/docs/docs/03_Bundles/Payum_Bundle.md deleted file mode 100644 index 581a4e475f..0000000000 --- a/docs/docs/03_Bundles/Payum_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Payum Bundle - -Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation. - -> This Bundle is not advised to be installed seperately! diff --git a/docs/docs/03_Bundles/ProductQuantityPriceRules_Bundle.md b/docs/docs/03_Bundles/ProductQuantityPriceRules_Bundle.md deleted file mode 100644 index 3ca0c5af12..0000000000 --- a/docs/docs/03_Bundles/ProductQuantityPriceRules_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Product Quantity Price Rules Bundle - -This Bundle implements the Quantity Price Rules for CoreShop. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Product_Bundle.md b/docs/docs/03_Bundles/Product_Bundle.md deleted file mode 100644 index 436ed819d6..0000000000 --- a/docs/docs/03_Bundles/Product_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Product Bundle - -CoreShop Product Bundle is responsible for the Product Management. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Resource_Bundle/01_CustomEntities.md b/docs/docs/03_Bundles/Resource_Bundle/01_CustomEntities.md deleted file mode 100644 index bb34fb01ad..0000000000 --- a/docs/docs/03_Bundles/Resource_Bundle/01_CustomEntities.md +++ /dev/null @@ -1,324 +0,0 @@ -# Adding a new custom entity - -## Create Translatable Entity - -First of all, we need to create our Entity Class. In this case, we create a Translatable Entity. - -```php -initializeTranslationsCollection(); - } - - public function getId() - { - return $this->id; - } - - public function getName($language = null) - { - return $this->getTranslation($language)->getName(); - } - - public function setName($name, $language = null) - { - $this->getTranslation($language, false)->setName($name); - - return $this; - } - - protected function createTranslation() - { - return new CustomEntityTranslation(); - } -} -``` - -Since our Entity is Translatable, we need to add our Translation Entity as well. - -```php -id; - } - - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } -} -``` - -## Create Doctrine Configuration - -```yaml -# AppBundle/Resources/config/doctrine/model/CustomEntity.orm.yml - -AppBundle\Model\CustomEntity: - type: mappedSuperclass - table: app_custom_entity - fields: - id: - type: integer - column: id - id: true - generator: - strategy: AUTO -``` - -Our Translation Doctrine definition: - -```yaml -# AppBundle/Resources/config/doctrine/model/CustomEntityTranslation.orm.yml - -AppBundle\Model\CustomEntityTranslation: - type: mappedSuperclass - table: app_custom_entity_translation - fields: - id: - type: integer - column: id - id: true - generator: - strategy: AUTO - name: - type: string - column: name -``` - -## Create DI Configuration - -```php -root('app'); - - $rootNode - ->children() - ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end() - ->end() - ; - $this->addModelsSection($rootNode); - - return $treeBuilder; - } - - /** - * @param ArrayNodeDefinition $node - */ - private function addModelsSection(ArrayNodeDefinition $node) - { - $node - ->children() - ->arrayNode('resources') - ->addDefaultsIfNotSet() - ->children() - ->arrayNode('custom_entity') - ->addDefaultsIfNotSet() - ->children() - ->variableNode('options')->end() - ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end() - ->arrayNode('classes') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end() - ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end() - ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() - ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end() - ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end() - ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end() - ->end() - ->end() - ->arrayNode('translation') - ->addDefaultsIfNotSet() - ->children() - ->variableNode('options')->end() - ->arrayNode('classes') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end() - ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end() - ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() - ->scalarNode('repository')->cannotBeEmpty()->end() - ->scalarNode('factory')->defaultValue(Factory::class)->end() - ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ; - } -} -``` - -```php -processConfiguration($this->getConfiguration([], $container), $config); - //'app' is the application name - $this->registerResources('app', $config['driver'], $config['resources'], $container); - } -} - -``` - -```php -root('AppBundle'); - - $this->addPimcoreResourcesSection($rootNode); - - return $treeBuilder; - } - - private function addPimcoreResourcesSection(ArrayNodeDefinition $node) - { - $node->children() - ->arrayNode('pimcore_admin') - ->addDefaultsIfNotSet() - ->children() - ->arrayNode('install') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('routes')->defaultValue(['@AppBundle/Resources/install/pimcore/routes.yml'])->end() - ->scalarNode('sql')->defaultValue(['@AppBundle/Resources/install/pimcore/data.sql'])->end() - ->end() - ->end() - ->scalarNode('permissions') - ->cannotBeOverwritten() - ->defaultValue(['name_of_permission']) - ->end() - ->end() - ->end() - ->end(); - } -} - -``` - -## Routes Example File -```yaml -yeah_route: - pattern: "/(\\w+)\\/yeah-route/" - reverse: "/%_locale/yeah\-route" - module: AppBundle - controller: "@app.frontend.controller.controller" - action: doSomething - variables: _locale - priority: 2 -``` diff --git a/docs/docs/03_Bundles/Resource_Bundle/index.md b/docs/docs/03_Bundles/Resource_Bundle/index.md deleted file mode 100644 index e53451b08d..0000000000 --- a/docs/docs/03_Bundles/Resource_Bundle/index.md +++ /dev/null @@ -1,33 +0,0 @@ -# Resource Bundle - -Resource Bundle is the Heart of CoreShops Model. It handles saving/deleting/updating/creating of CoreShop Models. It handles -Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD. - -Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, -Static Routes and SQL. - -You can use Resource Bundle as base for all your Custom Pimcore Entities. - -## Installation -```bash -$ composer require coreshop/resource-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \JMS\SerializerBundle\JMSSerializerBundle(), - new \CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle(), - new \Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(), - new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle() - ]); -} -``` diff --git a/docs/docs/03_Bundles/Rule_Bundle.md b/docs/docs/03_Bundles/Rule_Bundle.md deleted file mode 100644 index 6d4caa44ad..0000000000 --- a/docs/docs/03_Bundles/Rule_Bundle.md +++ /dev/null @@ -1,7 +0,0 @@ -# Rule Bundle - -CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like: - - Rule Conditions - - Rule Actions - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/SEO_Bundle.md b/docs/docs/03_Bundles/SEO_Bundle.md deleted file mode 100644 index 385a35b6e3..0000000000 --- a/docs/docs/03_Bundles/SEO_Bundle.md +++ /dev/null @@ -1,96 +0,0 @@ -# SEO Bundle - -## Installation -```bash -$ composer require coreshop/seo-bundle:^3.0 -``` - -### Activating Bundle -You need to enable the bundle inside the kernel or with the Pimcore Extension Manager. - -```php -addBundles([ - new \CoreShop\Bundle\SEOBundle\CoreShopSEOBundle() - ]); -} -``` - -## Usage - -The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper. - -There are multiple ways of making use of this bundle: - - - Implement SEO interfaces provided with this bundle - - Implement Custom Extractors and add them to the SEOMetadata Model - -To update the SEO Information, you need to use the service ```coreshop.seo.presentation```: - -```php - -//From a Controller -$this->get('coreshop.seo.presentation')->updateSeoMetadata($object); -``` - -### Implement SEO Interfaces -SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of: - - - `CoreShop\Component\SEO\Model\SEOAwareInterface` for meta-title and meta-description - - `CoreShop\Component\SEO\Model\SEOImageAwareInterface` for og-image attribute - - `CoreShop\Component\SEO\Model\SEOImageAwareInterface` for og-title, og-type and pg-description attribute - -### Implement SEO Extractors -To add a new Extractor, you need to implement the interface ```CoreShop\Component\SEO\Extractor\ExtractorInterface``` and register your class with the tag ```coreshop.seo.extractor```: - -#### Example -Let's implement a custom extractor for our Product class with a Video. - - -```php -getVideoUrl(); - } - - /** - * {@inheritdoc} - */ - public function updateMetadata($object, SEOMetadataInterface $seoMetadata) - { - /** - * @var $object Product - */ - $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl()); - } -} -``` - -Now we need to register the service - -```yml -# src/AppBundle/Resources/config/services.yml -services: - AppBundle\SEO\Extractor: - tags: - - { name: coreshop.seo.extractor, type: product_video } - -``` diff --git a/docs/docs/03_Bundles/Sequence_Bundle.md b/docs/docs/03_Bundles/Sequence_Bundle.md deleted file mode 100644 index 62b366c5bd..0000000000 --- a/docs/docs/03_Bundles/Sequence_Bundle.md +++ /dev/null @@ -1,46 +0,0 @@ -# Sequence Bundle - -## Installation -```bash -$ composer require coreshop/sequence-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -## Usage - -This Bundle integrates Sequence Component into Symfony and Doctrine - -The sequence Bundle provides you with basic information needed for sequence generation. - -## Doctrine Entities - - Sequence - -## Get a new Sequence - -```php - -$container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence'); - -``` diff --git a/docs/docs/03_Bundles/Shipping_Bundle.md b/docs/docs/03_Bundles/Shipping_Bundle.md deleted file mode 100644 index ef9474159b..0000000000 --- a/docs/docs/03_Bundles/Shipping_Bundle.md +++ /dev/null @@ -1,31 +0,0 @@ -# Shipping Bundle - - -## Purpose: Let You define different shipping carriers -### & optional shipping rules for them -based on weight, payment total, countries, postcodes and so on. -### & apply tax rules on shipping rules - - - -## Installation -```bash -$ composer require coreshop/shipping-bundle:^3.0 -``` - -## Requirement - - RulesBundle - - TaxationBundle - -## Configure - - -## Options - -## - - -## Doctrine Entities - - Shipping - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/StorageList_Bundle.md b/docs/docs/03_Bundles/StorageList_Bundle.md deleted file mode 100644 index 94f6603e37..0000000000 --- a/docs/docs/03_Bundles/StorageList_Bundle.md +++ /dev/null @@ -1,66 +0,0 @@ -# Storage List Bundle - -Storage List Component helps you with Lists/Collections of Objects like a Cart, Wishlist or Compare List. - -## Usage -To use it you need to have 3 models: - -- a Storage List: the collection ([```CoreShop\Component\StorageList\Model\StorageListInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListInterface.php)) -- a Storage Item: the item within the collection which could store additional information (eg. prices for a cart) ([```CoreShop\Component\StorageList\Model\StorageListItemInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListItemInterface.php)) -- a Storage Product: the actual product (eg. object) being stored inside the Item. ([```CoreShop\Component\StorageList\Model\StorageListProductInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListProductInterface.php)) - -The component already provides you with a basic implementation of [```Storage List```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageList.php) and [```Storage Item```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageItem.php). -You need to implement the StorageListProduct yourself. - -To now mutate lists, the component gives you a [```Storage List Modifier```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/StorageListModifier.php), which takes care about creating and persisting the List. - -## Basic usage, Wishist example -For now, lets create a very basic Session based Wishlist: - -We need to have following things: - -- A Factory class for the Wishlist -- A Factory class for the Wishlist Item -- A StorageListManager to get the current list (more like a repository actually) -- A StoreListModifier - -CoreShop gives you Basic classes for these 4 things, we just need to instantiate them: - -```php - -use Symfony\Component\HttpFoundation\Session\Session; - -use CoreShop\Component\StorageList\Model\StorageList; -use CoreShop\Component\StorageList\Model\StorageListItem; -use CoreShop\Component\Resource\Factory\Factory; -use CoreShop\Component\StorageList\SessionStorageManager; -use CoreShop\Component\StorageList\SessionStorageListModifier; - -$session = new Session(); -$session->start(); - -$wishlistFactory = new Factory(StorageList::class); -$wishlistItemFactory = new Factory(StorageListItem::class); - -$wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory); -$wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager); - -//Now we can start putting data into our List -$list = $wishlistManager->getStorageList(); - -//Fetch our Product which implements CoreShop\Component\StorageList\Model\StorageListProductInterface -$product = $productRepository->find(1); - - -$listItem = $wishlistItemFactory->createNew(); -$listItem->setProduct($product); -$listItem->setQuantity($quantity); - -//Lets add our Product -$wishlistModifier->addToList($list, $listItem); - -//If we now want to remove it, we can either use the $listItem, or the Product -//To do that with our item, we simply call -$wishlistModifier->removeFromList($list, $listItem); - -``` diff --git a/docs/docs/03_Bundles/Store_Bundle.md b/docs/docs/03_Bundles/Store_Bundle.md deleted file mode 100644 index f366933608..0000000000 --- a/docs/docs/03_Bundles/Store_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Store Bundle - -CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Taxation_Bundle.md b/docs/docs/03_Bundles/Taxation_Bundle.md deleted file mode 100644 index d24ec45dc8..0000000000 --- a/docs/docs/03_Bundles/Taxation_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Taxation Bundle - -CoreShop Taxation Bundle is responsible for Tax Calculations. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Tracking_Bundle.md b/docs/docs/03_Bundles/Tracking_Bundle.md deleted file mode 100644 index c6148cb7f0..0000000000 --- a/docs/docs/03_Bundles/Tracking_Bundle.md +++ /dev/null @@ -1,10 +0,0 @@ -# Tracking Bundle - -## Installation -```bash -$ composer require coreshop/tracking-bundle:^3.0 -``` - -## Usage - -See [here](../03_Development/13_Ecommerce_Tracking/index.md) for more. diff --git a/docs/docs/03_Bundles/User_Bundle.md b/docs/docs/03_Bundles/User_Bundle.md deleted file mode 100644 index 15860500d1..0000000000 --- a/docs/docs/03_Bundles/User_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# User Bundle - -CoreShop User Bundle is responsible for the User Management. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Variant_Bundle.md b/docs/docs/03_Bundles/Variant_Bundle.md deleted file mode 100644 index cfcb704bad..0000000000 --- a/docs/docs/03_Bundles/Variant_Bundle.md +++ /dev/null @@ -1,63 +0,0 @@ -# Variant Bundle - -CoreShop Variant Bundle allows you to manage different Variants of a Product. - -## Installation -```bash - composer require coreshop/variant-bundle -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel. - -```php -addBundles([ - new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(), - ]); -} -``` - -## Abstract -Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants. - -In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like `XL` or `Red`. - -CoreShop describes these two types of entities as `Group` (`CoreShop\Component\Variant\Model\AttributeGroupInterface`) and `Value` (`CoreShop\Component\Variant\Model\AttributeValueInterface` - -The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled. - -Example: - - - AttributeGroup Color - -AttributeValue Red - -AttributeValue Blue - - - product (defines allowed groups for color) - - variant-red (defines the AttributeValue Red in attributes) - - variant-blue (defines the AttributeValue Blue in attributes) - -## Usage -CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need. - -Per Default, it comes with 3 different Classes: - - - `CoreShopAttributeGroup` - - `CoreShopAttributeColor` - - `CoreShopAttributeValue` - -Whereas `Color` and `Value` are two Value types and `Group` is a Group type. - -You can manually import the classes from this dir ```vendor/coreshop/variant-bundle/Resources/install/pimcore/classes``` - -To create a "Product" Class, you need to implement the interface ```CoreShop\Component\Variant\Model\ProductVariantAwareInterface```. The Class requires you to have these fields: - - - attributes - ManyToManyObjectRelation for `CoreShopAttributeColor`/`CoreShopAttributeValue` - - allowedAttributeGroups - ManyToManyObjectRelation for `CoreShopAttributeGroup` - - mainVariant - ManyToOneRelation for `Product` (eg. your Class where you implemented the interface) - diff --git a/docs/docs/03_Bundles/Wishlist_Bundle.md b/docs/docs/03_Bundles/Wishlist_Bundle.md deleted file mode 100644 index b9e8eb36c3..0000000000 --- a/docs/docs/03_Bundles/Wishlist_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Order Bundle - -CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/Workflow_Bundle.md b/docs/docs/03_Bundles/Workflow_Bundle.md deleted file mode 100644 index ef35ee1339..0000000000 --- a/docs/docs/03_Bundles/Workflow_Bundle.md +++ /dev/null @@ -1,5 +0,0 @@ -# Workflow Bundle - -CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it. - -> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/docs/03_Bundles/index.md b/docs/docs/03_Bundles/index.md deleted file mode 100644 index 807a7c61b7..0000000000 --- a/docs/docs/03_Bundles/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# Bundles - -CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution. - - - [Address Bundle](./Address_Bundle.md) - - [Configuration Bundle](./Configuration_Bundle.md) - - [Core Bundle](./Core_Bundle.md) - - [Currency Bundle](./Currency_Bundle.md) - - [Customer Bundle](./Customer_Bundle.md) - - [Frontend Bundle](./Frontend_Bundle.md) - - [Index Bundle](./Index_Bundle.md) - - [Inventory Bundle](./Inventory_Bundle.md) - - [Locale Bundle](./Locale_Bundle.md) - - [Money Bundle](./Money_Bundle.md) - - [Messenger Bundle](./Messenger_Bundle.md) ! - - [Money Bundle](./Money_Bundle.md) ! - - [Notification Bundle](./Notification_Bundle.md) ! - - [Optimistic Entity Lock Bundle](./OptimisticEntityLock_Bundle.md) ! - - [Order Bundle](./Order_Bundle.md) - - [Payment Bundle](./Payment_Bundle.md) - - [Payum Payment Bundle](./PayumPayment_Bundle.md) ! - - [Product Bundle](./Product_Bundle.md) - - [Product Quantity Price Rules Bundle](./ProductQuantityPriceRules_Bundle.md) - - [Resource Bundle](./Resource_Bundle) - - [Rule Bundle](./Rule_Bundle.md) - - [SEO Bundle](./SEO_Bundle.md) - - [Sequence Bundle](./Sequence_Bundle.md) - - [Shipping Bundle](./Shipping_Bundle.md) - - [Storage List Bundle](./StorageList_Bundle.md) - - [Store Bundle](./Store_Bundle.md) - - [Taxation Bundle](./Taxation_Bundle.md) - - [Theme Bundle](./Theme_Bundle.md) - - [Tracking Bundle](./Tracking_Bundle.md) - - [User Bundle](./User_Bundle.md) - - [Variant Bundle](./Variant_Bundle.md) - - [Wishlist Bundle](./Wishlist_Bundle.md) - - [Workflow Bundle](./Workflow_Bundle.md) - - [Class Definition Patch Bundle](./ClassDefinitionPatch_Bundle.md) \ No newline at end of file diff --git a/docs/docs/03_Development/01_Extending_Guide/01_Extend_CoreShop_Resources.md b/docs/docs/03_Development/01_Extending_Guide/01_Extend_CoreShop_Resources.md deleted file mode 100644 index a82b9df1b9..0000000000 --- a/docs/docs/03_Development/01_Extending_Guide/01_Extend_CoreShop_Resources.md +++ /dev/null @@ -1,123 +0,0 @@ -# Extend CoreShop Resources - -All models in Coreshop are placed in the ```Coreshop\Component\*ComponentName*\Model``` namespaces alongside with their interfaces. - -> Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component. - -## How to Customize a Model - -First things first: If you want to extend coreshop models your Bundle must extend the `AbstractResourceBundle`. Next you have set your supported drivers. Just add the following lines of code to your bundle class: - -```php -public function getSupportedDrivers(); array -{ - return [ - CoreShopResourceBundle::DRIVER_DOCTRINE_ORM - ]; -} - ``` - After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the `AppBundle` - -```php - protected function getModelNamespace(): string -{ - return "AppBundle\Model"; -} -``` -Here a quick overview for you which dictories are important for you, when customizing CoreShop models. - -| Folder | Description | -|--------|-------------| -| `AcmeBundle/Model` or `AcmeBundle/Entity` | Where your models are living | -| `AcmeBundle/config/doctrine/model` | Put your doctrine `.yml` config files in here | -| `AcmeBundle/config/serializer` | The serializer configs for the models| - - -Let’s take the [```CoreShop\Component\Currency\Model\Currency```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Currency/Model/Currency.php) as an example. This one is extended in Core. How can you check that? - -First of all, you need to find the current used class by doing following: - -```bash -$ php bin/console debug:container --parameter=coreshop.model.currency.class -``` - -As a result you will get the [```CoreShop\Component\Core\Model\Currency```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Model/Currency.php) - this is the class that you need to be extending. - -Assuming you want to add a field called **flag** - -**1.** The first thing to do is to write your own class which will extend the base ```Currency``` class - -```php -flag; - } - - /** - * @param bool $flag - */ - public function setFlag($flag) - { - $this->flag = $flag; - } -} -``` - -**2**. Next define your entity’s mapping. - -The file should be placed in ```AppBundle/Resources/config/doctrine/Currency.orm.yml``` - -```yaml -AppBundle\Entity\Currency: - type: mappedSuperclass - table: coreshop_currency - fields: - flag: - type: boolean - nullable: true -``` - -**3**. Finally you’ll need to override the model’s class in the ```app/config/config.yml```. - -Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency. - - -```yaml -core_shop_currency: - resources: - currency: - classes: - model: AppBundle\Entity\Currency -``` - -**4**. Update the database. There are two ways to do it. - -via direct database schema update: - -```bash -$ php bin/console doctrine:schema:update --force -``` - -via migrations: -Which we strongly recommend over updating the schema. - -```bash -$ php bin/console doctrine:migrations:diff -$ php bin/console doctrine:migrations:migrate -``` diff --git a/docs/docs/03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md b/docs/docs/03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md deleted file mode 100644 index 293e098b14..0000000000 --- a/docs/docs/03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md +++ /dev/null @@ -1,19 +0,0 @@ -# Extending CoreShop - -CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore. - -## Replace CoreShop Object Classes with your own Classes - -CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml - -```yaml -core_shop_order: - pimcore: - order: - classes: - model: 'Pimcore\Model\DataObject\MyOrderClass' - install_file: '@AppBundle/Resources/install/pimcore/classes/MyOrderClass.json' - repository: AppBundle\Repository\OrderRepository - factory: AppBundle\Factory\OrderFactory -``` - diff --git a/docs/docs/03_Development/01_Extending_Guide/05_Extending_Rule_Conditions.md b/docs/docs/03_Development/01_Extending_Guide/05_Extending_Rule_Conditions.md deleted file mode 100644 index 610139b27d..0000000000 --- a/docs/docs/03_Development/01_Extending_Guide/05_Extending_Rule_Conditions.md +++ /dev/null @@ -1,118 +0,0 @@ -# Custom Price-Rule/Shipping-Rule/Notification-Rule Conditions - -Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the -tag you use and Interface you need to implement for them. - - -| Action Type | Tag | Interface/AbstractClass | -| ------------------------- | ------------------------------------------------ | ----------------------------------------------------------- | -| Cart Price Rule | coreshop.cart_price_rule.condition | [```CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Cart/Rule/Condition/AbstractConditionChecker.php) | -| Product Price Rule | coreshop.product_price_rule.condition | [```CoreShop\Component\Rule\Condition\ConditionCheckerInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Rule/Condition/ConditionCheckerInterface.php) | -| Product Specific Price | coreshop.product_specific_price_rule.condition | [```CoreShop\Component\Rule\Condition\ConditionCheckerInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Rule/Condition/ConditionCheckerInterface.php) | -| Shipping Rule | coreshop.shipping_rule.condition | [```CoreShop\Component\Shipping\Rule\Condition\CategoriesConditionChecker```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Shipping/Rule/Condition/AbstractConditionChecker.php) | -| Notification Rule | coreshop.notification_rule.condition | [```CoreShop\Component\Notification\Rule\Condition\AbstractConditionChecker```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Notification/Rule/Condition/AbstractConditionChecker.php) | - - -## Example Adding a new Condition -Now, lets add a new Condition for Product Price Rules. - -To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use -[```CoreShop\Component\Rule\Condition\ConditionCheckerInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Rule/Condition/ConditionCheckerInterface.php) - -```php -//AppBundle/CoreShop/CustomCondition.php -namespace AppBundle\CoreShop; - -use CoreShop\Component\Resource\Model\ResourceInterface; -use CoreShop\Component\Rule\Model\RuleInterface; - -final class CustomCondition implements \CoreShop\Component\Rule\Condition\ConditionCheckerInterface -{ - public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool - { - //return true if valid, false if not - return true; - } -} -``` - -We also need a FormType for the conditions configurations: - -```php -//AppBundle/Form/Type/CustomConditionType.php -namespace AppBundle\Form\Type; - -final class CustomConditionType extends AbstractType -{ - /** - * {@inheritdoc} - */ - public function buildForm(FormBuilderInterface $builder, array $options): void - { - $builder - ->add('some_value', TextType::class) - ; - } -} -``` - -With configuration, comes a Javascript file as well: - -```javascript -//AppBundle/Resources/public/pimcore/js/custom_condition.js - -pimcore.registerNS('coreshop.product.pricerule.conditions.custom'); -coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, { - - type: 'custom', - - getForm: function () { - var some_value = 0; - var me = this; - - if (this.data) { - some_value = this.data.some_value / 100; - } - - var some_valueField = new Ext.form.NumberField({ - fieldLabel: t('custom'), - name: 'some_value', - value: some_value, - decimalPrecision: 2 - }); - - this.form = new Ext.form.Panel({ - items: [ - some_valueField - ] - }); - - return this.form; - } -}); -``` - -Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the `web`. -``` -bin/console assets:install web -``` - - -## Registering the Custom Condition to the Container and load the Javascript File -We now need to create our Service Definition for our Custom Condition: - -```yaml -app.product_price_rule.custom_condition: - class: AppBundle\CoreShop\CustomCondition - tags: - - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\Form\Type\CustomConditionType } -``` - -and add this to your config.yml: - -```yaml -core_shop_product: - pimcore_admin: - js: - custom_condition: '/bundles/app/pimcore/js/custom_condition.js' -``` diff --git a/docs/docs/03_Development/02_Localization/01_Currencies/03_Context.md b/docs/docs/03_Development/02_Localization/01_Currencies/03_Context.md deleted file mode 100644 index 1955258454..0000000000 --- a/docs/docs/03_Development/02_Localization/01_Currencies/03_Context.md +++ /dev/null @@ -1,20 +0,0 @@ -# CoreShop Currency Context - -For CoreShop to determine the current currency it uses a concept called context and context resolver. - -## Context - -| Name | Priority | Tag | Description| -|------|----------|-----|------------| -| [FixedCurrencyContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Currency/Context/FixedCurrencyContext.php) | default | `coreshop.context.currency` | Used for testing purposes | -| [StorageBasedCurrencyContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Context/Currency/StorageBasedCurrencyContext.php) | default | `coreshop.context.currency` | check if a currency has been changed during a frontend request | -| [CountryAwareCurrencyContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Context/Currency/CountryAwareCurrencyContext.php) | default | `coreshop.context.currency` | Mostly this context will apply since it will get the currency based on the current country context | - -These Contexts take care about finding the correct currency for the current request. - -## Create a Custom Resolver - -A Currency Context needs to implement the interface `CoreShop\Component\Currency\Context\CurrencyContextInterface`. -This interface consists of one method called `getCurrency` which returns a `CoreShop\Component\Currency\Model\CurrencyInterface` or throws an `CoreShop\Component\Currency\Context\CurrencyNotFoundException` - -To register your context, you need to use the tag: `coreshop.context.currency` with an optional `priority` attribute. diff --git a/docs/docs/03_Development/02_Localization/01_Currencies/index.md b/docs/docs/03_Development/02_Localization/01_Currencies/index.md deleted file mode 100644 index 1277d81063..0000000000 --- a/docs/docs/03_Development/02_Localization/01_Currencies/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Currencies - -> CoreShop is a multi-currency able eCommerce Framework. Therefore it is possible to create and use different currencies. - -1. [Create, Update, Read, Delete](./01_CRUD.md) -2. [Currency Context](./03_Context.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/02_Countries/02_Context.md b/docs/docs/03_Development/02_Localization/02_Countries/02_Context.md deleted file mode 100644 index 21db9a0847..0000000000 --- a/docs/docs/03_Development/02_Localization/02_Countries/02_Context.md +++ /dev/null @@ -1,107 +0,0 @@ -# CoreShop Country Context - -For CoreShop to determine the current country the visitor or customer comes from, -it uses a concept called context and context resolver. - -## Context -| Name | Priority | Tag | Description| -|------|----------|-----|------------| -| [FixedCountryContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Address/Context/FixedCountryContext.php) | default | `coreshop.context.country` | Used for testing purposes | -| [CountryContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Address/Context/RequestBased/CountryContext.php) | default | `coreshop.context.country` | Check for a country within the country request resolver | -| [StoreAwareCountryContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Context/Country/StoreAwareCountryContext.php) | default | `coreshop.context.country` | Check if current country is available in current store context | - -## Resolver - -| Name | Priority | Tag | Description| -|------|----------|-----|------------| -| [GeoLiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Address/Context/RequestBased/GeoLiteBasedRequestResolver.php) | 10 | `coreshop.context.country.request_based.resolver` | This Resolver tries to determinate the users location by using the Geo Lite Database. | - -These resolver takes care about finding the correct country for the current request. - -## Create a Custom Resolver - -A Country Context needs to implement the interface `CoreShop\Component\Address\Context\CountryContextInterface`. -This interface consists of one method called `getCountry` which returns a `CoreShop\Component\Address\Model\CountryInterface` or throws an `CoreShop\Component\Address\Context\CountryNotFoundException`. - -To register your context, you need to use the tag: `coreshop.context.country` with an optional `priority` attribute. - -## Create a Request based Resolver - -CoreShop already implements Request based country context resolver. -So if your Context depends on the current request, you can create a custom RequestBased Resolver. -To do that, implement the interface `CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface` -with the method `findCountry`. This method either returns a country or null. - -To register this resolver, use the tag: `coreshop.context.country.request_based.resolver` with an optional `priority` attribute. - -## Example - -We want to a CountryContext to be based on the Pimcore Document. So if we are on site `/de`, we want to resolve to `Austria`, if we -are on page `/en` we want to resolve to Country `Great Britain`: - -**1**: First of all we need to create our RequestBased Country Context: - -```php -pimcoreDocumentResolver = $pimcoreDocumentResolver; - $this->countryRepository = $countryRepository; - } - - public function findCountry(Request $request) - { - $doc = $this->pimcoreDocumentResolver->getDocument($request); - - if (substr($doc->getFullPath(), 0, 3) === '/en') { - return $this->countryRepository->findByCode('GB'); - } - - if (substr($doc->getFullPath(), 0, 3) === '/de') { - return $this->countryRepository->findByCode('AT'); - } - - return null; - } -} -``` - -Now we need to configure the service in `src/AppBundle/Resources/config/services.yml` - -```yaml -services: - app.coreshop.country.context.request.document_based: - class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver - arguments: - - '@Pimcore\Http\Request\Resolver\DocumentResolver' - - '@coreshop.repository.country' - tags: - - { name: coreshop.context.country.request_based.resolver } - -``` - -CoreShop now tries to resolve the current country based on the Pimcore Site we are on. diff --git a/docs/docs/03_Development/02_Localization/02_Countries/index.md b/docs/docs/03_Development/02_Localization/02_Countries/index.md deleted file mode 100644 index 5f0b753a02..0000000000 --- a/docs/docs/03_Development/02_Localization/02_Countries/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Countries - -> CoreShop is a multi-country able eCommerce Framework. Therefore it is possible to create and use different Countries. - -1. [Create, Update, Read, Delete](./01_CRUD.md) -2. [Country Context](./02_Context.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/03_States/index.md b/docs/docs/03_Development/02_Localization/03_States/index.md deleted file mode 100644 index c17fa9e5f0..0000000000 --- a/docs/docs/03_Development/02_Localization/03_States/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop States - -1. [Create, Update, Read, Delete](./01_CRUD.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/04_Zones/index.md b/docs/docs/03_Development/02_Localization/04_Zones/index.md deleted file mode 100644 index 0decf4527d..0000000000 --- a/docs/docs/03_Development/02_Localization/04_Zones/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Zones - -1. [Create, Update, Read, Delete](./01_CRUD.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/index.md b/docs/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/index.md deleted file mode 100644 index f2e7c7e53d..0000000000 --- a/docs/docs/03_Development/02_Localization/05_Taxes/01_Tax_Rate/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# CoreShop Tax Rate - -> The Tax Rate only represents a single Tax Rate Number. For example: 20%. - -1. [Create, Update, Read, Delete](./01_CRUD.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/04_Tax_Factory.md b/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/04_Tax_Factory.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/index.md b/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/index.md deleted file mode 100644 index cef3a967e2..0000000000 --- a/docs/docs/03_Development/02_Localization/05_Taxes/02_Tax_Rule/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# CoreShop Tax Rule - -> The Tax Rule handles different Taxes based on Country and State. - -1. [Create, Update, Read, Delete](./01_CRUD.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/05_Taxes/index.md b/docs/docs/03_Development/02_Localization/05_Taxes/index.md deleted file mode 100644 index b7a4820f5d..0000000000 --- a/docs/docs/03_Development/02_Localization/05_Taxes/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Taxes - -> Taxes are divided into Tax Rates and Tax Rules. Tax Rules are responsible for the real Tax Rate determination based on Country and State. - -1. [Tax Rates](./01_Tax_Rate/index.md) -1. [Tax Rules](./02_Tax_Rule/index.md) \ No newline at end of file diff --git a/docs/docs/03_Development/02_Localization/index.md b/docs/docs/03_Development/02_Localization/index.md deleted file mode 100644 index b7f7e63214..0000000000 --- a/docs/docs/03_Development/02_Localization/index.md +++ /dev/null @@ -1,9 +0,0 @@ -# CoreShop Localization - -CoreShop provides you with a set of tools for better localization of your eCommerce. These tools exist of following parts: - - - [Currencies](./01_Currencies/index.md) - - [Countries](./02_Countries/index.md) - - [States](./03_States/index.md) - - [Zones](./04_Zones/index.md) - - [Taxes](./05_Taxes/index.md) \ No newline at end of file diff --git a/docs/docs/03_Development/03_Products/02_Price_Calculation.md b/docs/docs/03_Development/03_Products/02_Price_Calculation.md deleted file mode 100644 index 941c78c561..0000000000 --- a/docs/docs/03_Development/03_Products/02_Price_Calculation.md +++ /dev/null @@ -1,106 +0,0 @@ -# CoreShop Product Price Calculation - -CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used - - - [Price Rule Calculator which uses Prices from Catalog Price Rules and Specific Price Rules](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/ProductBundle/Calculator/PriceRuleCalculator.php) - - [Store Product Price Calculator](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Product/Calculator/StoreProductPriceCalculator.php) - -These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface - -[```CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Product/Calculator/ProductPriceCalculatorInterface.php) and register your service with the tag -```coreshop.product.price_calculator```, a ```type``` attribute and a ```priority``` - -## What prices does CoreShop calculate? - -CoreShop Price Calculation consists of 3 different prices: - - - **Retail Price**: Base Price without any discounts - - **Discount Price**: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid - - **Discount**: Discount from promotions - - **Price**: Retail Price or Discount Price (if available) minus discount rules - -The default is always to use store values prices. - -## Calculator Service -If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options: - -**1**: ```coreshop.product.price_calculator``` which calculates prices without any tax regards. - -**2**: ```coreshop.product.taxed_price_calculator``` which calculates prices with tax or without. (recommended one to use) - -### Templating -If you want to calculate the price within a Template, you can do so by using the filter ```coreshop_product_price``` - -```twig -{{ (product|coreshop_product_price(true)) }} -``` - -## Custom Price Calculator Example - -Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. -This example is only a show-case of how to add a new calculator. - -> CoreShop Price calculation always depends on a context. The context per default consists of following values: -> - Store -> - Country -> - Currency -> - Customer (if logged in) -> - Cart - -```php -getRetailPrice($subject, $context); - - return $withDiscount ? $this->getDiscount($subject, $price) : $price; - } - - /** - * Used to determine a retail price - */ - public function getRetailPrice(ProductInterface $subject, array $context): int - { - return $subject->getStorePrice($context['store']); - } - - /** - * Used to determine a discount - */ - public function getDiscount(ProductInterface $subject, array $context, int $price): int - { - return 0; - } - - /** - * Used to determine a discounted price - */ - public function getDiscountPrice(ProductInterface $subject, array $context): int - { - return 0; - } -} -``` - -Now we need to register our service to the container and add the calculator tag: - -```yml -app.coreshop.product.price_calculator.custom: - class: AppBundle\CoreShop\Product\CustomPriceCalculator - tags: - - { name: coreshop.product.price_calculator, type: custom, priority: 1 } -``` - -CoreShop now uses our service for all Product Price Calculations. - diff --git a/docs/docs/03_Development/03_Products/03_Price_Rules/index.md b/docs/docs/03_Development/03_Products/03_Price_Rules/index.md deleted file mode 100644 index 418732ecde..0000000000 --- a/docs/docs/03_Development/03_Products/03_Price_Rules/index.md +++ /dev/null @@ -1,55 +0,0 @@ -# CoreShop Product Price Rules - -CoreShop gives you the ability of very complex price calculation methods. -Price Rules always consist of Conditions and Actions. - -## Price Rule Types - -### Product Price Rules - -> Checkout all available product price rules [here](../../../02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md) - -Product price rules are applied to multiple products based on conditions like category or manufacturer. - -### Specific Price Rules - -> Checkout all available specific price rules [here](../../../02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md) - -Specific price rules are applied to a single product based on conditions like customer or customer group. - -### Quantity Price Rules - -> Checkout all available quantity price rules [here](../../../02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md) - -Quantity price rules are applied to a single product based on conditions like the quantity of a cart item. - -These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, -the default price calculation of CoreShop will return zero outside of cart context. - -## Extending Conditions and Actions - -- [Click here to see how you can add custom Actions](../../01_Extending_Guide/04_Extending_Rule_Actions.md) -- [Click here to see how you can add custom Conditions](../../01_Extending_Guide/05_Extending_Rule_Conditions.md) - -## Template Helper - -#### Get Formatted Price with all applied Rules - -```twig -{% import '@CoreShopFrontend/Common/Macro/currency.html.twig' as currency %} -{% import '@CoreShopFrontend/Common/Macro/product_price.html.twig' as product_price %} - -
- {{ 'coreshop.ui.price'|trans }}: - {{ product_price.display_product_price(product) }} -
-
- {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }}) -
-``` - -#### Get Active Price Rules - -```twig -{{ dump(product|coreshop_product_price_rules) }} -``` diff --git a/docs/docs/03_Development/03_Products/05_Multiple_Product_DataObjects.md b/docs/docs/03_Development/03_Products/05_Multiple_Product_DataObjects.md deleted file mode 100644 index e0682dc409..0000000000 --- a/docs/docs/03_Development/03_Products/05_Multiple_Product_DataObjects.md +++ /dev/null @@ -1,134 +0,0 @@ -# CoreShop Multiple Product DataObjects - -CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules. - -First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement [```\CoreShop\Component\Order\Model\PurchasableInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Model/PurchasableInterface.php) but since we want to allow complex price calculation, we need to implement [```CoreShop\Component\Core\Model\ProductInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Model/ProductInterface.php). - - > **Note** - > If your Product is very simple and you do not need complex price calculations - > you then only need to implement [```\CoreShop\Component\Order\Model\PurchasableInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Model/PurchasableInterface.php) - -Easiest way to create the new class is: - - - **1**: Open Pimcore DataObject Editor - - **2**: Add a new Class called ProductSet - - **3**: Import CoreShop Default Product Class ([```CoreShopProduct.json```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopProductBundle/CoreShopProduct.json)) - - **4**: Adapt to your needs - - **5**: Register your ProductSet Class to CoreShop: - -```php -root('app'); - - $rootNode - ->children() - ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end() - ->end() - ; - - $this->addModelsSection($rootNode); - - return $treeBuilder; - } - - //Add your configuration here - private function addModelsSection(ArrayNodeDefinition $node) - { - $node - ->children() - ->arrayNode('pimcore') - ->addDefaultsIfNotSet() - ->children() - ->arrayNode('product_set') - ->addDefaultsIfNotSet() - ->children() - ->variableNode('options')->end() - ->scalarNode('path')->defaultValue('products')->end() - ->arrayNode('classes') - ->addDefaultsIfNotSet() - ->children() - ->scalarNode('model')->defaultValue('Pimcore\Model\DataObject\ProductSet')->cannotBeEmpty()->end() - ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end() - ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end() - ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end() - ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopProduct.json')->end() - ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ->end() - ; - } -} -``` - -```php -processConfiguration($this->getConfiguration([], $container), $config); - $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); - - //Register the model to the container - $this->registerPimcoreModels('app', $config['pimcore'], $container); - - //Alternative you can do it manually like: - - $this->registerPimcoreModels('app', [ - 'product_set' => [ - 'path' => '/product-sets', - 'classes' => [ - 'model' => 'Pimcore\Model\DataObject\ProductSet', - 'interface' => ProductInterface::class, - 'factory' => PimcoreFactory::class, - 'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT - ] - ] - ], $container); - - $loader->load('services.yml'); - } -} -``` - - **6**: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules. - - > **Note:** - > For the Class to be allowed as href/multihref in Pimcore, you need to adapt following classes as well: - > - CoreShopCartItem - > - CoreShopOrderItem - > - CoreShopQuoteItem - > - > Check for the product field and add your new ProductSet there as allowed references. diff --git a/docs/docs/03_Development/03_Products/index.md b/docs/docs/03_Development/03_Products/index.md deleted file mode 100644 index 5538f4d68a..0000000000 --- a/docs/docs/03_Development/03_Products/index.md +++ /dev/null @@ -1,11 +0,0 @@ -# CoreShop Products - -This guide should lead you through how CoreShop handles Product information and how it does price calculations. - - 1. [Create, Read, Update, Delete](./01_CRUD.md) - 2. [Price Calculation](./02_Price_Calculation.md) - 3. [Price Rules](./03_Price_Rules/index.md) - 4. [Configuration](./04_Configuration.md) - 5. [Multiple Product DataObjects](./05_Multiple_Product_DataObjects.md) - 6. [Product Units](./06_Units.md) - 6. [Product Unit Definitions](./07_Unit_Definitions.md) diff --git a/docs/docs/03_Development/04_Cart/01_CRUD.md b/docs/docs/03_Development/04_Cart/01_CRUD.md deleted file mode 100644 index a378a54ca3..0000000000 --- a/docs/docs/03_Development/04_Cart/01_CRUD.md +++ /dev/null @@ -1,68 +0,0 @@ -# CoreShop Cart - -CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire -dynamic and configurable. It uses a Factory and Repository Pattern to do that. - -## Create - -If you want to create a new Cart, we need to get our Factory Service for that: - -```php -$factory = $container->get('coreshop.factory.cart'); -$cart = $factory->createNew(); -``` - -No we have a new Cart and we can set all needed values. - -If you now want to save it, just call the save function - -```php -$cart->save(); -``` - -## Read - -To get carts, you need to use the Repository Service CoreShop provides you. - -```php -$repository = $container->get('coreshop.repository.cart'); - - -// Query by ID -$cartWithIdOne = $repository->findById(1); - -// Get a Listing how you know it from Pimcore -$list = $repository->getList(); -$list->setCondition("total > 100"); -$carts = $list->getObjects(); - -``` - -## Update - -Update works the same as you are used to in Pimcore - -```php -$repository = $container->get('coreshop.repository.cart'); - - -// Query by ID -$cartWithIdOne = $repository->findById(1); - -// Change values -$cartWithIdOne->setCustomer($customer); -$cartWithIdOne->save(); -``` - -## Delete - -Delete works the same as you are used to in Pimcore - -```php -$repository = $container->get('coreshop.repository.cart'); - - -// Query by ID -$cartWithIdOne = $repository->findById(1); -$cartWithIdOne->delete(); -``` \ No newline at end of file diff --git a/docs/docs/03_Development/04_Cart/02_Cart_Manager.md b/docs/docs/03_Development/04_Cart/02_Cart_Manager.md deleted file mode 100644 index ab1ebc8c46..0000000000 --- a/docs/docs/03_Development/04_Cart/02_Cart_Manager.md +++ /dev/null @@ -1,8 +0,0 @@ -# CoreShop Cart Manager - -The Cart Manager helps you managing Carts. It handles: - - - Persisting a Cart - -The Cart Manager implements the Interface [```CoreShop\Component\Order\Manager\CartManagerInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Manager/CartManagerInterface.php) and is implemented in the Service -```coreshop.cart.manager```: diff --git a/docs/docs/03_Development/04_Cart/03_Cart_Modifier.md b/docs/docs/03_Development/04_Cart/03_Cart_Modifier.md deleted file mode 100644 index 7c886c12db..0000000000 --- a/docs/docs/03_Development/04_Cart/03_Cart_Modifier.md +++ /dev/null @@ -1,10 +0,0 @@ -# CoreShop Cart Modifier - -CoreShop provides you with a helper service to modify the cart. It handles following for you: - - - adding items - - removing items - - change quantity of items - -The Modifier implements the interface [```CoreShop\Component\Order\Cart\CartModifierInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Cart/CartModifierInterface.php) and is implemented by the service -```coreshop.cart.modifier``` diff --git a/docs/docs/03_Development/04_Cart/04_Cart_Processor.md b/docs/docs/03_Development/04_Cart/04_Cart_Processor.md deleted file mode 100644 index 22db0fa912..0000000000 --- a/docs/docs/03_Development/04_Cart/04_Cart_Processor.md +++ /dev/null @@ -1,53 +0,0 @@ -# CoreShop Cart Processor - -The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the ```persistCart``` function of the [Cart-Manager](./02_Cart_Manager.md) is called -on a Cart, it gets triggered and re-calculates the cart. - -Following Processors are implemented by default: - - - [Cart Adjustment Clearer](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartAdjustmentClearer.php) - - [Item Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartItemProcessor.php) - - [Item Tax Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartItemTaxProcessor.php) - - [Cart Price Rule Voucher Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartPriceRuleVoucherProcessor.php) - - [Cart Rule Auto Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartRuleAutoProcessor.php) - - [Cart Shipping Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartShippingProcessor.php) - - [Cart Tax Processor](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Core/Order/Processor/CartTaxProcessor.php) - -These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need -to create a new Processor. - -## Creating a Cart Processor - -A Cart Processor needs to implement the Interface [```CoreShop\Component\Order\Processor\CartProcessorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Processor/CartProcessorInterface.php) and registered -into the container with the tag ```coreshop.cart_processor``` and a ```priority``` attribute. - -### Example of a Cart Processor -For example, we create a Cart Processor, which calculates a custom field in our Cart. - -```php -setCustomField(uniqid()); - } -} -``` - -We now only need to register the class: - -```yaml -app.coreshop.cart.processor.custom: - class: AppBundle\CoreShop\Order\Cart\Processor\CustomCartProcessor - tags: - - { name: coreshop.cart_processor, priority: 200 } -``` - -On every Cart Update, our service now gets called a the custom field gets a new unique id. diff --git a/docs/docs/03_Development/04_Cart/05_Commands.md b/docs/docs/03_Development/04_Cart/05_Commands.md deleted file mode 100644 index bfb4b5b8bc..0000000000 --- a/docs/docs/03_Development/04_Cart/05_Commands.md +++ /dev/null @@ -1,34 +0,0 @@ -# CoreShop Cart Commands - -## Expire Abandoned Carts - -```bash -# Delete only anonymous carts -$ bin/console coreshop:cart:expire --anonymous - -# Delete only user carts -$ bin/console coreshop:cart:expire --user - -# Delete carts older than 20 days -$ bin/console coreshop:cart:expire --days=20 -``` - -## Expire Abandoned Carts via maintenance job -By default, this feature is disabled. -If you want to delete abandoned carts, you need to define an expiration date: - -```yml -core_shop_storage_list: - list: - order: - expiration: - params: - cart: - days: 20 - params: - anonymous: true - customer: false - -``` - -Read more about automation [here](../../02_User_Documentation/10_Automation/index.md). \ No newline at end of file diff --git a/docs/docs/03_Development/04_Cart/06_Context.md b/docs/docs/03_Development/04_Cart/06_Context.md deleted file mode 100644 index f60852fbc6..0000000000 --- a/docs/docs/03_Development/04_Cart/06_Context.md +++ /dev/null @@ -1,32 +0,0 @@ -# CoreShop Cart Context - -For CoreShop to determine the current cart it uses a concept called context and context resolver. - -The Cart Context implements the Interface [```CoreShop\Component\Order\Context\CartContextInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Context/CartContextInterface.php) and is implemented in the Service -```coreshop.context.cart```: - -## Getting the current Cart - -If you want to get the current cart, you simply use the service: - -```php -$cartContext = $container->get('coreshop.context.cart'); - -// Get current cart, if none exists, it creates a new one -$cart = $cartContext->getCart(); - -``` - -## Context - -| Name | Priority | Description| -|------|----------|------------| -| [FixedCartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Context/FixedCartContext.php) | -100 | Used for testing purposes or for backend order creation | -| [SessionAndStoreBasedCartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/OrderBundle/Context/SessionAndStoreBasedCartContext.php) | -555 | Search for a valid session cart in given store context | -| [CustomerAndStoreBasedCartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/OrderBundle/Context/CustomerAndStoreBasedCartContext.php) | -777 | Search for a cart based on a customer. **Note**: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left. | -| [CartContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Context/CartContext.php) | -999 | If all other context classes failed finally this context will create a fresh cart | - - -## Create a Custom Resolver - -To register your context, you need to use the tag: `coreshop.context.cart` with an optional `priority` attribute. diff --git a/docs/docs/03_Development/04_Cart/index.md b/docs/docs/03_Development/04_Cart/index.md deleted file mode 100644 index da011d5b2c..0000000000 --- a/docs/docs/03_Development/04_Cart/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# CoreShop Cart - -This guide should lead you through how CoreShop handles the Cart. - - - [Create, Read, Update, Delete](./01_CRUD.md) - - [Cart Manager](./02_Cart_Manager.md) - - [Cart Modifier](./03_Cart_Modifier.md) - - [Cart Processor](./04_Cart_Processor.md) - - [Commands](./05_Commands.md) - - [Cart Context](./06_Context.md) - -## Introduction - -The CoreShop Cart is stateless. Which means that every change on the cart triggers the [Cart Processor](./04_Cart_Processor.md) which -then calculates all necessary prices. \ No newline at end of file diff --git a/docs/docs/03_Development/05_Checkout/index.md b/docs/docs/03_Development/05_Checkout/index.md deleted file mode 100644 index 5f2c48dcc4..0000000000 --- a/docs/docs/03_Development/05_Checkout/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Checkout - -This guide should lead you through how CoreShop handles the Checkout. - - - [Checkout Manager](./01_Checkout_Manager.md) - - [Checkout Step](./02_Checkout_Step.md) diff --git a/docs/docs/03_Development/06_Order/01_Order_Creation.md b/docs/docs/03_Development/06_Order/01_Order_Creation.md deleted file mode 100644 index 11d1c8f989..0000000000 --- a/docs/docs/03_Development/06_Order/01_Order_Creation.md +++ /dev/null @@ -1,15 +0,0 @@ -# CoreShop Order Creation - -Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways. - -## Order CRUD - -You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory: - -```php -$factory = $container->get('coreshop.factory.order')->createNew(); -``` - -You can now fill the Order with all necessary information. - -The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements [Transformer](./02_Transformer.md) for that. \ No newline at end of file diff --git a/docs/docs/03_Development/06_Order/02_Transformer.md b/docs/docs/03_Development/06_Order/02_Transformer.md deleted file mode 100644 index 0cd3ed123a..0000000000 --- a/docs/docs/03_Development/06_Order/02_Transformer.md +++ /dev/null @@ -1,21 +0,0 @@ -# CoreShop Transfomers - -Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now: - - - [an Order into an Invoice](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/OrderBundle/Transformer/OrderToInvoiceTransformer.php) - - [an Order into an Shipment](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/OrderBundle/Transformer/OrderToShipmentTransformer.php) - - -The base transformer interface for all "Proposals" is ```CoreShop\Component\Order\Transformer\ProposalTransformerInterface``` - -## Extending Transfomers - -If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so -by decorating the default service. Following Services are used by CoreShop for all different Transfomers: - -| From | To | Service | -|----------------------|--------------------|------------------------------------------------------------------| -| Order | Invoice | coreshop.order.transformer.order_to_invoice | -| OrderItem | InvoiceItem | coreshop.order_invoice.transformer.cart_item_to_order_item | -| Order | Shipment | coreshop.order.transformer.order_to_invoice | -| OrderItem | ShipmentItem | coreshop.order_invoice.transformer.order_item_to_shipment_item | diff --git a/docs/docs/03_Development/06_Order/03_Order_Workflow.md b/docs/docs/03_Development/06_Order/03_Order_Workflow.md deleted file mode 100644 index ae8a817ab8..0000000000 --- a/docs/docs/03_Development/06_Order/03_Order_Workflow.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Order Workflow - -CoreShop uses Symfony Workflow to apply states. Here is the detail information about the [State Machine](../17_State_Machine/index.md). diff --git a/docs/docs/03_Development/06_Order/05_Invoice/index.md b/docs/docs/03_Development/06_Order/05_Invoice/index.md deleted file mode 100644 index c449a48f8e..0000000000 --- a/docs/docs/03_Development/06_Order/05_Invoice/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Invoice - -CoreShop comes with an Invoice creation feature. This means, it can create Invoices for Orders based on Workflow States. \ No newline at end of file diff --git a/docs/docs/03_Development/06_Order/05_Purchasable.md b/docs/docs/03_Development/06_Order/05_Purchasable.md deleted file mode 100644 index d4484f0d01..0000000000 --- a/docs/docs/03_Development/06_Order/05_Purchasable.md +++ /dev/null @@ -1,62 +0,0 @@ -# CoreShop Order Purchasable - -Items, you want to add to your Cart/Order/Quote, need to implement [```CoreShop\Component\Order\Model\PurchasableInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Model/PurchasableInterface.php). - -The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart/Quote/Order more flexible -in ways of which object types can be used. - -> A Purchasable does not a have Price directly -> You need create a class that implements [```CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Calculator/PurchasablePriceCalculatorInterface.php). -> in order to calculate price - -# Implementation of a new Purchasable Price Calculator -To implement a new custom Purchasable Price Calculator, you need to implement the interface [```CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Calculator/PurchasablePriceCalculatorInterface.php). - -As an example, we create a ProductSetCalculator, which takes prices of each consisting Product: - -```php -purchasablePriceCalculator = $purchasablePriceCalculator; - } - - public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int - { - if ($purchasable instanceof ProductSet) { - $price = 0; - - foreach ($purchasable->getProducts() as $product) { - $price .= $this->purchasablePriceCalculator->getPrice($product); - } - - return $price; - } - - throw new NoPurchasablePriceFoundException($this); - } - -} -``` - -Now we need to register our Service to the Container: - -```yml -app.coreshop.order.purchasable.price_calculator.product_set: - class: AppBundle\CoreShop\Order\Calculator\ProductSetCalculator - arguments: - - '@coreshop.order.purchasable.price_calculator' - tags: - - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 } -``` diff --git a/docs/docs/03_Development/06_Order/06_Shipment/index.md b/docs/docs/03_Development/06_Order/06_Shipment/index.md deleted file mode 100644 index 390afa67ea..0000000000 --- a/docs/docs/03_Development/06_Order/06_Shipment/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Shipment - -CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States. \ No newline at end of file diff --git a/docs/docs/03_Development/06_Order/08_TemplateHelper.md b/docs/docs/03_Development/06_Order/08_TemplateHelper.md deleted file mode 100644 index d3e3891478..0000000000 --- a/docs/docs/03_Development/06_Order/08_TemplateHelper.md +++ /dev/null @@ -1,9 +0,0 @@ -# CoreShop Order Template/Twig Helper - -## Order State - -There is one Filter which returns you the current state for an order: - -```twig -{{ dump(order|coreshop_order_state) }} -``` diff --git a/docs/docs/03_Development/06_Order/09_AdditionalData.md b/docs/docs/03_Development/06_Order/09_AdditionalData.md deleted file mode 100644 index f5c250a229..0000000000 --- a/docs/docs/03_Development/06_Order/09_AdditionalData.md +++ /dev/null @@ -1,137 +0,0 @@ -# Additional Data in Order -Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step). - -> **Note:** To add custom fields you need a custom checkout step. - -1. Create your custom brick and apply it to the classes: - - Cart (additionalData) - - Order (additionalData) - - Quote (additionalData) - -2. Add fields to your custom checkout step (`createForm()`): - -```php -$form->add('af_secretField', TextType::class, [ - 'required' => false, - 'label' => 'coreshop.ui.your_secret_field' -]); -$form->add('af_secondSecretField', TextType::class, [ - 'required' => false, - 'label' => 'coreshop.ui.your_second_secret_field' -]); -``` - -3. Store data in cart (`commitStep()`) - -```php -use Pimcore\Model\DataObject\Objectbrick\Data\AdditionalField; - -if ($form->isSubmitted()) { - if ($form->isValid()) { - $formData = $form->getData(); - if(!empty($formData['af_secretField'])) { - $brick = new AdditionalField($cart); - $brick->setSecretField($formData['af_secretField']); - $brick->setSecondSecretField($formData['af_secondSecretField']); - $cart->getAdditionalData()->setAdditionalField($brick); - } - $cart->save(); - return true; - } -} -``` - -That's it - your additional data is now available in backend. -If you want to display those fields in the overview, you need to add some JS: - -```yaml -core_shop_core: - pimcore_admin: - js: - filter_condition_relational_multi_select: '/bundles/app/additionalData.js' -``` - -This file has to extend `coreshop.order.sale.detail.abstractBlock` -and requires several methods: `initBlock`, `updateSale`, `getPanel`, `getPriority` and `getPosition`. - -```js -pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName'); -coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, { - - saleInfo: {}, - hasItems: true, - - initBlock: function () { - this.saleInfo = Ext.create('Ext.panel.Panel', { - title: t('coreshop_order_additional_data'), - margin: '0 20 20 0', - border: true, - flex: 8 - }); - }, - - updateSale: function () { - - var items = [], - subItems = []; - - //console.log(this.sale.additionalData); - - var items = [], subItems = []; - - Ext.Array.each(this.sale.additionalData, function (block, i) { - var data = block.data; - subItems.push({ - xtype: 'label', - style: 'font-weight:bold;display:block', - text: 'Title for your custom field A' - }, - { - xtype: 'label', - style: 'display:block', - html: data.secretField - }); - subItems.push({ - xtype: 'label', - style: 'font-weight:bold;display:block', - text: 'Title for your custom field B' - }, - { - xtype: 'label', - style: 'display:block', - html: data.secondSecretField - }) - }); - - if (subItems.length === 0) { - this.hasItems = false; - return; - } - - items.push({ - xtype: 'panel', - bodyPadding: 10, - margin: '0 0 10px 0', - items: subItems - }); - - // remove all before adding new ones - // otherwise they will append during a refresh - this.saleInfo.removeAll(); - - this.saleInfo.add(items); - }, - - getPanel: function () { - return this.hasItems ? this.saleInfo : null; - }, - - getPriority: function () { - return 10; - }, - - getPosition: function () { - return 'right'; - } -}); -``` \ No newline at end of file diff --git a/docs/docs/03_Development/06_Order/10_NumberGenerator.md b/docs/docs/03_Development/06_Order/10_NumberGenerator.md deleted file mode 100644 index 84932b8f8e..0000000000 --- a/docs/docs/03_Development/06_Order/10_NumberGenerator.md +++ /dev/null @@ -1,39 +0,0 @@ -# CoreShop Order Number Generator - -When an order is completed, a number is generated for that order. This happens at the `CoreShop\Component\Core\Order\Committer\OrderCommitter`, which uses a `NumberGeneratorInterface` service. - -If the CoreBundle is installed, the `coreshop.order.number_generator.prefix_suffix` service is injected. It decorates the `coreshop.order.number_generator.default` and extends it with the feature to manage a prefix and suffix via the CoreShop settings. - -To create a custom number generator, a service must be created which also decorates the `coreshop.order.number_generator.default`. To set the order of the decorations, use `decoration_priority`. - -Choosing `decoration_priority` higher or equal zero, the order of called decoraters would be `PrefixSuffix Generator > CustomNumberGenerator > DefaultSequenceGenerator`. -If you choose a `decoration_priority` below zero, the order of called decoraters would change to `CustomNumberGenerator > PrefixSuffix Generator > DefaultSequenceGenerator`. - -Example for custom implementation of NumberGenerator, that adds padding to the number - -```php -final class CustomNumberGenerator implements NumberGeneratorInterface -{ - public function __construct( - private NumberGeneratorInterface $numberGenerator, # decorated service - ) { - } - - public function generate(ResourceInterface $model): string - { - $number = $this->numberGenerator->generate($model); - - return str_pad($number, 10, '0', STR_PAD_LEFT); - } -} -``` - -Symfony service definition - -```yaml - App\Order\CustomNumberGenerator: - decorates: coreshop.order.number_generator.default - decoration_priority: 1 - arguments: - - '@.inner' -``` diff --git a/docs/docs/03_Development/06_Order/index.md b/docs/docs/03_Development/06_Order/index.md deleted file mode 100644 index 12f40f8eaa..0000000000 --- a/docs/docs/03_Development/06_Order/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# CoreShop Order -This guide should lead you through how CoreShop handles Orders. - - - [Order Creation](./01_Order_Creation.md) - - [Transformer](./02_Transformer.md) - - [Order Workflow](./03_Order_Workflow.md) - - [Invoice](./05_Invoice/index.md) - - [Shipment](./06_Shipment/index.md) - - [Template/Twig Helper](./08_TemplateHelper.md) - - [Extend Order with additional data](./09_AdditionalData.md) - - ## CoreShop Order List - - - [Order List: Add Custom Filter](./08_OrderList/01_Filter.md) - - [Order List: Add Custom Actions](./08_OrderList/02_Action.md) \ No newline at end of file diff --git a/docs/docs/03_Development/07_Shipping/01_Carrier/02_Carrier_Discovery.md b/docs/docs/03_Development/07_Shipping/01_Carrier/02_Carrier_Discovery.md deleted file mode 100644 index 2d62e80085..0000000000 --- a/docs/docs/03_Development/07_Shipping/01_Carrier/02_Carrier_Discovery.md +++ /dev/null @@ -1,4 +0,0 @@ -# CoreShop Carrier Discovery - -CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface ```CoreShop\Bundle\ShippingBundle\Discover\ShippableCarriersDiscoveryInterface```. -The Interface is implemented by Service with ID ```coreshop.carrier.discovery``` \ No newline at end of file diff --git a/docs/docs/03_Development/07_Shipping/01_Carrier/03_Price_Calculation.md b/docs/docs/03_Development/07_Shipping/01_Carrier/03_Price_Calculation.md deleted file mode 100644 index fe3573cabc..0000000000 --- a/docs/docs/03_Development/07_Shipping/01_Carrier/03_Price_Calculation.md +++ /dev/null @@ -1,9 +0,0 @@ -# CoreShop Carrier Price Calculation - -CoreShop Shipping/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given -Cart. A Calculator needs to implement the Interface ```CoreShop\Component\Shipping\Calculator\CarrierPriceCalculatorInterface``` -and registered to the container using the tag ```coreshop.shipping.price_calculator```, a ```type``` attribute and a ```priority``` - -## Default Implementation - -The Default Implementation calculates the Price based on [Shipping Rules](../02_Shipping_Rules/index.md). \ No newline at end of file diff --git a/docs/docs/03_Development/07_Shipping/01_Carrier/index.md b/docs/docs/03_Development/07_Shipping/01_Carrier/index.md deleted file mode 100644 index cb9d2183c0..0000000000 --- a/docs/docs/03_Development/07_Shipping/01_Carrier/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# CoreShop Carrier - -This guide should lead you through how CoreShop handles Carriers. - - - [Create, Read, Update, Delete](./01_CRUD.md) - - [Carrier Discovery](./02_Carrier_Discovery.md) - - [Price Calculation](./03_Price_Calculation.md) \ No newline at end of file diff --git a/docs/docs/03_Development/07_Shipping/02_Shipping_Rules/index.md b/docs/docs/03_Development/07_Shipping/02_Shipping_Rules/index.md deleted file mode 100644 index 19819799fa..0000000000 --- a/docs/docs/03_Development/07_Shipping/02_Shipping_Rules/index.md +++ /dev/null @@ -1,36 +0,0 @@ -# CoreShop Shipping Rules - -## Default Conditions and Actions - -CoreShop comes with a set of default action and condition implementations: - -### Default Conditions - - - Currencies - - Customer Groups - - Customers - - Stores - - Zones - - Amount - - Categories - - Countries - - Dimension - - Post Codes - - Products - - Shipping Rule - - Weight - - Nested - -### Default Actions - - - Addition Amount - - Addition Percent - - Discount Amount - - Discount Percent - - Price - - Shipping Rule - -## Extending Conditions and Actions - - - [Click here to see how you can add custom Actions](../../01_Extending_Guide/04_Extending_Rule_Actions.md) - - [Click here to see how you can add custom Conditions](../../01_Extending_Guide/05_Extending_Rule_Conditions.md) \ No newline at end of file diff --git a/docs/docs/03_Development/07_Shipping/index.md b/docs/docs/03_Development/07_Shipping/index.md deleted file mode 100644 index 3bcb76f3f4..0000000000 --- a/docs/docs/03_Development/07_Shipping/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Shipping - -This guide should lead you through how CoreShop handles Shipping and Shipping Calculation. - - - [Carriers](./01_Carrier/index.md) - - [Shipping Rules](./02_Shipping_Rules/index.md) \ No newline at end of file diff --git a/docs/docs/03_Development/08_Index_and_Filters/01_Index/01_Interpreter.md b/docs/docs/03_Development/08_Index_and_Filters/01_Index/01_Interpreter.md deleted file mode 100644 index 353b4aac27..0000000000 --- a/docs/docs/03_Development/08_Index_and_Filters/01_Index/01_Interpreter.md +++ /dev/null @@ -1,71 +0,0 @@ -# CoreShop Index Interpreter - -To prepare your index and transform data, you use one of the existing Interpreter or create one yourself. - -CoreShop currently has following Interpreters: - - - **Object**: converts an object or and object array to relations. It saves the values to the relations inex - - **ObjectId**: converts an object to its ID - - **ObjectIdSum**: calculates the sum of all IDs. (Could be used for similar products) - - **ObjectProperty**: calls a getter method of the value - - **Soundex**: calls PHP soundex function (Could be used for similar products) - -## Create a Custom Interpreter - -**1** We need to create 2 new files: - - FormType for processing the Input Data - - And a InterpreterInterface, which interprets the data - -```php - -namespace AppBundle\Index\Form\Type; - -use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\IntegerType; -use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Validator\Constraints\NotBlank; -use Symfony\Component\Validator\Constraints\Type; - -final class MyInterpreterType extends AbstractType -{ - /** - * {@inheritdoc} - */ - public function buildForm(FormBuilderInterface $builder, array $options) - { - $builder - ->add('myInterpreterData', IntegerType::class, [ - 'constraints' => [ - new NotBlank(['groups' => ['coreshop']]), - new Type(['type' => 'numeric', 'groups' => ['coreshop']]), - ], - ]) - ; - } -} - -``` - -```php -namespace AppBundle\CoreShop\Index\Interpreter; - -use CoreShop\Component\Index\Interpreter\InterpreterInterface; - -class MyInterpreter implements InterpreterInterface -{ - public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) { - //Do some interpretation here - - return $value; - } -} -``` - -**2**:Register MyInterpreter as service with tag ```coreshop.index.interpreter```, type and form - -```yaml -app.index.interpreter.my_interpreter: - class: AppBundle\CoreShop\Index\Interpreter\MyInterpreter - tags: - - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\Index\Form\Type\MyInterpreterType} -``` diff --git a/docs/docs/03_Development/08_Index_and_Filters/01_Index/02_Extension.md b/docs/docs/03_Development/08_Index_and_Filters/01_Index/02_Extension.md deleted file mode 100644 index 21c8e928a8..0000000000 --- a/docs/docs/03_Development/08_Index_and_Filters/01_Index/02_Extension.md +++ /dev/null @@ -1,14 +0,0 @@ -# CoreShop Index Extension - -In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things: - - - Add more "default" columns and corresponding data - - Pre Filter an mysql index - -To create a new extension, you need to implement either the interface -[```CoreShop\Component\Index\Extension\IndexColumnsExtensionInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Index/Extension/IndexColumnsExtensionInterface.php) -for column extensions or the interface -[```CoreShop\Bundle\IndexBundle\Extension\MysqlIndexQueryExtensionInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Bundle/IndexBundle/Extension/MysqlIndexQueryExtensionInterface.php) -for mysql query extensions. - -You then need to register your service using the tag ```coreshop.index.extension``` \ No newline at end of file diff --git a/docs/docs/03_Development/08_Index_and_Filters/01_Index/index.md b/docs/docs/03_Development/08_Index_and_Filters/01_Index/index.md deleted file mode 100644 index d18eaecf9c..0000000000 --- a/docs/docs/03_Development/08_Index_and_Filters/01_Index/index.md +++ /dev/null @@ -1,47 +0,0 @@ -# CoreShop Index - -To create a rich layered navigation (faceted navigation), you need to create an index of your Products. - -## Create a new Index - -CoreShop currently supports two type of indexes: - - - Mysql - - ~~Elasticsearch~~ - -### Add Fields - -To add a new field, simply drag'n'drop the field from the left tree to the right tree. - -![Index Fields](img/fields.png) - -### Field Properties - -Every field has some properties that needs to be configured - -![Field](img/field.png) - -| Field | Description | -| ------------- |-------------| -| Key | Pimcore Field Name | -| Name | Name in the Index | -| Getter Class | Getter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index | -| [Interpreter](./01_Interpreter.md) | Using Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index | -| Type | Type of the field in the index, depends on which Index-Type you are using. [MySql](http://dev.mysql.com/doc/refman/5.7/en/data-types.html) or [Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html) | -| Getter Config | Configuration depends on Getter, for example: Language for Localized Fields | - -## Re-Index - -If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command. - -```bash -$ php bin/console coreshop:index -``` - -If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated -with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name -"Products". If none of those indices exist, nothing will be re-indexed. - -```bash -$ php bin/console coreshop:index 1 2 Products -``` diff --git a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/index.md b/docs/docs/03_Development/08_Index_and_Filters/02_Filter/index.md deleted file mode 100644 index 2fb4d1df17..0000000000 --- a/docs/docs/03_Development/08_Index_and_Filters/02_Filter/index.md +++ /dev/null @@ -1,66 +0,0 @@ -# CoreShop Filter - -After creating the index, you can configure the Filters. - -## Create a new Filter - -You can create different Filters for different Categories. - -A filter exists of different settings, pre-conditions, filters and similar products. - -You can even create [Custom Filters](01_Custom_Filter.md) - -### Filter Settings - -![Filter Settings](./img/filter-settings.png) - -| Field | Description | -| ---------------- |-------------| -| Name | Name of the Filter-Set | -| Index | Which Index should be used | -| Order | Order of the products | -| Order Key | Order key (index-field) to sort from | -| Results per Page | How many products should be displayed per page, you can use Shop Settings, or override it | - -### Pre-Conditions - -![Filter Pre-Conditions](./img/filter-preconditions.png) - -You can define pre-filters for the index. - -### Conditions - -![Filter Conditions](./img/filter-conditions.png) - -Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products. - -CoreShop currently supports 4 types of filters: - - - **Select** - - **Multiselect** - - **Range** - - **Boolean** - -#### Select Condition - -A select condition is basically just a simple dropdown field where customer can select one field. - -![Filter Condition Select](./img/filter-condition-select.png) - -#### Multiselect Condition - -A multi-select condition is basically a list of fields where customer can select multiple entries. - -![Filter Condition Select](./img/filter-condition-multiselect.png) - -#### Range Condition - -A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values. - -![Filter Condition Select](./img/filter-condition-range.png) - -#### Boolean Condition - -Boolean is a Condition where the customer can check different values. - -![Filter Condition Select](./img/filter-condition-boolean.png) diff --git a/docs/docs/03_Development/08_Index_and_Filters/index.md b/docs/docs/03_Development/08_Index_and_Filters/index.md deleted file mode 100644 index b5ebc9bf58..0000000000 --- a/docs/docs/03_Development/08_Index_and_Filters/index.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Index and Filter - -This guide should lead you through how CoreShop handles Indices and Filters. - -1. [Indices](./01_Index/index.md) -2. [Filters](./02_Filter/index.md) diff --git a/docs/docs/03_Development/09_Notification_Rules/01_Custom_Actions.md b/docs/docs/03_Development/09_Notification_Rules/01_Custom_Actions.md deleted file mode 100644 index 01ca130592..0000000000 --- a/docs/docs/03_Development/09_Notification_Rules/01_Custom_Actions.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Notification Rule Custom Actions - - - [Click here to see how you can add custom Actions](../01_Extending_Guide/04_Extending_Rule_Actions.md) \ No newline at end of file diff --git a/docs/docs/03_Development/09_Notification_Rules/02_Custom_Conditions.md b/docs/docs/03_Development/09_Notification_Rules/02_Custom_Conditions.md deleted file mode 100644 index 7162d14850..0000000000 --- a/docs/docs/03_Development/09_Notification_Rules/02_Custom_Conditions.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Notification Rule Custom Conditions - - - [Click here to see how you can add custom Conditions](../01_Extending_Guide/05_Extending_Rule_Conditions.md) \ No newline at end of file diff --git a/docs/docs/03_Development/09_Notification_Rules/03_Custom_Types.md b/docs/docs/03_Development/09_Notification_Rules/03_Custom_Types.md deleted file mode 100644 index 0490bf0047..0000000000 --- a/docs/docs/03_Development/09_Notification_Rules/03_Custom_Types.md +++ /dev/null @@ -1,13 +0,0 @@ -# CoreShop Notification Rule Custom Type - -Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own -type, you can do so by adding a new condition or action and specify your own type: - -```yaml -services: - app.coreshop.notification_rule.condition.order.custom_notification_condition: - class: AppBundle\CoreShop\Notification\CustomNotificationCondition - tags: - - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\Form\Type\CoreShop\CustomConditionType } - -``` diff --git a/docs/docs/03_Development/09_Notification_Rules/04_Triggering.md b/docs/docs/03_Development/09_Notification_Rules/04_Triggering.md deleted file mode 100644 index 49a1778cae..0000000000 --- a/docs/docs/03_Development/09_Notification_Rules/04_Triggering.md +++ /dev/null @@ -1,22 +0,0 @@ -# CoreShop Notification Trigger Notifications - -Triggering Notification events is quite easy, you can use the ```CoreShop\Component\Notification\Processor\RulesProcessorInterface``` implemented by service -```@coreshop.notification_rule.processor``` - -You also need to add different kinds of parameters based on your Notification Type. -In our case, we trigger an Order event. - -```php -$this->rulesProcessor->applyRules('order', $event->getProposal(), [ - 'fromState' => $event->getMarking()->getPlaces(), - 'toState' => $event->getTransition()->getTos(), - '_locale' => $order->getLocaleCode(), - 'recipient' => $customer->getEmail(), - 'firstname' => $customer->getFirstname(), - 'lastname' => $customer->getLastname(), - 'orderNumber' => $order->getOrderNumber(), - 'transition' => $event->getTransition()->getName() -]); -``` - -The rest is now handled by CoreShop Notifications. \ No newline at end of file diff --git a/docs/docs/03_Development/09_Notification_Rules/index.md b/docs/docs/03_Development/09_Notification_Rules/index.md deleted file mode 100644 index 162a046bb7..0000000000 --- a/docs/docs/03_Development/09_Notification_Rules/index.md +++ /dev/null @@ -1,213 +0,0 @@ -# CoreShop Notification Rules - -Notification Rules are responsible for all types of notification triggered by CoreShop. -It handles notification for following types: - - - order - - quote - - invoice - - shipment - - user - - payment - -## Overview -Let's checkout each notification type: - -### Order - -#### Allowed Conditions - -| Name | Description | -|:-----|:------------| -| Invoice State | Dispatch if given Invoice State is active | -| Invoice Transition | Dispatch if given Invoice Transition has been applied | -| Payment State | Dispatch if given Payment State is active | -| Payment Transition | Dispatch if given Payment Transition has been applied | -| Shipping State | Dispatch if given Shipping State is active | -| Shipping Transition | Dispatch if given Shipping Transition has been applied | -| Order State | Dispatch if given Order State is active | -| Order Transition | Dispatch if given Order Transition has been applied | -| Carriers | Dispatch if given Carrier has been selected in Order | -| Comment | Dispatch if a Comment Action has been applied. Available Types: `create comment` | - -#### Allowed Actions - -| Name | Description | -|:-----|:------------| -| Order Email | Email with Order Object | -| Email | Default Email without Order Object | - -#### Available Placeholders keys for email templates - -| Key | Value | -|:-----|:------------| -| object | Object of type OrderInterface | -| fromState | State identifier from which it is transitioning away from | -| toState | State identifier from which it is transitioning to | -| transition | Used transition | -| _locale | Used locale | -| recipient | Customer E-Mail Address | -| firstname | Customer Firstname | -| lastname | Customer Lastname | -| orderNumber | Order Number | - -#### Available Placeholders keys for email templates for comment - -| Key | Value | -|:-----|:------------| -| object | Object of type OrderInterface | -| _locale | Used locale | -| recipient | Customer E-Mail Address | -| firstname | Customer Firstname | -| lastname | Customer Lastname | -| orderNumber | Order Number | -| type | Type of comment | -| submitAsEmail | should comment be sent as mail | -| comment | contents of the comment | - - -### Shipment - -#### Allowed Conditions - -| Name | Description | -|:-----|:------------| -| Shipping State | Dispatch if given Shipping State is active | -| Shipping Transition | Dispatch if given Shipping Transition has been applied | - -#### Allowed Actions - -| Name | Description | -|:-----|:------------| -| Order Email | Email with Order Object | -| Email | Default Email without Order Object | - -#### Available Placeholders keys for email templates - -| Key | Value | -|:-----|:------------| -| object | Object of type OrderShipmentInterface | -| order | Object of type OrderInterface | -| fromState | State identifier from which it is transitioning away from | -| toState | State identifier from which it is transitioning to | -| transition | Used transition | - -### Invoice - -#### Allowed Conditions - -| Name | Description | -|:-----|:------------| -| Invoice State | Dispatch if given Invoice State is active | -| Invoice Transition | Dispatch if given Invoice Transition has been applied | - -#### Allowed Actions - -| Name | Description | -|:-----|:------------| -| Order Email | Email with Order Object | -| Email | Default Email without Order Object | - -#### Available Placeholders keys for email templates - -| Key | Value | -|:-----|:------------| -| object | Object of type OrderInvoiceInterface | -| order | Object of type OrderInterface | -| fromState | State identifier from which it is transitioning away from | -| toState | State identifier from which it is transitioning to | -| transition | Used transition | - -### Payment - -#### Allowed Conditions - -| Name | Description | -|:-----|:------------| -| Payment State | Dispatch if given Payment State is active | -| Payment Transition | Dispatch if given Payment Transition has been applied | - -#### Allowed Actions - -| Name | Description | -|:-----|:------------| -| Order Email | Email with Order Object | -| Email | Default Email without Order Object | - -#### Available Placeholders keys for email templates - -| Key | Value | -|:-----|:------------| -| object | Object of type PaymentInterface | -| order | Object of type OrderInterface | -| paymentState | State of the Payment | - -### User - -#### Allowed Conditions - -| Name | Description | -|:-----|:------------| -| User Type| Dispatch if given Type has been applied. Allowed Types: `new account`, `password reset` | - -#### Allowed Actions - -| Name | Description | -|:-----|:------------| -| Email | Default Email without Order Object | - -#### Available Placeholders keys for email templates - -| Key | Value | -|:-----|:------------| -| object | Object of type CustomerInterface | -| recipient | Customer E-Mail Address | -| gender | Customer Gender | -| firstname | Customer Firstname | -| lastname | Customer Lastname | -| email | Customer E-Mail | -| type | type of customer notification | - -#### Additional Placeholders keys for Password Reset - -| Key | Value | -|:-----|:------------| -| resetLink | Link where customer can reset his Password | - -#### Additional Placeholders keys for Request Newsletter - -| Key | Value | -|:-----|:------------| -| confirmLink | Link where customer can confirm his Newsletter subscription | -| token | Confirmation Token | - -### Quote - -#### Allowed Conditions - -| Name | Description | -|:-----|:------------| -| Carriers | Dispatch if given Carrier has been selected in Order | - -#### Allowed Actions - -| Name | Description | -|:-----|:------------| -| Email | Default Email without Order Object | - -#### Available Placeholders keys for email templates - -| Key | Value | -|:-----|:------------| -| object | Object of type QuoteInterface | - -## Custom Implementation - -It's also easy to implement custom notification rules. Read more about this [here](./03_Custom_Types.md) - -## Extend CoreShop Notification Rules - - - [Custom Actions](./01_Custom_Actions.md) - - [Custom Conditions](./02_Custom_Conditions.md) - - [Custom Types](./03_Custom_Types.md) - - [Triggering Notifications](./04_Triggering.md) \ No newline at end of file diff --git a/docs/docs/03_Development/10_Payment/01_Payment_Provider.md b/docs/docs/03_Development/10_Payment/01_Payment_Provider.md deleted file mode 100644 index 4ce51618e6..0000000000 --- a/docs/docs/03_Development/10_Payment/01_Payment_Provider.md +++ /dev/null @@ -1,120 +0,0 @@ -# CoreShop Payment Providers - -A Payment Provider represents a way that your customer pays during the checkout process. -It holds a reference to a specific gateway with custom configuration. -A gateway is configured for each payment method separately using the payment method form. - -## Payment Gateway configuration - -### Payment Gateways that already have a CoreShop bridge -First you need to create the configuration form type for your gateway. -Have a look at the configuration form types of *Paypal* and *Sofort*. - -Then you should register its configuration form type with `coreshop.gateway_configuration_type` tag. -After that it will be available in the admin panel in the gateway choice dropdown. - -> If you are not sure how your configuration form type should look like, -> head to [Payum documentation](https://github.com/Payum/Payum). - -### Other Payment Gateways - -> Learn more about integrating payment gateways in the [Payum docs](https://github.com/Payum/Payum). - -> You’ll probably need also this kind of configuration in your `app/config/config.yml` for the gateway’s factory: -> ```yaml -> payum: -> gateways: -> yourgateway: -> factory: yourgateway ->``` - -As an example, we add *Sofort* as a payment gateway factory. -To add a new gateway configuration you need to add 2 files: - - - A new FormType for configuration values - - A new Javascript File for ExtJs Form - -**1**: Form Type for Configuration Values: - -```php - -namespace AppBundle\CoreShop\Form\Type; - -use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\TextType; -use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\Form\FormEvent; -use Symfony\Component\Form\FormEvents; -use Symfony\Component\Validator\Constraints\NotBlank; - -final class SofortGatewayConfigurationType extends AbstractType -{ - /** - * {@inheritdoc} - */ - public function buildForm(FormBuilderInterface $builder, array $options) - { - $builder - ->add('config_key', TextType::class, [ - 'constraints' => [ - new NotBlank([ - 'groups' => 'coreshop', - ]), - ], - ]) - ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { - $data = $event->getData(); - - $data['payum.http_client'] = '@coreshop.payum.http_client'; - }) - ; - } -} - -``` - -Now we register the FormType into the container - -```yaml -services: - app.coreshop.form.type.gateway_configuration.sofort: - class: AppBundle\Form\Type\SofortGatewayConfigurationType - tags: - - { name: coreshop.gateway_configuration_type, type: sofort } - - { name: form.type } -``` - -**2**: Create the corresponding ExtJs Form: - -> You need to use the ```type``` attribute as identifier here - -```js -pimcore.registerNS('coreshop.provider.gateways.sofort'); -coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, { - - getLayout: function (config) { - return [ - { - xtype: 'textfield', - fieldLabel: t('config_key'), - name: 'gatewayConfig.config.config_key', - length: 255, - value: config.config_key ? config.config_key : "" - } - ]; - } - -}); - -``` - -Next we need to register our new Gateway JS file to be loaded: - -```yaml -core_shop_payment: - pimcore_admin: - js: - sofort_gateway: '/bundles/app/pimcore/js/sofort.js' -``` - -Thats it, now after reloading Pimcore, you'll see a new Factory. \ No newline at end of file diff --git a/docs/docs/03_Development/10_Payment/02_Omnipay_Bridge.md b/docs/docs/03_Development/10_Payment/02_Omnipay_Bridge.md deleted file mode 100644 index 161983cd8b..0000000000 --- a/docs/docs/03_Development/10_Payment/02_Omnipay_Bridge.md +++ /dev/null @@ -1,144 +0,0 @@ -# CoreShop Payum Ominpay Bridge - -[Here](https://github.com/thephpleague/omnipay#payment-gateways) is a list of all available Omnipay Payment Providers. - -> As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. -> But: You can use the dev-master Version Omnipay to add the Bridge - -To add the Omnipay Bridge, do following: - -```bash -$ composer require payum/omnipay-v3-bridge:dev-master -``` - -This will install the Bridge for you. - -Now you still need to create your Gateway Configuration as described [here](./01_Payment_Provider.md). - -## Example of Omnipay Gateway Configuration - -As example we add omnipay-worldpay: - -> Worldpay is currently in PR and I don't know when it is getting merged - -**1**: add FormType for Worldpay Configuration: - -```php -add('serviceKey', TextType::class, [ - 'constraints' => [ - new NotBlank([ - 'groups' => 'coreshop', - ]), - ], - ]) - ->add('clientKey', PasswordType::class, [ - 'constraints' => [ - new NotBlank([ - 'groups' => 'coreshop', - ]), - ], - ]) - ->add('merchantId', TextType::class, [ - 'constraints' => [ - new NotBlank([ - 'groups' => 'coreshop', - ]), - ], - ]) - ->add('factory', TextType::class, [ - 'data' => 'omnipay', - 'empty_data' => 'omnipay' - ]) - ->add('type', TextType::class, [ - 'data' => 'WorldPay\\Json', - 'empty_data' => 'WorldPay\\Json' - ]) - ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { - $data = $event->getData(); - - $data['payum.http_client'] = '@coreshop.payum.http_client'; - }) - ; - } -} - -``` - -Register into the container: - -```yaml -services: - app.form.type.gateway_configuration.worldpay: - class: AppBundle\Form\Type\WorldpayType - tags: - - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay } - - { name: form.type } -``` - -> Its important that it starts with ```omnipay_``` here - -**2**: Add ExtJs Form: - -```javascript -pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay'); -coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, { - - getLayout: function (config) { - return [ - { - xtype: 'textfield', - fieldLabel: t('coreshop_worldpay_service_key'), - name: 'gatewayConfig.config.serviceKey', - length: 255, - value: config.serviceKey ? config.serviceKey : "" - }, - { - xtype: 'textfield', - fieldLabel: t('coreshop_worldpay_client_key'), - name: 'gatewayConfig.config.clientKey', - length: 255, - value: config.clientKey - }, - { - xtype: 'textfield', - fieldLabel: t('coreshop_worldpay_merchant_id'), - name: 'gatewayConfig.config.merchantId', - length: 255, - value: config.merchantId - } - ]; - } - -}); -``` - -Register JS File for CoreShop to be loaded: - -```yaml -core_shop_payment: - pimcore_admin: - js: - worldpay: /bundles/app/pimcore/static/js/payment/provider/worldpay.js -``` - -Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider. \ No newline at end of file diff --git a/docs/docs/03_Development/10_Payment/03_Payum_Providers.md b/docs/docs/03_Development/10_Payment/03_Payum_Providers.md deleted file mode 100644 index a740fcb756..0000000000 --- a/docs/docs/03_Development/10_Payment/03_Payum_Providers.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Payum Providers - -[Here](https://github.com/Payum/Payum/blob/master/docs/supported-gateways.md) is a list of all available Payum Payment Providers. diff --git a/docs/docs/03_Development/10_Payment/index.md b/docs/docs/03_Development/10_Payment/index.md deleted file mode 100644 index 81e9ea0ba5..0000000000 --- a/docs/docs/03_Development/10_Payment/index.md +++ /dev/null @@ -1,39 +0,0 @@ -# CoreShop Payment - -CoreShop contains a very flexible payments management system with support for many gateways (payment providers). -We are using a payment abstraction library - [Payum](https://github.com/payum/payum), -which handles all sorts of capturing, refunding and recurring payments logic. - -On CoreShop side, we integrate it into our checkout and manage all the payment data. - -## Available Payment Gateways for CoreShop - -| Name | State | Link | Support | Offsite | Supports Server-Notification | Supports Refund | -|------|------|-------|---------|---------|------------------------------|-----------------| -| **Heidelpay** | stable | [Github](https://github.com/coreshop/PayumHeidelpayBundle) | PayPal, Klarna Sofort, Credit Card | No | Yes | No | -| **SaferPay** | stable | [Github](https://github.com/coreshop/PayumSaferpayBundle) | [Supported Payment Methods](https://saferpay.github.io/sndbx/index.html#paymentmethods) | Yes | Yes | Partially | -| **PostFinance** | stable | [Github](https://github.com/coreshop/PayumPostFinanceBundle) | PostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINT | Yes | Yes | No | -| **PowerPay** | dev | [Github](https://github.com/coreshop/PayumPowerpayBundle) | invoice, automatic credit check | No | No (not required) | No | -| **CuraBill** | dev | [Github](https://github.com/coreshop/PayumCurabillBundle) | invoice, instalments via iframe | No | No (not required) | No | - -## Payment -Every payment in CoreShop, successful or failed, is represented by the payment model, -which contains basic information and a reference to appropriate order. - -## Create a Payment programmatically -As usually, use a factory to create a new PaymentMethod and give it a unique code. - -```php -$payment = $this->container->get('coreshop.factory.payment')->createNew(); - -$payment->setOrder($order); -$payment->setCurrencyCode('EUR'); - -$this->container->get('coreshop.repository.payment')->add($payment); -``` - -## More - - - [Payment Provider](./01_Payment_Provider.md) - - [Ominpay Bridge](./02_Omnipay_Bridge.md) - - [Payum Providers](./03_Payum_Providers.md) \ No newline at end of file diff --git a/docs/docs/03_Development/11_Stores/02_Context.md b/docs/docs/03_Development/11_Stores/02_Context.md deleted file mode 100644 index afe1270dc6..0000000000 --- a/docs/docs/03_Development/11_Stores/02_Context.md +++ /dev/null @@ -1,91 +0,0 @@ -# CoreShop Store Context - -For CoreShop to determine the current store the visitor or customer comes from -it uses a concept called context and context resolver. - -## Context - -| Name | Priority | Tag | Description | -|------|----------|-----|-------------| -| [FixedStoreContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/FixedStoreContext.php) | 2 | `coreshop.context.store ` | Used for testing purposes | -| [StoreContext](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/StoreContext.php) | 1 | `coreshop.context.store ` | Load a store from given request resolver | - -## Resolver - -| Name | Priority | Tag | Description | -|------|----------|-----|-------------| -| [SiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/SiteBasedRequestResolver.php) | 100 | `coreshop.context.store.request_based.resolver` | Determines a store by a given pimcore frontend site | -| [PimcoreAdminSiteBasedRequestResolver](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Store/Context/RequestBased/PimcoreAdminSiteBasedRequestResolver.php) | 200 | `coreshop.context.store.request_based.resolver` | Determines a store by a given document in backend | - -These resolver take care about finding the correct store for the current request. - -## Create a Custom Resolver - -A Store Context needs to implement the interface `CoreShop\Component\Store\Context\StoreContextInterface`. -This interface consists of one method called `getStore` which returns a `CoreShop\Component\Store\Model\StoreInterface` or throws an `CoreShop\Component\Store\Context\StoreNotFoundException`. - -To register your context, you need to use the tag `coreshop.context.store` with an optional `priority` attribute. - -## Create a Request based Resolver - -CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can -create a custom RequestBased resolver. To do that, implement the interface `CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface` -with the method `findStore`. This method either returns a store or null. - -To register this resolver, use the tag: `coreshop.context.store.request_based.resolver` with an optional `priority` attribute. - -## Example - -We want to a StoreContext to be based on the Pimcore Document. So if we are on site `/de`, we want to resolve to `Store DE`, if we -are on page `/en` we want to resolve to Store `Store EN`: - -**1**: First of all we need to create our RequestBased Store Context: - -```php -storeRepository = $storeRepository; - } - - public function findStore(Request $request): ?StoreInterface - { - if (substr($request->getPathInfo(), 0, 3) === '/en') { - return $this->storeRepository->find(1); - } - - if (substr($request->getPathInfo(), 0, 3) === '/de') { - return $this->storeRepository->find(2); - } - - return null; - } -} -``` - -Now we need to configure the service in `src/AppBundle/Resources/config/services.yml` - -```yaml -services: - app.coreshop.store.context.request.document_based: - class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver - arguments: - - '@coreshop.repository.store' - tags: - - { name: coreshop.context.store.request_based.resolver, priority: 300 } - -``` - -CoreShop now tries to resolve the current Store based on the Pimcore Site we are on. diff --git a/docs/docs/03_Development/11_Stores/03_Theme.md b/docs/docs/03_Development/11_Stores/03_Theme.md deleted file mode 100644 index aa900e2b65..0000000000 --- a/docs/docs/03_Development/11_Stores/03_Theme.md +++ /dev/null @@ -1,5 +0,0 @@ -# CoreShop Stores Theming - -CoreShop Stores are designed to allow different Themes. Therefore you can have a true Multi-Store Environment with different Themes. - -CoreShop uses Sylius Theme Bundle for templates, read more at their docs on how it works: [https://docs.sylius.com/en/1.9/book/themes/themes.html](https://docs.sylius.com/en/1.9/book/themes/themes.html) diff --git a/docs/docs/03_Development/11_Stores/index.md b/docs/docs/03_Development/11_Stores/index.md deleted file mode 100644 index 94f675c4cd..0000000000 --- a/docs/docs/03_Development/11_Stores/index.md +++ /dev/null @@ -1,7 +0,0 @@ -# CoreShop Stores - -CoreShop Stores help you create a multi-store based eCommerce System with different Themes across these Stores. - - - [Create, Read, Update, Delete](./01_CRUD.md) - - [Store Context](./02_Context.md) - - [Theming](./03_Theme.md) \ No newline at end of file diff --git a/docs/docs/03_Development/12_Customers/02_Context.md b/docs/docs/03_Development/12_Customers/02_Context.md deleted file mode 100644 index 6eead8f124..0000000000 --- a/docs/docs/03_Development/12_Customers/02_Context.md +++ /dev/null @@ -1,17 +0,0 @@ -# CoreShop Customer Context - -CoreShop Customer Security uses [Symfony Firewall](https://symfony.com/doc/current/components/security/firewall.html) to handle authentication. - -CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination: - - - [Security Token Based](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Customer/Context/RequestBased/TokenBasedRequestResolver.php) - - -## Create a Custom Resolver - -A Store Context needs to implement the interface ```CoreShop\Component\Customer\Context\CustomerContextInterface```. This interface -consists of one function called "getCustomer" which returns a ```CoreShop\Component\Customer\Model\CustomerInterface``` or throws an ```CoreShop\Component\Customer\Context\CustomerNotFoundException``` - -To register your context, you need to use the tag: ```coreshop.context.customer``` with an optional ```priority``` attribute. - -The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish. \ No newline at end of file diff --git a/docs/docs/03_Development/12_Customers/03_Customer_Manager.md b/docs/docs/03_Development/12_Customers/03_Customer_Manager.md deleted file mode 100644 index 37ae9ec07b..0000000000 --- a/docs/docs/03_Development/12_Customers/03_Customer_Manager.md +++ /dev/null @@ -1,36 +0,0 @@ -# CoreShop Customer Manager -CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. -The Customer Manager implements the Interface `CoreShop\Bundle\CoreBundle\Customer\CustomerManagerInterface` and CoreShop implements it using the service `coreshop.customer.manager`. - -## Usage -To use the Service, you need to pass a Customer. -In our example, we gonna do that from a Controller with a FormType. - -```php -$customer = $this->getCustomer(); - -if ($customer instanceof CustomerInterface && null === $customer->getUser()) { - return $this->redirectToRoute('coreshop_customer_profile'); -} - -$form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew()); - -$redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile')); - -if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) { - $form = $form->handleRequest($request); - - if ($form->isValid()) { - $customer = $form->getData(); - $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode()); - - $this->get('coreshop.customer.manager')->persistCustomer($customer); - - return $this->redirect($redirect); - } -} - -return $this->render($this->templateConfigurator->findTemplate('Register/register.html'), [ - 'form' => $form->createView(), -]); -``` \ No newline at end of file diff --git a/docs/docs/03_Development/12_Customers/04_Registration_Types.md b/docs/docs/03_Development/12_Customers/04_Registration_Types.md deleted file mode 100644 index 0a1f8f9302..0000000000 --- a/docs/docs/03_Development/12_Customers/04_Registration_Types.md +++ /dev/null @@ -1,34 +0,0 @@ -# CoreShop Customer Registration Types -By default, a customer needs to provide a unique and valid email address to pass a registration. - -## Register By Email -> This is the default setting! - -To switch to registration by a unique and valid email address, you need set the identifier: - -```yaml -core_shop_customer: - login_identifier: 'email' -``` - -## Register By Username -First, you need to make sure your customer object provides a `username` field. -By default, coreshop **does not** install this field to prevent unnecessary confusion. -To implement the username field, just open your class editor and add a text field called `username` and you're good to go! - -To switch to registration by a unique username, you need change the identifier: - -```yaml -core_shop_customer: - login_identifier: 'username' -``` - -## Security - -### Form (Frontend) -CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not. - -### Backend / API -Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data. - -> Note: Both checks only apply to non-guest entities! diff --git a/docs/docs/03_Development/12_Customers/05_Company_Extension.md b/docs/docs/03_Development/12_Customers/05_Company_Extension.md deleted file mode 100644 index a48c3d55fd..0000000000 --- a/docs/docs/03_Development/12_Customers/05_Company_Extension.md +++ /dev/null @@ -1,41 +0,0 @@ -# CoreShop Customer Company Extension -The Company Entity allows you to append customers to a given company. -After a customer has been connected to a company by using the 1to1 relation `company`, it's possible to share addresses between company and the self-assigned addresses. - -## Access Types -> Note! This is only available if a customer already is connected to a valid company! - -### Own Only -If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour. - -### Company Only -If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself. - -### Own And Company -If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well. - -Plus, the `own_and_company` mode allows the customer to define and modify the allocation of the address. -To do so, coreshop renders an additional choice type to the address creation/modification form. - -**Note**: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. -In this example, the customer changes the allocation from `own` to `company`: - -Before: -```yaml -- company A - - addresses - - customer A - - addresses - - address A -``` - -After: -```yaml -- company A - - addresses - - address A - - customer A - - addresses -``` - -Read more about this feature [here](https://github.com/coreshop/CoreShop/issues/1266). \ No newline at end of file diff --git a/docs/docs/03_Development/12_Customers/index.md b/docs/docs/03_Development/12_Customers/index.md deleted file mode 100644 index cc7819d4fb..0000000000 --- a/docs/docs/03_Development/12_Customers/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# CoreShop Customer -This guide should lead you through how CoreShop handles Customer Information. - - 1. [Create, Read, Update, Delete](./01_CRUD.md) - 2. [Customer Context](./02_Context.md) - 3. [Registration Service](./03_Customer_Manager.md) - 3. [Registration Types](./04_Registration_Types.md) - 4. [Company Extension](./05_Company_Extension.md) \ No newline at end of file diff --git a/docs/docs/03_Development/13_Ecommerce_Tracking/index.md b/docs/docs/03_Development/13_Ecommerce_Tracking/index.md deleted file mode 100644 index e5cbbee8d5..0000000000 --- a/docs/docs/03_Development/13_Ecommerce_Tracking/index.md +++ /dev/null @@ -1,165 +0,0 @@ -# CoreShop eCommerce Tracking - -CoreShop currently implements Tracking for Analytics and Google Tag Manager. -Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore. - -Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually. - -## Available Trackers - - * google-analytics-enhanced-ecommerce - * google-analytics-universal-ecommerce - * google-gtag-enhanced-ecommerce - * google-gtm-classic-ecommerce - * google-gtm-enhanced-ecommerce - * matomo (piwik) - -## Enabling Trackers - -```yml -core_shop_tracking: - trackers: - google-analytics-enhanced-ecommerce: - enabled: false - google-analytics-universal-ecommerce: - enabled: false - google-gtag-enhanced-ecommerce: - enabled: false - google-gtm-classic-ecommerce: - enabled: false - google-gtm-enhanced-ecommerce: - enabled: false - matomo: - enabled: true -``` - -### External -- [Google Enhanced E-Commerce](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce) -- [Google Enhanced E-Commerce with gtag.js](https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce) -- [Google Tag Manager Enhanced E-Commerce](https://developers.google.com/tag-manager/enhanced-ecommerce) -- [Google Tag Manager Classic E-Commerce](https://support.google.com/tagmanager/answer/6107169?hl=en) -- [Matomo (Piwik) E-Commerce](https://matomo.org/docs/ecommerce-analytics/) - -#### Actions - -##### Product Impression -```php -$this->get('coreshop.tracking.manager')->trackProductImpression($product); -``` - -##### Product View -```php -$this->get('coreshop.tracking.manager')->trackProduct($product); -``` - -##### Product Action Add from Cart -```php -$this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product); -``` - -##### Product Action Remove from Cart -```php -$this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product); -``` - -##### Checkout Step -```php -$this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption) -``` - -##### Checkout Complete -```php -$this->get('coreshop.tracking.manager')->trackCheckoutComplete($order) -``` - -## Add a custom Tracker -To add a custom tracker you need to implement the interface `CoreShop\Component\Tracking\Tracker\TrackerInterface` - -```yaml -app.tracking.tracker.my_tracker: - class: AppBundle\Tracker\CustomTracker - parent: coreshop.tracking.tracker.ecommerce_tracker - tags: - - { name: coreshop.tracking.tracker, type: app-custom-tracker } -``` - -## Google Tag Manager -If you have enabled the gtm in backend, CoreShop sends some data to a `dataLayer` object which submits the object to gtm. - -### GTM Classic eCommerce -If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page. - -### GTM Enhanced eCommerce -There are six Impressions/Events for Google Tag Manager Enhanced eCommerce: - -#### Product Impression -**Tag Config Example**: -
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
- -#### Product Detail View -**Tag Config Example**: -
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
- -#### Checkout Step: -> **Event-Name**: `csCheckout` - -**Tag Config Example**: -
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Checkout
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csCheckout
-
- -#### Checkout Complete (Purchase): -**Tag Config Example**: -
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
- -#### Remove Item from Cart -> **Event-Name**: `csRemoveFromCart` - -**Tag Config Example**: -
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Remove from Cart
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csRemoveFromCart
-
- -#### Add Item to Cart -> **Event-Name**: `csAddToCart` - -**Tag Config Example**: -
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Add to Cart
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csAddToCart
-
diff --git a/docs/docs/03_Development/14_Events/index.md b/docs/docs/03_Development/14_Events/index.md deleted file mode 100644 index ce6fbc7896..0000000000 --- a/docs/docs/03_Development/14_Events/index.md +++ /dev/null @@ -1,123 +0,0 @@ -# CoreShop Events - -CoreShop comes with a lot of build-in events. - -## Frontend Controller - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.customer.update_post` | ResourceControllerEvent | Fires after Customer has updated the profile | -| `coreshop.customer.change_password_post` | ResourceControllerEvent | Fires after Customer has changed the password | -| `coreshop.customer.newsletter_confirm_post` | ResourceControllerEvent | Fires after Customer has confirmed his newsletter subscription | -| `coreshop.address.add_post` | ResourceControllerEvent | Fires after Customer has added a new address | -| `coreshop.address.update_post` | ResourceControllerEvent | Fires after Customer has updated a address | -| `coreshop.address.delete_pre` | ResourceControllerEvent | Fires before Customer deletes a address | - -## Cart - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.cart.update` | GenericEvent | Fires after cart has been updated | -| `coreshop.cart.pre_add_item` | GenericEvent | Fires before a item gets added to cart | -| `coreshop.cart.post_add_item` | GenericEvent | Fires after a item gets added to cart | -| `coreshop.cart.pre_remove_item` | GenericEvent | Fires before a item gets removed from cart | -| `coreshop.cart.post_remove_item` | GenericEvent | Fires after a item gets removed from cart | - -## Customer - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.customer.register` | CustomerRegistrationEvent | Fires after a new customer has been generated | -| `coreshop.customer.request_password_reset` | RequestPasswordChangeEvent | Fires after password reset has been requested | -| `coreshop.customer.password_reset` | GenericEvent | Fires after new password hast been applied to customer | - -## Order Document - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.order.shipment.wkhtml.options` | WkhtmlOptionsEvent | Options Event: Use it to change wkhtml options. | -| `coreshop.order.invoice.wkhtml.options` | WkhtmlOptionsEvent | Options Event: Use it to change wkhtml options. | - -## Payment - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.payment_provider.supports` | PaymentProviderSupportsEvent | Support Event: Use it to modify available Payment Providers | - -## Notes - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.note.*.post_add` | GenericEvent | Fires after a note of type `*` has been created | -| `coreshop.note.*.post_delete` | GenericEvent | Fires after a note of type `*` has been deleted | - -## Rules - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.rule.availability_check` | RuleAvailabilityCheckEvent | Fires in `RuleAvailabilityCheck` maintenance/command for every active rule. | - -Replace symbol (*) with one of those note types: - -- `payment` -- `update_order` -- `update_order_item` -- `email` -- `order_comment` - -## Workflow - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.workflow.valid_transitions` | WorkflowTransitionEvent | Valid Event: Use it if you need to extend the workflow transitions | - -## Transformer - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.quote_item.pre_transform` | GenericEvent | Fires before proposal item gets transformed to a quote item | -| `coreshop.quote_item.post_transform` | GenericEvent | Fires after proposal item has been transformed to a quote item | -| `coreshop.order_item.pre_transform` | GenericEvent | Fires before proposal item gets transformed to a order item | -| `coreshop.order_item.post_transform` | GenericEvent | Fires after proposal item has been transformed to a order item | -| `coreshop.quote.pre_transform` | GenericEvent | Fires before proposal gets transformed to a quote | -| `coreshop.quote.post_transform` | GenericEvent | Fires after proposal has been transformed to a quote | -| `coreshop.order.pre_transform` | GenericEvent | Fires before proposal gets transformed to a order | -| `coreshop.order.post_transform` | GenericEvent | Fires after proposal has been transformed to a order | -| `coreshop.shipment_item.pre_transform` | GenericEvent | Fires before proposal item gets transformed to a shipment item | -| `coreshop.shipment_item.post_transform` | GenericEvent | Fires after proposal item has been transformed to a shipment item | -| `coreshop.shipment.pre_transform` | GenericEvent | Fires before proposal gets transformed to a shipment | -| `coreshop.shipment.post_transform` | GenericEvent | Fires after proposal has been transformed to a shipment | -| `coreshop.invoice.pre_transform` | GenericEvent | Fires before proposal gets transformed to a invoice | -| `coreshop.invoice.post_transform` | GenericEvent | Fires after proposal has been transformed to a invoice | - -## Backend Controller - -| Name | EventType | Description | -|:-----|:------------|:----------| -| `coreshop.*.pre_create` | ResourceControllerEvent | Fires before object gets created in backend | -| `coreshop.*.post_create` | ResourceControllerEvent | Fires after object gets created in backend | -| `coreshop.*.pre_save` | ResourceControllerEvent | Fires before object gets saved in backend | -| `coreshop.*.post_save` | ResourceControllerEvent | Fires after object gets saved in backend | -| `coreshop.*.pre_delete` | ResourceControllerEvent | Fires before object gets deleted in backend | -| `coreshop.*.post_delete` | ResourceControllerEvent |Fires after object gets deleted in backend | - -Replace symbol (*) with one of those controller: - -- `configuration` -- `payment_provider` -- `exchange_rate` -- `filter` -- `index` -- `notification_rule` -- `notification_rule` -- `cart_price_rule` -- `product_price_rule` -- `shipping_rule` -- `store` -- `tax_rule_group` - -## Workflow Events -There are events vor every state machine transition. Read more about it [here](../17_State_Machine/index.md). - -## Model Events -You can use Pimcore Events for CoreShops Pimcore Models: [Pimcore Events](https://www.pimcore.org/docs/5.0.0/Extending_Pimcore/Event_API_and_Event_Manager.html) diff --git a/docs/docs/03_Development/15_Store_Front/01_Controllers.md b/docs/docs/03_Development/15_Store_Front/01_Controllers.md deleted file mode 100644 index cafe094d78..0000000000 --- a/docs/docs/03_Development/15_Store_Front/01_Controllers.md +++ /dev/null @@ -1,52 +0,0 @@ -# CoreShop Store Front Controller - -If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller: - -```yaml -core_shop_frontend: - controllers: - index: CoreShop\Bundle\FrontendBundle\Controller\IndexController - register: CoreShop\Bundle\FrontendBundle\Controller\RegisterController - customer: CoreShop\Bundle\FrontendBundle\Controller\CustomerController - currency: CoreShop\Bundle\FrontendBundle\Controller\CurrencyController - language: CoreShop\Bundle\FrontendBundle\Controller\LanguageController - search: CoreShop\Bundle\FrontendBundle\Controller\SearchController - cart: CoreShop\Bundle\FrontendBundle\Controller\CartController - checkout: CoreShop\Bundle\FrontendBundle\Controller\CheckoutController - category: CoreShop\Bundle\FrontendBundle\Controller\CategoryController - product: CoreShop\Bundle\FrontendBundle\Controller\ProductController - quote: CoreShop\Bundle\FrontendBundle\Controller\QuoteController - security: CoreShop\Bundle\FrontendBundle\Controller\SecurityController - payment: CoreShop\Bundle\PayumBundle\Controller\PaymentController -``` - -## Example of using a Custom ProductController - -**1**: Add a new Controller and inherit from the FrontendController - -```php - `money_decimal_precision: 2` - -Having a global precision of 2 - -> `money_decimal_factor: 100` - -Displaying Currency with a factor of 100 (in Pimcore Backend). - -> *WARNING* If you change these settings in an existing Installation with Orders/Products etc. you also have to create -> a migration to change all the values from a precision of 2 to your new setting. - -In order to handle payment values with a precision of for example 4, we introduced a new Order Property called `paymentTotal`. -Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the `total` -Cart/Order value to a precision of 2 into the `paymentTotal` Value. - -For example: - -Your Cart/Order is "€ 1.000,5498", your payment total then is: "€ 1.000,55". - -If you want to display the payment total in your cart, you can use this template: - -```twig -{% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %} - - - {{ 'coreshop.ui.payment_total'|trans }}: - - - {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }} - - -{% endif %} -``` -c diff --git a/docs/docs/03_Development/index.md b/docs/docs/03_Development/index.md deleted file mode 100644 index f9cc7350bd..0000000000 --- a/docs/docs/03_Development/index.md +++ /dev/null @@ -1,42 +0,0 @@ -# Developer’s Guide - -The Developer’s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop. - -## Introduction - -## CoreShop Resources - -CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. -CoreShop currently implements these Resources as ORM Model: - - - Currency - - Country and State - - Tax Rate and Tax Rules - - Price Rules - - Carrier - - Shipping Rules - - Index and Filter Configuration - - Notification Rule Configuration - - Stores - - Payments - -Everytime something is called a Resource, we talk about ORM Models. - -## CoreShop Pimcore Models - -CoreShop also takes advantage of Pimcores flexible data-model. -Objects that are heavily used and changed are implemented using Data Objects: - - - Product - - Product Category - - Manufacturer - - Cart - - Order - - Order Invoice - - Order Shipment - - Quote - - Customer - - Customer Group - - Addresses - -Everytime we talk about Objects, we talk about Pimcore Data Objects. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js deleted file mode 100644 index faaa3d8abd..0000000000 --- a/docs/docusaurus.config.js +++ /dev/null @@ -1,135 +0,0 @@ -// @ts-check -// Note: type annotations allow type checking and IDEs autocompletion - -const lightCodeTheme = require('prism-react-renderer/themes/github'); -const darkCodeTheme = require('prism-react-renderer/themes/dracula'); - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'CoreShop 4.0.x - Pimcore eCommerce - Documentation', - tagline: 'CoreShop - Pimcore eCommerce - Documentation', - favicon: 'img/favicon.png', - - // Set the production url of your site here - url: 'https://docs.coreshop.org', - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' - baseUrl: '/4.0.0/', - - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: 'coreshop', // Usually your GitHub org/user name. - projectName: 'CoreShop', // Usually your repo name. - - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - - // Even if you don't use internalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - routeBasePath: '/', - sidebarPath: require.resolve('./sidebars.js'), - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - editUrl: - 'https://github.com/coreshop/CoreShop/tree/4.0/docs', - }, - blog: false, - theme: { - customCss: require.resolve('./src/css/custom.css'), - }, - }), - ], - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - // Replace with your project's social card - image: 'img/logo-white.svg', - navbar: { - title: '', - logo: { - alt: 'CoreShop', - src: 'img/logo-black.svg', - srcDark: 'img/logo-white.svg', - }, - items: [ - { - type: 'docSidebar', - sidebarId: 'tutorialSidebar', - position: 'left', - label: 'Documentation', - }, - { - href: 'https://pimcore.com/docs', - label: 'Pimcore Documentation', - position: 'left' - }, - { - href: 'https://github.com/coreshop/CoreShop', - label: 'GitHub', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { - label: 'Documentation', - to: '/', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'Pimcore', - href: 'https://github.com/pimcore/pimcore', - } - ], - }, - { - title: 'More', - items: [ - { - label: 'GitHub', - href: 'https://github.com/coreshop/CoreShop', - }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} CoreShop GmbH. Built with Docusaurus.`, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - }, - }), - plugins: [ - [ - require.resolve("@cmfcmf/docusaurus-search-local"), - { - indexBlog: false - }, - ], - ], -}; - -module.exports = config; diff --git a/docs/img/illustration.png b/docs/img/illustration.png new file mode 100644 index 0000000000..cdb7fd18b5 Binary files /dev/null and b/docs/img/illustration.png differ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 625f7deb3c..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: CoreShop - Pimcore eCommerce Framework ---- - -# CoreShop Documentation - -> This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework -> -> We've aimed this part of the documentation at a developer's audience. - -CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit [pimcore.com](https://pimcore.com). - -## Documentation Overview - -The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform: - -* See the [Getting Started](./01_Getting_Started) section for an overview and information about the installation process. -* See the [Bundles](./02_Bundles) section for details about the different Bundles CoreShop provides. -* See the [User Documentation](./02_User_Documentation) section for documentation configuration of CoreShop. -* See the [Development](./03_Development) section for documentation about developing with CoreShop. - -## Additional resources for getting started with CoreShop -- [CoreShop Demo](https://demo3.coreshop.org): See CoreShop in action and also use it as a blueprint application for your own implementations. - diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index 9e40d63554..0000000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,21745 +0,0 @@ -{ - "name": "coreshop-docs", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "coreshop-docs", - "version": "0.0.0", - "dependencies": { - "@cmfcmf/docusaurus-search-local": "^1.1.0", - "@docusaurus/core": "2.4.1", - "@docusaurus/preset-classic": "2.4.1", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "prism-react-renderer": "^1.3.5", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "2.4.1" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", - "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", - "dependencies": { - "@algolia/autocomplete-shared": "1.8.2" - } - }, - "node_modules/@algolia/autocomplete-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.9.2.tgz", - "integrity": "sha512-qaYzP0DNZsratnu18umlQVW++8uI8irpadk/e2cCOhM5Qvsyw9y338lkTd4AkxOPYf9EhTVgDNq0rQ+dNDtDgQ==", - "dependencies": { - "@algolia/autocomplete-core": "1.9.2", - "@algolia/autocomplete-preset-algolia": "1.9.2", - "@algolia/autocomplete-shared": "1.9.2", - "htm": "^3.1.1", - "preact": "^10.13.2" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.5.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.2.tgz", - "integrity": "sha512-hkG80c9kx9ClVAEcUJbTd2ziVC713x9Bji9Ty4XJfKXlxlsx3iXsoNhAwfeR4ulzIUg7OE5gez0UU1zVDdG7kg==", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.2", - "@algolia/autocomplete-shared": "1.9.2" - } - }, - "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.2.tgz", - "integrity": "sha512-pqgIm2GNqtCT59Y1ICctIPrYTi34+wNPiNWEclD/yDzp5uDUUsyGe5XrUjCNyQRTKonAlmYxoaEHOn8FWgmBHA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.2" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-shared": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.2.tgz", - "integrity": "sha512-XxX6YDn+7LG+SmdpXEOnj7fc3TjiVpQ0CbGhjLwrd2tYr6LVY2D4Iiu/iuYJ4shvVDWWnpwArSk0uIWC/8OPUA==", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.2.tgz", - "integrity": "sha512-2LVsf4W66hVHQ3Ua/8k15oPlxjELCztbAkQm/hP42Sw+GLkHAdY1vaVRYziaWq64+Oljfg6FKkZHCdgXH+CGIA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.2" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights/node_modules/@algolia/autocomplete-shared": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.2.tgz", - "integrity": "sha512-XxX6YDn+7LG+SmdpXEOnj7fc3TjiVpQ0CbGhjLwrd2tYr6LVY2D4Iiu/iuYJ4shvVDWWnpwArSk0uIWC/8OPUA==", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", - "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", - "dependencies": { - "@algolia/autocomplete-shared": "1.8.2" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", - "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" - }, - "node_modules/@algolia/autocomplete-theme-classic": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.9.2.tgz", - "integrity": "sha512-3yjFogH3p08Lo1aqjrIp71o/YqLNJivHtZJlZ32jZ7sC/p4Q7bte1GKvDoLloU+oWPyv+4awsl6EdnW4mfIAVQ==" - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", - "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", - "dependencies": { - "@algolia/cache-common": "4.17.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", - "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", - "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", - "dependencies": { - "@algolia/cache-common": "4.17.0" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", - "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", - "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", - "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", - "dependencies": { - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", - "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", - "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", - "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "node_modules/@algolia/logger-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", - "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", - "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", - "dependencies": { - "@algolia/logger-common": "4.17.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", - "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", - "dependencies": { - "@algolia/requester-common": "4.17.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", - "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", - "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", - "dependencies": { - "@algolia/requester-common": "4.17.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", - "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", - "dependencies": { - "@algolia/cache-common": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/requester-common": "4.17.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", - "dependencies": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.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==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "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-define-polyfill-provider/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "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==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dependencies": { - "@babel/types": "^7.21.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "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==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "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", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz", - "integrity": "sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.5.tgz", - "integrity": "sha512-FRqFlFKNazWYykft5zvzuEl1YyTDGsIRrjV9rvxvYkUC7W/ueBng1X68Xd6uRMzAaJ0xMKn08/wem5YS1lpX8w==", - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cmfcmf/docusaurus-search-local": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cmfcmf/docusaurus-search-local/-/docusaurus-search-local-1.1.0.tgz", - "integrity": "sha512-0IVb/aA0IK8ZlktuxmgXmluXfcSpo6Vdd2nG21y1aOH9nVYnPP231Dn0H8Ng9Qf9ronQQCDWHnuWpYOr9rUrEQ==", - "dependencies": { - "@algolia/autocomplete-js": "^1.8.2", - "@algolia/autocomplete-theme-classic": "^1.8.2", - "@algolia/client-search": "^4.12.0", - "algoliasearch": "^4.12.0", - "cheerio": "^1.0.0-rc.9", - "clsx": "^1.1.1", - "lunr-languages": "^1.4.0", - "mark.js": "^8.11.1" - }, - "peerDependencies": { - "@docusaurus/core": "^2.0.0", - "nodejieba": "^2.5.0" - }, - "peerDependenciesMeta": { - "nodejieba": { - "optional": true - } - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.5.tgz", - "integrity": "sha512-NaXVp3I8LdmJ54fn038KHgG7HmbIzZlKS2FkVf6mKcW5bYMJovkx4947joQyZk5yubxOZ+ddHSh79y39Aevufg==" - }, - "node_modules/@docsearch/react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.5.tgz", - "integrity": "sha512-Zuxf4z5PZ9eIQkVCNu76v1H+KAztKItNn3rLzZa7kpBS+++TgNARITnZeUS7C1DKoAhJZFr6T/H+Lvc6h/iiYg==", - "dependencies": { - "@algolia/autocomplete-core": "1.8.2", - "@algolia/autocomplete-preset-algolia": "1.8.2", - "@docsearch/css": "3.3.5", - "algoliasearch": "^4.0.0" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", - "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", - "dependencies": { - "@babel/core": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@babel/runtime": "^7.18.6", - "@babel/runtime-corejs3": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.7", - "babel-loader": "^8.2.5", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.0", - "cli-table3": "^0.6.2", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.23.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "del": "^6.1.1", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^2.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "html-minifier-terser": "^6.1.0", - "html-tags": "^3.2.0", - "html-webpack-plugin": "^5.5.0", - "import-fresh": "^3.3.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.1", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.0", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.3", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.3", - "rtl-detect": "^1.0.4", - "semver": "^7.3.7", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.3", - "tslib": "^2.4.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^6.0.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.3", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", - "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", - "dependencies": { - "cssnano-preset-advanced": "^5.3.8", - "postcss": "^8.4.14", - "postcss-sort-media-queries": "^4.2.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/logger": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", - "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", - "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", - "dependencies": { - "@babel/parser": "^7.18.8", - "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@mdx-js/mdx": "^1.6.22", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "image-size": "^1.0.1", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.2.0", - "stringify-object": "^3.3.0", - "tslib": "^2.4.0", - "unified": "^9.2.2", - "unist-util-visit": "^2.0.3", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", - "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", - "dependencies": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.4.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", - "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "tslib": "^2.4.0", - "unist-util-visit": "^2.0.3", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", - "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "@types/react-router-config": "^5.0.6", - "combine-promises": "^1.1.0", - "fs-extra": "^10.1.0", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", - "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "fs-extra": "^10.1.0", - "tslib": "^2.4.0", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", - "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "fs-extra": "^10.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", - "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", - "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", - "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", - "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "fs-extra": "^10.1.0", - "sitemap": "^7.1.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", - "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/plugin-content-blog": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/plugin-content-pages": "2.4.1", - "@docusaurus/plugin-debug": "2.4.1", - "@docusaurus/plugin-google-analytics": "2.4.1", - "@docusaurus/plugin-google-gtag": "2.4.1", - "@docusaurus/plugin-google-tag-manager": "2.4.1", - "@docusaurus/plugin-sitemap": "2.4.1", - "@docusaurus/theme-classic": "2.4.1", - "@docusaurus/theme-common": "2.4.1", - "@docusaurus/theme-search-algolia": "2.4.1", - "@docusaurus/types": "2.4.1" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", - "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", - "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/plugin-content-blog": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/plugin-content-pages": "2.4.1", - "@docusaurus/theme-common": "2.4.1", - "@docusaurus/theme-translations": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.43", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.5", - "prismjs": "^1.28.0", - "react-router-dom": "^5.3.3", - "rtlcss": "^3.5.0", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", - "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", - "dependencies": { - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/plugin-content-blog": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/plugin-content-pages": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^1.2.1", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.5", - "tslib": "^2.4.0", - "use-sync-external-store": "^1.2.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", - "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", - "dependencies": { - "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/theme-common": "2.4.1", - "@docusaurus/theme-translations": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.10.0", - "clsx": "^1.2.1", - "eta": "^2.0.0", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", - "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", - "dependencies": { - "fs-extra": "^10.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/types": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", - "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.6.0", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0", - "webpack-merge": "^5.8.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", - "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", - "dependencies": { - "@docusaurus/logger": "2.4.1", - "@svgr/webpack": "^6.2.1", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "github-slugger": "^1.4.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.4.0", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", - "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", - "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", - "dependencies": { - "@docusaurus/logger": "2.4.1", - "@docusaurus/utils": "2.4.1", - "joi": "^17.6.0", - "js-yaml": "^4.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "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/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.1.tgz", - "integrity": "sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.7.tgz", - "integrity": "sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", - "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.17.0", - "@algolia/cache-common": "4.17.0", - "@algolia/cache-in-memory": "4.17.0", - "@algolia/client-account": "4.17.0", - "@algolia/client-analytics": "4.17.0", - "@algolia/client-common": "4.17.0", - "@algolia/client-personalization": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/logger-console": "4.17.0", - "@algolia/requester-browser-xhr": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/requester-node-http": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz", - "integrity": "sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw==", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dependencies": { - "follow-redirects": "^1.14.7" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001488", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", - "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", - "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", - "dependencies": { - "browserslist": "^4.21.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "dependencies": { - "node-fetch": "^2.6.11" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.4.tgz", - "integrity": "sha512-0Y5uHtK5BswfaGJ+jrO+4pPg1msFBc0pwPIE1VqfpmVn6YbDfYfXMj8rfd7nt+4goAhJueO+H/I40VWJfcP1mQ==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.1", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", - "dependencies": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dependencies": { - "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.402", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.402.tgz", - "integrity": "sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", - "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.43", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", - "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr-languages": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.12.0.tgz", - "integrity": "sha512-C2z02jt74ymrDocBwxYB4Cr1LNZj9rHGLTH/00+JuoT6eJOSSuPBzeqQG8kjnlPUQe+/PAWv1/KHbDT+YYYRnA==" - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", - "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", - "dependencies": { - "cosmiconfig": "^8.1.3", - "jiti": "^1.18.2", - "klona": "^2.0.6", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.1.tgz", - "integrity": "sha512-Zr/dB+IlXaEqdoslLHhhqecwj73vc3rDmOpsBNBEVk7P2aqAlz+Ijy0fFbU5Ie9PtreDOIgGa9MsLWakVGl+fA==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", - "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", - "dependencies": { - "sort-css-media-queries": "2.1.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.16" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/preact": { - "version": "10.14.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.14.1.tgz", - "integrity": "sha512-4XDSnUisk3YFBb3p9WeKeH1mKoxdFUsaXcvxs9wlpYR1wax/TWJVqhwmIWbByX0h7jMEJH6Zc5J6jqc58FKaNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", - "peerDependencies": { - "react": ">=0.14.9" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "dependencies": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - }, - "peerDependencies": { - "react": "^17.0.0 || ^16.3.0 || ^15.5.4", - "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-textarea-autosize": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", - "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", - "dependencies": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "dependencies": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remark-mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, - "node_modules/rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", - "dependencies": { - "find-up": "^5.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.3.11", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - } - }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/search-insights": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.6.0.tgz", - "integrity": "sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==", - "peer": true, - "engines": { - "node": ">=8.16.0" - } - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.17.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.4.tgz", - "integrity": "sha512-jcEKZw6UPrgugz/0Tuk/PVyLAPfMBJf5clnGueo45wTweoV8yh7Q7PEkhkJ5uuUbC7zAxEcG3tqNr1bstkQ8nw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", - "deprecated": "Use String.prototype.trim() instead" - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", - "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.83.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.83.1.tgz", - "integrity": "sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - }, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", - "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", - "requires": { - "@algolia/autocomplete-shared": "1.8.2" - } - }, - "@algolia/autocomplete-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.9.2.tgz", - "integrity": "sha512-qaYzP0DNZsratnu18umlQVW++8uI8irpadk/e2cCOhM5Qvsyw9y338lkTd4AkxOPYf9EhTVgDNq0rQ+dNDtDgQ==", - "requires": { - "@algolia/autocomplete-core": "1.9.2", - "@algolia/autocomplete-preset-algolia": "1.9.2", - "@algolia/autocomplete-shared": "1.9.2", - "htm": "^3.1.1", - "preact": "^10.13.2" - }, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.2.tgz", - "integrity": "sha512-hkG80c9kx9ClVAEcUJbTd2ziVC713x9Bji9Ty4XJfKXlxlsx3iXsoNhAwfeR4ulzIUg7OE5gez0UU1zVDdG7kg==", - "requires": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.2", - "@algolia/autocomplete-shared": "1.9.2" - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.2.tgz", - "integrity": "sha512-pqgIm2GNqtCT59Y1ICctIPrYTi34+wNPiNWEclD/yDzp5uDUUsyGe5XrUjCNyQRTKonAlmYxoaEHOn8FWgmBHA==", - "requires": { - "@algolia/autocomplete-shared": "1.9.2" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.2.tgz", - "integrity": "sha512-XxX6YDn+7LG+SmdpXEOnj7fc3TjiVpQ0CbGhjLwrd2tYr6LVY2D4Iiu/iuYJ4shvVDWWnpwArSk0uIWC/8OPUA==", - "requires": {} - } - } - }, - "@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.2.tgz", - "integrity": "sha512-2LVsf4W66hVHQ3Ua/8k15oPlxjELCztbAkQm/hP42Sw+GLkHAdY1vaVRYziaWq64+Oljfg6FKkZHCdgXH+CGIA==", - "requires": { - "@algolia/autocomplete-shared": "1.9.2" - }, - "dependencies": { - "@algolia/autocomplete-shared": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.2.tgz", - "integrity": "sha512-XxX6YDn+7LG+SmdpXEOnj7fc3TjiVpQ0CbGhjLwrd2tYr6LVY2D4Iiu/iuYJ4shvVDWWnpwArSk0uIWC/8OPUA==", - "requires": {} - } - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", - "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", - "requires": { - "@algolia/autocomplete-shared": "1.8.2" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", - "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" - }, - "@algolia/autocomplete-theme-classic": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.9.2.tgz", - "integrity": "sha512-3yjFogH3p08Lo1aqjrIp71o/YqLNJivHtZJlZ32jZ7sC/p4Q7bte1GKvDoLloU+oWPyv+4awsl6EdnW4mfIAVQ==" - }, - "@algolia/cache-browser-local-storage": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", - "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", - "requires": { - "@algolia/cache-common": "4.17.0" - } - }, - "@algolia/cache-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", - "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" - }, - "@algolia/cache-in-memory": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", - "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", - "requires": { - "@algolia/cache-common": "4.17.0" - } - }, - "@algolia/client-account": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", - "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-analytics": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", - "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", - "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", - "requires": { - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-personalization": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", - "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/client-search": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", - "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", - "requires": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" - }, - "@algolia/logger-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", - "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" - }, - "@algolia/logger-console": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", - "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", - "requires": { - "@algolia/logger-common": "4.17.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", - "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", - "requires": { - "@algolia/requester-common": "4.17.0" - } - }, - "@algolia/requester-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", - "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" - }, - "@algolia/requester-node-http": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", - "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", - "requires": { - "@algolia/requester-common": "4.17.0" - } - }, - "@algolia/transporter": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", - "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", - "requires": { - "@algolia/cache-common": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/requester-common": "4.17.0" - } - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==" - }, - "@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", - "requires": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", - "requires": { - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", - "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "requires": { - "@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" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==" - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", - "requires": { - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "requires": { - "@babel/types": "^7.21.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", - "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - } - }, - "@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==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==" - }, - "@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", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", - "requires": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "requires": { - "@babel/types": "^7.21.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", - "requires": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz", - "integrity": "sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "requires": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", - "requires": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", - "requires": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/runtime-corejs3": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.5.tgz", - "integrity": "sha512-FRqFlFKNazWYykft5zvzuEl1YyTDGsIRrjV9rvxvYkUC7W/ueBng1X68Xd6uRMzAaJ0xMKn08/wem5YS1lpX8w==", - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", - "requires": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@cmfcmf/docusaurus-search-local": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cmfcmf/docusaurus-search-local/-/docusaurus-search-local-1.1.0.tgz", - "integrity": "sha512-0IVb/aA0IK8ZlktuxmgXmluXfcSpo6Vdd2nG21y1aOH9nVYnPP231Dn0H8Ng9Qf9ronQQCDWHnuWpYOr9rUrEQ==", - "requires": { - "@algolia/autocomplete-js": "^1.8.2", - "@algolia/autocomplete-theme-classic": "^1.8.2", - "@algolia/client-search": "^4.12.0", - "algoliasearch": "^4.12.0", - "cheerio": "^1.0.0-rc.9", - "clsx": "^1.1.1", - "lunr-languages": "^1.4.0", - "mark.js": "^8.11.1" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" - }, - "@docsearch/css": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.5.tgz", - "integrity": "sha512-NaXVp3I8LdmJ54fn038KHgG7HmbIzZlKS2FkVf6mKcW5bYMJovkx4947joQyZk5yubxOZ+ddHSh79y39Aevufg==" - }, - "@docsearch/react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.5.tgz", - "integrity": "sha512-Zuxf4z5PZ9eIQkVCNu76v1H+KAztKItNn3rLzZa7kpBS+++TgNARITnZeUS7C1DKoAhJZFr6T/H+Lvc6h/iiYg==", - "requires": { - "@algolia/autocomplete-core": "1.8.2", - "@algolia/autocomplete-preset-algolia": "1.8.2", - "@docsearch/css": "3.3.5", - "algoliasearch": "^4.0.0" - } - }, - "@docusaurus/core": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", - "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", - "requires": { - "@babel/core": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@babel/runtime": "^7.18.6", - "@babel/runtime-corejs3": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.7", - "babel-loader": "^8.2.5", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.0", - "cli-table3": "^0.6.2", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.23.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "del": "^6.1.1", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^2.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "html-minifier-terser": "^6.1.0", - "html-tags": "^3.2.0", - "html-webpack-plugin": "^5.5.0", - "import-fresh": "^3.3.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.1", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.0", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.3", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.3", - "rtl-detect": "^1.0.4", - "semver": "^7.3.7", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.3", - "tslib": "^2.4.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^6.0.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.3", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.2" - } - }, - "@docusaurus/cssnano-preset": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", - "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", - "requires": { - "cssnano-preset-advanced": "^5.3.8", - "postcss": "^8.4.14", - "postcss-sort-media-queries": "^4.2.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/logger": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", - "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", - "requires": { - "chalk": "^4.1.2", - "tslib": "^2.4.0" - } - }, - "@docusaurus/mdx-loader": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", - "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", - "requires": { - "@babel/parser": "^7.18.8", - "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@mdx-js/mdx": "^1.6.22", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "image-size": "^1.0.1", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.2.0", - "stringify-object": "^3.3.0", - "tslib": "^2.4.0", - "unified": "^9.2.2", - "unist-util-visit": "^2.0.3", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - } - }, - "@docusaurus/module-type-aliases": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", - "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", - "requires": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.4.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" - } - }, - "@docusaurus/plugin-content-blog": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", - "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "tslib": "^2.4.0", - "unist-util-visit": "^2.0.3", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - } - }, - "@docusaurus/plugin-content-docs": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", - "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "@types/react-router-config": "^5.0.6", - "combine-promises": "^1.1.0", - "fs-extra": "^10.1.0", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - } - }, - "@docusaurus/plugin-content-pages": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", - "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "fs-extra": "^10.1.0", - "tslib": "^2.4.0", - "webpack": "^5.73.0" - } - }, - "@docusaurus/plugin-debug": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", - "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "fs-extra": "^10.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-google-analytics": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", - "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-google-gtag": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", - "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-google-tag-manager": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", - "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/plugin-sitemap": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", - "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "fs-extra": "^10.1.0", - "sitemap": "^7.1.1", - "tslib": "^2.4.0" - } - }, - "@docusaurus/preset-classic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", - "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/plugin-content-blog": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/plugin-content-pages": "2.4.1", - "@docusaurus/plugin-debug": "2.4.1", - "@docusaurus/plugin-google-analytics": "2.4.1", - "@docusaurus/plugin-google-gtag": "2.4.1", - "@docusaurus/plugin-google-tag-manager": "2.4.1", - "@docusaurus/plugin-sitemap": "2.4.1", - "@docusaurus/theme-classic": "2.4.1", - "@docusaurus/theme-common": "2.4.1", - "@docusaurus/theme-search-algolia": "2.4.1", - "@docusaurus/types": "2.4.1" - } - }, - "@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "requires": { - "@types/react": "*", - "prop-types": "^15.6.2" - } - }, - "@docusaurus/theme-classic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", - "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", - "requires": { - "@docusaurus/core": "2.4.1", - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/plugin-content-blog": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/plugin-content-pages": "2.4.1", - "@docusaurus/theme-common": "2.4.1", - "@docusaurus/theme-translations": "2.4.1", - "@docusaurus/types": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.43", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.5", - "prismjs": "^1.28.0", - "react-router-dom": "^5.3.3", - "rtlcss": "^3.5.0", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-common": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", - "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", - "requires": { - "@docusaurus/mdx-loader": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/plugin-content-blog": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/plugin-content-pages": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-common": "2.4.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^1.2.1", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.5", - "tslib": "^2.4.0", - "use-sync-external-store": "^1.2.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-search-algolia": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", - "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", - "requires": { - "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.4.1", - "@docusaurus/logger": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", - "@docusaurus/theme-common": "2.4.1", - "@docusaurus/theme-translations": "2.4.1", - "@docusaurus/utils": "2.4.1", - "@docusaurus/utils-validation": "2.4.1", - "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.10.0", - "clsx": "^1.2.1", - "eta": "^2.0.0", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" - } - }, - "@docusaurus/theme-translations": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", - "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", - "requires": { - "fs-extra": "^10.1.0", - "tslib": "^2.4.0" - } - }, - "@docusaurus/types": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", - "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.6.0", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0", - "webpack-merge": "^5.8.0" - } - }, - "@docusaurus/utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", - "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", - "requires": { - "@docusaurus/logger": "2.4.1", - "@svgr/webpack": "^6.2.1", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "github-slugger": "^1.4.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.4.0", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - } - }, - "@docusaurus/utils-common": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", - "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", - "requires": { - "tslib": "^2.4.0" - } - }, - "@docusaurus/utils-validation": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", - "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", - "requires": { - "@docusaurus/logger": "2.4.1", - "@docusaurus/utils": "2.4.1", - "joi": "^17.6.0", - "js-yaml": "^4.1.0", - "tslib": "^2.4.0" - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "requires": { - "@sinclair/typebox": "^0.25.16" - } - }, - "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "requires": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "requires": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "requires": {} - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", - "requires": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "requires": {} - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "requires": {} - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "requires": {} - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "requires": {} - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "requires": {} - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "requires": {} - }, - "@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - } - }, - "@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "requires": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "requires": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - } - }, - "@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "requires": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - } - }, - "@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "requires": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - } - }, - "@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "requires": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - } - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "requires": { - "@types/unist": "*" - } - }, - "@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", - "requires": { - "@types/unist": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.1.tgz", - "integrity": "sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "@types/react-router-config": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.7.tgz", - "integrity": "sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "requires": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", - "requires": { - "@types/node": "*" - } - }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "requires": { - "@types/node": "*" - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - } - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "algoliasearch": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", - "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", - "requires": { - "@algolia/cache-browser-local-storage": "4.17.0", - "@algolia/cache-common": "4.17.0", - "@algolia/cache-in-memory": "4.17.0", - "@algolia/client-account": "4.17.0", - "@algolia/client-analytics": "4.17.0", - "@algolia/client-common": "4.17.0", - "@algolia/client-personalization": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/logger-console": "4.17.0", - "@algolia/requester-browser-xhr": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/requester-node-http": "4.17.0", - "@algolia/transporter": "4.17.0" - } - }, - "algoliasearch-helper": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz", - "integrity": "sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw==", - "requires": { - "@algolia/events": "^4.0.1" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "requires": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "requires": { - "follow-redirects": "^1.14.7" - } - }, - "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "requires": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001488", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", - "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==" - }, - "ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" - }, - "character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" - }, - "character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" - }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" - }, - "clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "requires": { - "source-map": "~0.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" - }, - "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "requires": { - "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - } - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "copy-text-to-clipboard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", - "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" - } - } - }, - "core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==" - }, - "core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", - "requires": { - "browserslist": "^4.21.5" - } - }, - "core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "requires": { - "node-fetch": "^2.6.11" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, - "css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "requires": {} - }, - "css-loader": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.4.tgz", - "integrity": "sha512-0Y5uHtK5BswfaGJ+jrO+4pPg1msFBc0pwPIE1VqfpmVn6YbDfYfXMj8rfd7nt+4goAhJueO+H/I40VWJfcP1mQ==", - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.1", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - } - }, - "css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", - "requires": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "requires": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", - "requires": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" - } - }, - "cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "requires": { - "css-tree": "^1.1.2" - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "requires": { - "execa": "^5.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.402", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.402.tgz", - "integrity": "sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "requires": { - "@types/node": "*", - "require-like": ">= 0.1.1" - } - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - } - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "requires": { - "punycode": "^1.3.2" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "requires": { - "fbjs": "^3.0.0" - } - }, - "fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "requires": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "requires": { - "xml-js": "^1.6.11" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", - "requires": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - } - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "requires": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" - }, - "hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "requires": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "requires": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - } - }, - "hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" - }, - "hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "requires": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - } - } - }, - "hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - } - }, - "hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "htm": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", - "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - } - } - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" - }, - "html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" - }, - "html-webpack-plugin": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", - "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" - } - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, - "image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", - "requires": { - "queue": "6.0.2" - } - }, - "immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "infima": { - "version": "0.2.0-alpha.43", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", - "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" - }, - "is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" - }, - "is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - } - } - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" - }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, - "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "requires": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" - }, - "joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "requires": { - "package-json": "^6.3.0" - } - }, - "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "lunr-languages": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.12.0.tgz", - "integrity": "sha512-C2z02jt74ymrDocBwxYB4Cr1LNZj9rHGLTH/00+JuoT6eJOSSuPBzeqQG8kjnlPUQe+/PAWv1/KHbDT+YYYRnA==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==" - }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { - "unist-util-remove": "^2.0.0" - } - }, - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "~1.33.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "requires": { - "entities": "^4.4.0" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - } - } - }, - "postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} - }, - "postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz", - "integrity": "sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==", - "requires": { - "cosmiconfig": "^8.1.3", - "jiti": "^1.18.2", - "klona": "^2.0.6", - "semver": "^7.3.8" - }, - "dependencies": { - "cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - } - } - }, - "postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - } - }, - "postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.1.tgz", - "integrity": "sha512-Zr/dB+IlXaEqdoslLHhhqecwj73vc3rDmOpsBNBEVk7P2aqAlz+Ijy0fFbU5Ie9PtreDOIgGa9MsLWakVGl+fA==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-sort-media-queries": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", - "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", - "requires": { - "sort-css-media-queries": "2.1.0" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", - "requires": {} - }, - "preact": { - "version": "10.14.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.14.1.tgz", - "integrity": "sha512-4XDSnUisk3YFBb3p9WeKeH1mKoxdFUsaXcvxs9wlpYR1wax/TWJVqhwmIWbByX0h7jMEJH6Zc5J6jqc58FKaNQ==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" - }, - "prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", - "requires": {} - }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "requires": { - "escape-goat": "^2.0.0" - } - }, - "pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "requires": { - "inherits": "~2.0.3" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - } - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "requires": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "requires": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" - }, - "react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "requires": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "requires": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - } - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-loadable": { - "version": "npm:@docusaurus/react-loadable@5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "requires": { - "@types/react": "*", - "prop-types": "^15.6.2" - } - }, - "react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "requires": { - "@babel/runtime": "^7.10.3" - } - }, - "react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "requires": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - } - }, - "react-textarea-autosize": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", - "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", - "requires": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "requires": { - "minimatch": "^3.0.5" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "requires": { - "rc": "^1.2.8" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" - }, - "remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "requires": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" - }, - "remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "requires": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - }, - "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { - "mdast-squeeze-paragraphs": "^4.0.0" - } - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, - "rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", - "requires": { - "find-up": "^5.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.3.11", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "search-insights": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.6.0.tgz", - "integrity": "sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==", - "peer": true - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "requires": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "requires": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "dependencies": { - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "terser": { - "version": "5.17.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.4.tgz", - "integrity": "sha512-jcEKZw6UPrgugz/0Tuk/PVyLAPfMBJf5clnGueo45wTweoV8yh7Q7PEkhkJ5uuUbC7zAxEcG3tqNr1bstkQ8nw==", - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" - }, - "trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" - }, - "trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" - }, - "tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - } - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "peer": true - }, - "ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" - }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" - }, - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" - }, - "unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" - }, - "unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" - }, - "unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "requires": { - "unist-util-is": "^4.0.0" - } - }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { - "@types/unist": "^2.0.2" - } - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - } - } - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "requires": { - "prepend-http": "^2.0.0" - } - }, - "use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "requires": {} - }, - "use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "requires": {} - }, - "use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "requires": { - "use-isomorphic-layout-effect": "^1.1.1" - } - }, - "use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - } - }, - "vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" - }, - "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - } - }, - "wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", - "requires": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "webpack": { - "version": "5.83.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.83.1.tgz", - "integrity": "sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "requires": {} - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" - }, - "webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "requires": { - "string-width": "^5.0.1" - } - }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "requires": {} - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "requires": { - "sax": "^1.2.4" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" - } - } -} diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index b702576c4b..0000000000 --- a/docs/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "coreshop-docs", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" - }, - "dependencies": { - "@cmfcmf/docusaurus-search-local": "^1.1.0", - "@docusaurus/core": "2.4.1", - "@docusaurus/preset-classic": "2.4.1", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "prism-react-renderer": "^1.3.5", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "2.4.1" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "engines": { - "node": ">=16.14" - } -} diff --git a/docs/sidebars.js b/docs/sidebars.js deleted file mode 100644 index 9ab54c2459..0000000000 --- a/docs/sidebars.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - - // But you can create a sidebar manually - /* - tutorialSidebar: [ - 'intro', - 'hello', - { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], - }, - ], - */ -}; - -module.exports = sidebars; diff --git a/docs/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js deleted file mode 100644 index 78f410ba68..0000000000 --- a/docs/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/docs/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e5d..0000000000 --- a/docs/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css deleted file mode 100644 index 6d8902d29f..0000000000 --- a/docs/src/css/custom.css +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: #cd1017; - --ifm-color-primary-dark: #b90e15; - --ifm-color-primary-darker: #ae0e14; - --ifm-color-primary-darkest: #900b10; - --ifm-color-primary-light: #e21219; - --ifm-color-primary-lighter: #e6121a; - --ifm-color-primary-lightest: #ea121a; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { - --ifm-color-primary: #f0454b; - --ifm-color-primary-dark: #f03f45; - --ifm-color-primary-darker: #f03f45; - --ifm-color-primary-darkest: #f03f45; - --ifm-color-primary-light: #f8acaf; - --ifm-color-primary-lighter: #f8a9ac; - --ifm-color-primary-lightest: #f9b7ba; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} diff --git a/docs/src/pages/index.html b/docs/src/pages/index.html deleted file mode 100644 index 7c740030a4..0000000000 --- a/docs/src/pages/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - CoreShop Documentation - - -If you are not redirected automatically, follow this -link. - - \ No newline at end of file diff --git a/docs/static/img/favicon.png b/docs/static/img/favicon.png deleted file mode 100644 index e03a184d6f..0000000000 Binary files a/docs/static/img/favicon.png and /dev/null differ diff --git a/docs/static/img/logo-black.svg b/docs/static/img/logo-black.svg deleted file mode 100644 index 6207803ad5..0000000000 --- a/docs/static/img/logo-black.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - coreshopWon rgb - - - \ No newline at end of file diff --git a/docs/static/img/logo-white.svg b/docs/static/img/logo-white.svg deleted file mode 100644 index decd2a44df..0000000000 --- a/docs/static/img/logo-white.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - coreshopWon rgb - - - \ No newline at end of file diff --git a/docs/themes/coreshop/config.json b/docs/themes/coreshop/config.json deleted file mode 100644 index 321cc77d89..0000000000 --- a/docs/themes/coreshop/config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "favicon": "img/favicon.png", - "css": [], - "js": [ - "js/build/coreshop.min.js" - ], - "fonts": [ - "//fonts.googleapis.com/css?family=Open+Sans:100,200,300,400,500,600,700,800,900" - ], - "variants": { - "core": { - "css": [ - "css/coreshop.min.css" - ] - }, - "generic": { - "css": [ - "css/coreshop-generic.min.css" - ] - } - } -} diff --git a/docs/themes/coreshop/css/coreshop-core.min.css b/docs/themes/coreshop/css/coreshop-core.min.css deleted file mode 100644 index 04cf4e0e15..0000000000 --- a/docs/themes/coreshop/css/coreshop-core.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Pimcore Documentation - * License: GPLv3 - */ -/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#cd1017}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:50px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/themes/coreshop/css/coreshop-generic.min.css b/docs/themes/coreshop/css/coreshop-generic.min.css deleted file mode 100644 index c16cdddad7..0000000000 --- a/docs/themes/coreshop/css/coreshop-generic.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Pimcore Documentation - * License: GPLv3 - */ -/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#0078be}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:26.4px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/themes/coreshop/fonts/robotoslab-bold.eot b/docs/themes/coreshop/fonts/robotoslab-bold.eot deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-bold.svg b/docs/themes/coreshop/fonts/robotoslab-bold.svg deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-bold.ttf b/docs/themes/coreshop/fonts/robotoslab-bold.ttf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-bold.woff b/docs/themes/coreshop/fonts/robotoslab-bold.woff deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-bold.woff2 b/docs/themes/coreshop/fonts/robotoslab-bold.woff2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-light.eot b/docs/themes/coreshop/fonts/robotoslab-light.eot deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-light.svg b/docs/themes/coreshop/fonts/robotoslab-light.svg deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-light.ttf b/docs/themes/coreshop/fonts/robotoslab-light.ttf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-light.woff b/docs/themes/coreshop/fonts/robotoslab-light.woff deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-light.woff2 b/docs/themes/coreshop/fonts/robotoslab-light.woff2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-regular.eot b/docs/themes/coreshop/fonts/robotoslab-regular.eot deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-regular.svg b/docs/themes/coreshop/fonts/robotoslab-regular.svg deleted file mode 100644 index f6a9983ebd..0000000000 --- a/docs/themes/coreshop/fonts/robotoslab-regular.svg +++ /dev/null @@ -1,687 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/themes/coreshop/fonts/robotoslab-regular.ttf b/docs/themes/coreshop/fonts/robotoslab-regular.ttf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-regular.woff b/docs/themes/coreshop/fonts/robotoslab-regular.woff deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/fonts/robotoslab-regular.woff2 b/docs/themes/coreshop/fonts/robotoslab-regular.woff2 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/img/favicon.png b/docs/themes/coreshop/img/favicon.png deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/img/logo-white.svg b/docs/themes/coreshop/img/logo-white.svg deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/themes/coreshop/js/build/pimcore.js b/docs/themes/coreshop/js/build/pimcore.js deleted file mode 100644 index a3e8f4950d..0000000000 --- a/docs/themes/coreshop/js/build/pimcore.js +++ /dev/null @@ -1,340 +0,0 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" - - - - - -
- insert('theme::partials/version_info', ['params' => $params]); ?> - - - - -
-
-
- section('content'); ?> -
-
-
- diff --git a/docs/themes/coreshop/templates/partials/change_version.php b/docs/themes/coreshop/templates/partials/change_version.php deleted file mode 100644 index 297a804114..0000000000 --- a/docs/themes/coreshop/templates/partials/change_version.php +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - Version: - - - - - - - \ No newline at end of file diff --git a/docs/themes/coreshop/templates/partials/disqus.php b/docs/themes/coreshop/templates/partials/disqus.php deleted file mode 100644 index e4f295a8ed..0000000000 --- a/docs/themes/coreshop/templates/partials/disqus.php +++ /dev/null @@ -1,26 +0,0 @@ - - -
- -
- - - - diff --git a/docs/themes/coreshop/templates/partials/edit_on.php b/docs/themes/coreshop/templates/partials/edit_on.php deleted file mode 100644 index 8e311200ac..0000000000 --- a/docs/themes/coreshop/templates/partials/edit_on.php +++ /dev/null @@ -1,7 +0,0 @@ -getHTML()->getEditOn(); -if ($edit_on) { ?> - - Edit on - - diff --git a/docs/themes/coreshop/templates/partials/navbar_content.php b/docs/themes/coreshop/templates/partials/navbar_content.php deleted file mode 100644 index da94f86183..0000000000 --- a/docs/themes/coreshop/templates/partials/navbar_content.php +++ /dev/null @@ -1,23 +0,0 @@ - - - - -

- - - - - -
- - - - \ No newline at end of file diff --git a/docs/themes/coreshop/templates/partials/version_info.php b/docs/themes/coreshop/templates/partials/version_info.php deleted file mode 100644 index f73137e621..0000000000 --- a/docs/themes/coreshop/templates/partials/version_info.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
- Built - - $params['build_versions']['source'], - '{short_commit_hash}' => substr($params['build_versions']['source'], 0, 6) - ]; - - $from = 'from '; - $from .= sprintf( - '%s', - str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_url']), - str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_name']) - ); - - echo $from; - } - ?> - - with - - - pimcore-docs@ - - . -
- - diff --git a/etc/illustration.png b/etc/illustration.png new file mode 100644 index 0000000000..cdb7fd18b5 Binary files /dev/null and b/etc/illustration.png differ diff --git a/docs/img/screenshot5-2.png b/etc/screenshot5-2.png similarity index 100% rename from docs/img/screenshot5-2.png rename to etc/screenshot5-2.png diff --git a/docs/img/screenshot5-3.png b/etc/screenshot5-3.png similarity index 100% rename from docs/img/screenshot5-3.png rename to etc/screenshot5-3.png diff --git a/docs/img/screenshot5.png b/etc/screenshot5.png similarity index 100% rename from docs/img/screenshot5.png rename to etc/screenshot5.png diff --git a/features/domain/cache/check_cache_size.feature b/features/domain/cache/check_cache_size.feature new file mode 100644 index 0000000000..77fb1187d9 --- /dev/null +++ b/features/domain/cache/check_cache_size.feature @@ -0,0 +1,19 @@ +@domain @cache +Feature: Adding a new Product and adding it to the cache + + Background: + Given the site operates on a store in "Austria" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And the site has a product "T-Shirt" priced at 2000 + And the product has the tax rule group "AT" + + Scenario: Test caching the product + Given the product "T-Shirt" is cached with key "tshirt" + And I restore the object from the cache + Then the cache item should be a DataObject + And the cache item should have an object-var "taxRule" with value of tax rule group + And the cache item serialized should have a property "taxRule" with value of tax rule group + Given I restore the object with Pimcore Cache Helper + Then the cache object should have an object-var "taxRule" of type ResourceInterface \ No newline at end of file diff --git a/features/domain/cart/rules/cart_item/amount_condition.feature b/features/domain/cart/rules/cart_item/amount_condition.feature index 9f3d56c3d9..2692293f5b 100644 --- a/features/domain/cart/rules/cart_item/amount_condition.feature +++ b/features/domain/cart/rules/cart_item/amount_condition.feature @@ -29,7 +29,7 @@ Feature: Adding a new cart item rule And the cart item action has a condition amount with value "90" to "150" And the cart item action has a action discount-percent with 10% discount Then I refresh my cart - And the cart discount should be "-1000" excluding tax + And the cart item discount should be "-1000" excluding tax Scenario: Add a new amount condition with is invalid cause of min value Given adding a cart price rule named "amount" diff --git a/features/domain/cart/rules/cart_item/discount_amount_action.feature b/features/domain/cart/rules/cart_item/discount_amount_action.feature index f1a78a6471..3c281b693d 100644 --- a/features/domain/cart/rules/cart_item/discount_amount_action.feature +++ b/features/domain/cart/rules/cart_item/discount_amount_action.feature @@ -17,6 +17,6 @@ Feature: Adding a new cart rule And the cart rule has a cart-item-action action And the cart item action has a action discount with 20 in currency "EUR" off And I apply the voucher code "asdf" to my cart - Then the cart discount should be "-2000" including tax + Then the cart item discount should be "-2000" including tax Then the cart total should be "8000" including tax diff --git a/features/domain/cart/rules/cart_item/discount_over_100_percent.feature b/features/domain/cart/rules/cart_item/discount_over_100_percent.feature index bcbb157b15..f023865d35 100644 --- a/features/domain/cart/rules/cart_item/discount_over_100_percent.feature +++ b/features/domain/cart/rules/cart_item/discount_over_100_percent.feature @@ -12,13 +12,14 @@ Feature: Adding a new cart rule And the tax rule group has a tax rule for country "Austria" with tax rate "AT" And the site has a product "Shoe" priced at 10000 And the product has the tax rule group "AT" - And I add the product "Shoe" to my cart + And the product is active and published and available for store "Austria" Scenario: Add a new discount rule with 100 percent discount Given adding a cart price rule named "discount-10" And the cart rule is not a voucher rule And the cart rule is active And the cart rule has a action discount-percent with 100% discount + And I add the product "Shoe" to my cart Given adding a cart price rule named "discount-100" And the cart rule is a voucher rule with code "discount-100" And the cart rule is active diff --git a/features/domain/cart/rules/cart_item/discount_percent_condition.feature b/features/domain/cart/rules/cart_item/discount_percent_condition.feature index 0fa115c473..0016752aed 100644 --- a/features/domain/cart/rules/cart_item/discount_percent_condition.feature +++ b/features/domain/cart/rules/cart_item/discount_percent_condition.feature @@ -23,5 +23,5 @@ Feature: Adding a new cart rule And the cart rule has a cart-item-action action And the cart item action has a action discount-percent with 10% discount And I apply the voucher code "asdf" to my cart - Then the cart discount should be "-1000" including tax + Then the cart item discount should be "-1000" including tax Then the cart total should be "9000" including tax diff --git a/features/domain/cart/rules/cart_item/discount_percent_gross_action.feature b/features/domain/cart/rules/cart_item/discount_percent_gross_action.feature new file mode 100644 index 0000000000..02c6861d39 --- /dev/null +++ b/features/domain/cart/rules/cart_item/discount_percent_gross_action.feature @@ -0,0 +1,26 @@ +@domain @cart +Feature: Adding a new cart rule + In order to give the customer discounts + based on the cart, we add a new rule + + Background: + Given the site operates on a store in "Austria" with gross values + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And the site has a product "Shoe" priced at 10000 + And the product has the tax rule group "AT" + And I add the product "Shoe" to my cart + + Scenario: Add a new discount rule with 20 percent discount for all products + Given adding a cart price rule named "discount" + And the cart rule is active + And the cart rule is a voucher rule with code "asdf" + And the cart rule has a cart-item-action action + And the cart item action has a action discount-percent with 10% discount + And I apply the voucher code "asdf" to my cart + Then the cart item discount should be "-1000" including tax + Then the cart total should be "9000" including tax + diff --git a/features/domain/cart/rules/cart_item/discount_percent_net_action.feature b/features/domain/cart/rules/cart_item/discount_percent_net_action.feature new file mode 100644 index 0000000000..53ff3999ea --- /dev/null +++ b/features/domain/cart/rules/cart_item/discount_percent_net_action.feature @@ -0,0 +1,26 @@ +@domain @cart +Feature: Adding a new cart rule + In order to give the customer discounts + based on the cart, we add a new rule + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And the site has a product "Shoe" priced at 10000 + And the product has the tax rule group "AT" + And I add the product "Shoe" to my cart + + Scenario: Add a new discount rule with 20 percent discount for all products + Given adding a cart price rule named "discount" + And the cart rule is active + And the cart rule is a voucher rule with code "asdf" + And the cart rule has a cart-item-action action + And the cart item action has a action discount-percent with 10% discount + And I apply the voucher code "asdf" to my cart + Then the cart item discount should be "-1200" including tax + Then the cart total should be "10800" including tax + diff --git a/features/domain/cart/rules/gift_product_with_unit_action.feature b/features/domain/cart/rules/gift_product_with_unit_action.feature new file mode 100644 index 0000000000..dbd93c3581 --- /dev/null +++ b/features/domain/cart/rules/gift_product_with_unit_action.feature @@ -0,0 +1,41 @@ +@domain @cart +Feature: Adding a new cart rule + In order to give the customer a gift product with a unit + based on the cart, we add a new rule + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has two categories "Shoes" and "Coats" + And the site has a product-unit "Pieces" + And the site has a product-unit "Carton" + And the site has a product "Shoe" priced at 10000 + And it is in category "Shoes" + And the site has a product "Jacket" priced at 10000 + And it is in category "Coats" + And the product has the default unit "Pieces" + + Scenario: Add a new gift rule with a free product with a unit + Given adding a cart price rule named "gift" + And the cart rule is active + And the cart rule is a voucher rule with code "FreeProduct123" + And the cart rule has a action gift-product with product "Jacket" + And I add the product "Shoe" to my cart + And I apply the voucher code "FreeProduct123" to my cart + Then the cart discount should be "0" including tax + And the cart total should be "10000" including tax + And the product "Jacket" should be in my cart as gift + And the product "Jacket" in my cart should have unit "Pieces" + + Scenario: Add a new gift rule with a free product with no unit + Given adding a cart price rule named "gift" + And the cart rule is active + And the cart rule is a voucher rule with code "FreeProduct123" + And the cart rule has a action gift-product with product "Shoe" + And I add the product "Jacket" to my cart + And I apply the voucher code "FreeProduct123" to my cart + Then the cart discount should be "0" including tax + And the cart total should be "10000" including tax + And the product "Shoe" should be in my cart as gift + And the product "Shoe" in my cart should have no unit diff --git a/features/domain/cart/rules/guest_condition.feature b/features/domain/cart/rules/guest_condition.feature new file mode 100644 index 0000000000..8a10a46b60 --- /dev/null +++ b/features/domain/cart/rules/guest_condition.feature @@ -0,0 +1,27 @@ +@domain @cart +Feature: Adding a new cart rule + In order to give the customer discounts + based on the cart, we add a new rule + with a guest condition + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has a customer "some-customer@something.com" + And the site has a guest "some-guest@something.com" + And adding a cart price rule named "guest" + And the cart rule is active + And the cart rule is not a voucher rule + And the cart rule has a condition guest + + Scenario: Add a new guest cart rule for a guest customer which is valid + Given the cart belongs to guest "some-guest@something.com" + Then the cart rule should be valid for my cart + + Scenario: Add a new guest cart rule for a cart without a customer which is valid + Then the cart rule should be valid for my cart + + Scenario: Add a new guest cart rule for a customer which is invalid + Given the cart belongs to customer "some-customer@something.com" + Then the cart rule should be invalid for my cart \ No newline at end of file diff --git a/features/domain/order/create_order_edit.feature b/features/domain/order/create_order_edit.feature new file mode 100644 index 0000000000..1a0f38ec99 --- /dev/null +++ b/features/domain/order/create_order_edit.feature @@ -0,0 +1,34 @@ +@domain @order +Feature: Create a new order and later edit the quantity + + Background: + Given the site operates on a store in "Austria" + And the site has a country "Germany" with currency "EUR" + And the country "Germany" is active + And the site operates on locale "en" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And the site has a product "T-Shirt" priced at 2000 + And the product has the tax rule group "AT" + And the site has a customer "some-customer@something.com" + And the customer "some-customer@something.com" has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the cart belongs to customer "some-customer@something.com" + + Scenario: Create a new order and add a product + Given I add the product "T-Shirt" to my cart + And I add the product "T-Shirt" to my cart + And the cart ships to customer "some-customer@something.com" address with postcode "4600" + And the cart invoices to customer "some-customer@something.com" address with postcode "4600" + And I create an order from my cart + Then the order total should be "4800" including tax + And the order total should be "4000" excluding tax + And the order total tax should be "800" + Then I change the quantity of product "T-Shirt" to 3 + Then the order total should be "7200" including tax + And the order total should be "6000" excluding tax + And the order total tax should be "1200" + Then I change the quantity of product "T-Shirt" to 5 + Then the order total should be "12000" including tax + And the order total should be "10000" excluding tax + And the order total tax should be "2000" diff --git a/features/domain/order/create_order_immutable.feature b/features/domain/order/create_order_immutable.feature new file mode 100644 index 0000000000..5586667858 --- /dev/null +++ b/features/domain/order/create_order_immutable.feature @@ -0,0 +1,24 @@ +@domain @order +Feature: Create a new order and it should be immutable + + Background: + Given the site operates on a store in "Austria" + And the site has a country "Germany" with currency "EUR" + And the country "Germany" is active + And the site operates on locale "en" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And the site has a product "T-Shirt" priced at 2000 + And the product has the tax rule group "AT" + And the site has a customer "some-customer@something.com" + And the customer "some-customer@something.com" has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the customer "some-customer@something.com" has an address with country "Germany", "04600", "Wels", "Freiung", "9-11/N3" + And the cart belongs to customer "some-customer@something.com" + + Scenario: Create a new order and add a product + Given I add the product "T-Shirt" to my cart + And the cart ships to customer "some-customer@something.com" address with postcode "4600" + And the cart invoices to customer "some-customer@something.com" address with postcode "4600" + And I create an order from my cart + Then the order should be immutable diff --git a/features/domain/payment_provider/payment_provider_rules/guest_condition.feature b/features/domain/payment_provider/payment_provider_rules/guest_condition.feature new file mode 100644 index 0000000000..4a62c1c13b --- /dev/null +++ b/features/domain/payment_provider/payment_provider_rules/guest_condition.feature @@ -0,0 +1,31 @@ +@domain @payment_provider +Feature: Adding a new Payment Provider Rule + In order to calculate payment provider + I'll create a new payment-provider-rule + with a guest condition + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And There is a payment provider "Bankwire" using factory "Bankwire" + And the site has a product "Shoe" priced at 10000 + And adding a payment-provider-rule named "guest" + And the payment-provider-rule is active + And the payment-provider-rule has a condition guest + And the site has a customer "some-customer@something.com" + And the site has a guest "some-guest@something.com" + + Scenario: Add a new guest payment-provider-rule for a guest customer which is valid + Given I am guest "some-guest@something.com" + And I add the product "Shoe" to my cart + Then the payment-provider-rule should be valid for my cart with payment provider "Bankwire" + + Scenario: Add a new guest payment-provider-rule for a cart without a customer which is valid + Given I add the product "Shoe" to my cart + Then the payment-provider-rule should be valid for my cart with payment provider "Bankwire" + + Scenario: Add a new guest payment-provider-rule for a customer which is invalid + Given I am customer "some-customer@something.com" + And I add the product "Shoe" to my cart + Then the payment-provider-rule should be invalid for my cart with payment provider "Bankwire" diff --git a/features/domain/product/price_rules/guest_condition.feature b/features/domain/product/price_rules/guest_condition.feature new file mode 100644 index 0000000000..58c97db724 --- /dev/null +++ b/features/domain/product/price_rules/guest_condition.feature @@ -0,0 +1,27 @@ +@domain @product +Feature: Adding a new Product + In order to extend my catalog + the catalog has a price-rule for a guest + I want to create a new product + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has a product "Shoe" priced at 100 + And adding a product price rule named "guest" + And the price rule is active + And the price rule has a condition guest + And the site has a customer "some-customer@something.com" + And the site has a guest "some-guest@something.com" + + Scenario: Add a new guest product price rule for a guest customer which is valid + Given I am guest "some-guest@something.com" + Then the price rule "guest" for product "Shoe" should be valid + + Scenario: Add a new guest product price rule for a cart without a customer which is valid + Then the price rule "guest" for product "Shoe" should be valid + + Scenario: Add a new guest product price rule for a customer which is invalid + Given I am customer "some-customer@something.com" + Then the price rule "guest" for product "Shoe" should be invalid \ No newline at end of file diff --git a/features/domain/product/price_rules/nested_not_condition.feature b/features/domain/product/price_rules/nested_not_condition.feature new file mode 100644 index 0000000000..a1de4c5b59 --- /dev/null +++ b/features/domain/product/price_rules/nested_not_condition.feature @@ -0,0 +1,16 @@ +@domain @product +Feature: Adding a new Product + In order to extend my catalog + The product has a specific-price-rule with nested conditions + + Background: + Given the site operates on a store in "Austria" + And the site has a product "Shoe" priced at 100 + And the site has a product "Shirt" priced at 200 + + Scenario: Add a new nested not product specific price rule with not product shoe + Given adding a product price rule named "not-nested-condition" + And the price rule is active + And the price rule has a condition nested with operator "not" with product "Shirt" + Then the price rule should be valid for product "Shoe" + Then the price rule should be invalid for product "Shirt" diff --git a/features/domain/product/specific_price_rules/guest_condition.feature b/features/domain/product/specific_price_rules/guest_condition.feature new file mode 100644 index 0000000000..88670c6c0b --- /dev/null +++ b/features/domain/product/specific_price_rules/guest_condition.feature @@ -0,0 +1,27 @@ +@domain @product +Feature: Adding a new Product + In order to extend my catalog + the catalog has a specific-price-rule for a guest + I want to create a new product + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has a product "Shoe" priced at 100 + And adding a product specific price rule to product "Shoe" named "guest" + And the specific price rule is active + And the specific price rule has a condition guest + And the site has a customer "some-customer@something.com" + And the site has a guest "some-guest@something.com" + + Scenario: Add a new guest product price rule for a guest customer which is valid + Given I am guest "some-guest@something.com" + Then the specific price rule "guest" for product "Shoe" should be valid + + Scenario: Add a new guest product price rule for a cart without a customer which is valid + Then the specific price rule "guest" for product "Shoe" should be valid + + Scenario: Add a new guest product price rule for a customer which is invalid + Given I am customer "some-customer@something.com" + Then the specific price rule "guest" for product "Shoe" should be invalid \ No newline at end of file diff --git a/features/domain/shipping/shipping_rules/guest_condition.feature b/features/domain/shipping/shipping_rules/guest_condition.feature new file mode 100644 index 0000000000..bdf7306275 --- /dev/null +++ b/features/domain/shipping/shipping_rules/guest_condition.feature @@ -0,0 +1,35 @@ +@domain @shipping +Feature: Adding a new Shipping Rule + In order to calculate shipping + I'll create a new shipping rule + with a guest condition + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And the site has a product "Shoe" priced at 10000 + And the product has the tax rule group "AT" + And the site has a carrier "Post" + And I am in country "Austria" + And adding a shipping rule named "guest" + And the shipping rule is active + And the shipping rule has a condition guest + And the site has a customer "some-customer@something.com" + And the site has a guest "some-guest@something.com" + + Scenario: Add a new guest shipping rule for a guest customer which is valid + Given I am guest "some-guest@something.com" + And I add the product "Shoe" to my cart + Then the shipping rule should be valid for my cart with carrier "Post" + + Scenario: Add a new guest shipping rule for a cart without a customer which is valid + Given I add the product "Shoe" to my cart + Then the shipping rule should be valid for my cart with carrier "Post" + + Scenario: Add a new guest shipping rule for a customer which is invalid + Given I am customer "some-customer@something.com" + And I add the product "Shoe" to my cart + Then the shipping rule should be invalid for my cart with carrier "Post" \ No newline at end of file diff --git a/features/ui/frontend/cart/voucher_code_not_combinable_with_cart_price_rule.feature b/features/ui/frontend/cart/voucher_code_not_combinable_with_cart_price_rule.feature new file mode 100644 index 0000000000..e17437efc3 --- /dev/null +++ b/features/ui/frontend/cart/voucher_code_not_combinable_with_cart_price_rule.feature @@ -0,0 +1,35 @@ +@ui @cart +Feature: Getting an cart-price-rule with a voucher code + + Background: + Given the site operates on a store in "Austria" + And the store "Austria" is the default store + And the site has a product "TShirt" priced at 10000 + And the product is active and published and available for store "Austria" + And adding a cart price rule named "Combinable" + And the cart rule has a action discount with 50 in currency "EUR" off applied on total + And the cart rule is active + And the cart rule is a voucher rule with code "COMBINABLE" + And adding a cart price rule named "Not Combinable" + And the cart rule has a action discount with 50 in currency "EUR" off applied on total + And the cart rule is active + And the cart rule is a voucher rule with code "NOT_COMBINABLE" + And adding a product price rule named "not-combinable-with-cart-price-rule" + And the price rule has a action discount-percent with 10% discount + And the price rule has a condition not combinable with cart rule "Not Combinable" + And the price rule is active + + Scenario: Applying a voucher rule where the product price rule is combinable + Given I add this product to the cart + And I apply the voucher code "COMBINABLE" + Then I should be notified that the voucher has been applied + And I should see "TShirt" with unit price "€90.00" in my cart + And my cart's total should be "€40.00" + + Scenario: Applying a voucher rule where the product price rule is not combinable + Given I add this product to the cart + And I apply the voucher code "NOT_COMBINABLE" + Then I should be notified that the voucher has been applied + And I should see "TShirt" with unit price "€100.00" in my cart + And my cart's total should be "€50.00" + diff --git a/features/ui/frontend/checkout/checkout_with_cart_price_rule_gift_item_that_is_stock_tracked.feature b/features/ui/frontend/checkout/checkout_with_cart_price_rule_gift_item_that_is_stock_tracked.feature new file mode 100644 index 0000000000..b21ce10c95 --- /dev/null +++ b/features/ui/frontend/checkout/checkout_with_cart_price_rule_gift_item_that_is_stock_tracked.feature @@ -0,0 +1,38 @@ +@ui @checkout +Feature: Ability to complete the checkout + with a cart price rule that adds a gift item + that is stock tracked and has stock on hand + + Background: + Given the site operates on a store in "Austria" + And the store "Austria" is the default store + And the site has a product "TShirt" priced at 10000 + And the product is active and published and available for store "Austria" + And the site has a product "Shoe" priced at 10000 + And the product is active and published and available for store "Austria" + And the product is stock tracked + And the product has 10 on hand + And I am a logged in customer + And the customer has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the site has a carrier "Post" and ships for 10 in currency "EUR" + And the site has a payment provider "Bankwire" using factory "offline" + And adding a cart price rule named "Gift Produt" + And the cart rule is active + And the cart rule is not a voucher rule + And the cart rule has a action gift-product with product "Shoe" + Then I add this product to the cart + + Scenario: I proceed to the checkout + Given I am at the address checkout step + Then I should be on the address checkout step + And I use the last address as invoice address + And I submit the address step + Then I should be on the shipping checkout step + When I submit the shipping step + Then I should be on the payment checkout step + And I select the payment provider "Bankwire" + When I submit the payment step + Then I should be on the summary checkout step + When I accept the checkout terms of service + And I submit the order + Then I should be on the thank you page diff --git a/features/ui/frontend/checkout/checkout_with_cart_price_rule_surcharge.feature b/features/ui/frontend/checkout/checkout_with_cart_price_rule_surcharge.feature new file mode 100644 index 0000000000..4bd26ad4fa --- /dev/null +++ b/features/ui/frontend/checkout/checkout_with_cart_price_rule_surcharge.feature @@ -0,0 +1,33 @@ +@ui @checkout +Feature: Ability to complete the checkout + + Background: + Given the site operates on a store in "Austria" + And the store "Austria" is the default store + And the site has a product "TShirt" priced at 10000 + And the product is active and published and available for store "Austria" + And I am a logged in customer + And the customer has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the site has a carrier "Post" and ships for 10 in currency "EUR" + And the site has a payment provider "Bankwire" using factory "offline" + And adding a cart price rule named "Surcharge" + And the cart rule is active + And the cart rule is not a voucher rule + And the cart rule has a action surcharge with 100 in currency "EUR" off + Then I add this product to the cart + + Scenario: I proceed to the checkout + Given I am at the address checkout step + Then I should be on the address checkout step + And I use the last address as invoice address + And I submit the address step + Then I should be on the shipping checkout step + When I submit the shipping step + Then I should be on the payment checkout step + And I select the payment provider "Bankwire" + When I submit the payment step + Then I should be on the summary checkout step + When I accept the checkout terms of service + And I submit the order + Then I should be on the thank you page + And The order total should be "€210.00" diff --git a/features/ui/frontend/checkout/checkout_with_stock_tracked_product.feature b/features/ui/frontend/checkout/checkout_with_stock_tracked_product.feature new file mode 100644 index 0000000000..3002af6586 --- /dev/null +++ b/features/ui/frontend/checkout/checkout_with_stock_tracked_product.feature @@ -0,0 +1,34 @@ +@ui @checkout +Feature: Ability to complete the checkout + + Background: + Given the site operates on a store in "Austria" + And the store "Austria" is the default store + And the site has a product "TShirt" priced at 10000 + And the product is active and published and available for store "Austria" + And the product is stock tracked + And the product has 5 on hand + And I am a logged in customer + And the customer has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the site has a carrier "Post" and ships for 10 in currency "EUR" + And the site has a payment provider "Bankwire" using factory "offline" + And adding a cart price rule named "Free Shipping" + And the cart rule is active + And the cart rule is not a voucher rule + And the cart rule has a action free-shipping + Then I add this product to the cart + + Scenario: I proceed to the checkout + Given I am at the address checkout step + Then I should be on the address checkout step + And I use the last address as invoice address + And I submit the address step + Then I should be on the shipping checkout step + When I submit the shipping step + Then I should be on the payment checkout step + And I select the payment provider "Bankwire" + When I submit the payment step + Then I should be on the summary checkout step + When I accept the checkout terms of service + And I submit the order + Then I should be on the thank you page diff --git a/features/ui/frontend/checkout/prevent_repaying_completed_checkouts.feature b/features/ui/frontend/checkout/prevent_repaying_completed_checkouts.feature new file mode 100644 index 0000000000..e9aa688a62 --- /dev/null +++ b/features/ui/frontend/checkout/prevent_repaying_completed_checkouts.feature @@ -0,0 +1,32 @@ +@ui @checkout +Feature: Use order tokens to capture payments + + # Checkout completed successfully + Background: + Given the site operates on a store in "Austria" + And the store "Austria" is the default store + And the site has a product "TShirt" priced at 10000 + And the product is active and published and available for store "Austria" + And I am a logged in customer + And the customer has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the site has a carrier "Post" and ships for 10 in currency "EUR" + And the site has a payment provider "Bankwire" using factory "offline" + And I add this product to the cart + And I am at the address checkout step + And I should be on the address checkout step + And I use the last address as invoice address + And I submit the address step + And I should be on the shipping checkout step + And I submit the shipping step + And I should be on the payment checkout step + And I select the payment provider "Bankwire" + And I submit the payment step + And I should be on the summary checkout step + And I accept the checkout terms of service + And I submit the order + And I should be on the thank you page + + Scenario: Re-visiting pay URL should work with order token + Given I should be on the thank you page + Then I re-capture payment for same order + And I should be on the thank you page diff --git a/features/ui/frontend/checkout/restore_old_cart_after_checkout.feature b/features/ui/frontend/checkout/restore_old_cart_after_checkout.feature new file mode 100644 index 0000000000..22226118c6 --- /dev/null +++ b/features/ui/frontend/checkout/restore_old_cart_after_checkout.feature @@ -0,0 +1,35 @@ +@ui @checkout +Feature: Ability to restore an old after a successful checkout + + Background: + Given the site operates on a store in "Austria" + And the store "Austria" is the default store + And the site has a product "TShirt" priced at 10000 + And the product is active and published and available for store "Austria" + And the site has a product "Mug" priced at 1000 + And the product is active and published and available for store "Austria" + And I am a logged in customer + And the customer has an address with country "Austria", "4600", "Wels", "Freiung", "9-11/N3" + And the site has a carrier "Post" and ships for 10 in currency "EUR" + And the site has a payment provider "Bankwire" using factory "offline" + Then I add product "TShirt" to the cart + And I log out + Then I add product "Mug" to the cart + Given I want to log in + And I specify the username as "coreshop@pimcore.org" + And I specify the password as "coreshop" + And I log in + Given I see the summary of my cart + Then I should see "Mug" with unit price "€10.00" in my cart + + Scenario: I proceed the checkout and create the Order + Given I am at the address checkout step + And I use the last address as invoice address + And I submit the address step + When I submit the shipping step + And I select the payment provider "Bankwire" + When I submit the payment step + When I accept the checkout terms of service + And I submit the order + Given I see the summary of my cart + Then I should see "TShirt" with unit price "€100.00" in my cart diff --git a/phpstan.neon b/phpstan.neon index 17a2594a42..09adc1f2c3 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -33,6 +33,7 @@ parameters: - '/Method CoreShop\\Bundle\\ResourceBundle\\Routing\\ResourceLoader::getResolver\(\) should return Symfony\\Component\\Config\\Loader\\LoaderResolverInterface but return statement is missing./' - '/PHPDoc type string of property CoreShop\\Bundle\\PayumBundle\\Request\\GetStatus::\$status is not covariant with PHPDoc type int of overridden property Payum\\Core\\Request\\BaseGetStatus::\$status./' - '/Method CoreShop\\Bundle\\ResourceBundle\\Controller\\AdminController::getSubscribedServices\(\) should return non-empty-array but returns array./' + - '/Pimcore\\Model\\DataObject\\ClassDefinition\\DynamicOptionsProvider\\MultiSelectOptionsProviderInterface is marked deprecated/' # Pimcore BC Breaks - '/Class Pimcore\\Bundle\\AdminBundle\\Helper\\GridHelperService not found/' diff --git a/psalm.xml b/psalm.xml index 0d71b7c1a0..39d94e8dec 100644 --- a/psalm.xml +++ b/psalm.xml @@ -25,6 +25,21 @@ + + + + + + + + + + + + + + + @@ -40,7 +55,6 @@ - @@ -63,9 +77,11 @@ - + + + @@ -81,8 +97,21 @@ + + + + + + + + + + + + + @@ -142,6 +171,7 @@ + @@ -149,9 +179,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -182,7 +244,6 @@ - diff --git a/public/index.php b/public/index.php index cce38d2ad9..df7a1f0a86 100644 --- a/public/index.php +++ b/public/index.php @@ -10,27 +10,27 @@ * @license https://www.coreshop.org/license GPLv3 and CCL */ +use Pimcore\Bootstrap; use Pimcore\Tool; use Symfony\Component\HttpFoundation\Request; -include __DIR__ . "/../vendor/autoload.php"; +//use runtime +require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -\Pimcore\Bootstrap::setProjectRoot(); -\Pimcore\Bootstrap::bootstrap(); +Bootstrap::setProjectRoot(); -$request = Request::createFromGlobals(); +return function (Request $request, array $context) { -// set current request as property on tool as there's no -// request stack available yet -Tool::setCurrentRequest($request); + // set current request as property on tool as there's no + // request stack available yet + Tool::setCurrentRequest($request); -/** @var \Pimcore\Kernel $kernel */ -$kernel = \Pimcore\Bootstrap::kernel(); + Bootstrap::bootstrap(); + $kernel = Bootstrap::kernel(); -// reset current request - will be read from request stack from now on -Tool::setCurrentRequest(null); + // reset current request - will be read from request stack from now on + Tool::setCurrentRequest(null); -$response = $kernel->handle($request); -$response->send(); + return $kernel; +}; -$kernel->terminate($request, $response); diff --git a/public/index_test.php b/public/index_test.php index b91511c9a3..6a46a46c89 100644 --- a/public/index_test.php +++ b/public/index_test.php @@ -10,28 +10,29 @@ * @license https://www.coreshop.org/license GPLv3 and CCL */ +use Pimcore\Bootstrap; use Pimcore\Tool; use Symfony\Component\HttpFoundation\Request; -define('PIMCORE_PROJECT_ROOT', __DIR__ . '/..'); $_SERVER['PIMCORE_ENVIRONMENT'] = $_SERVER['APP_ENV'] = $_SERVER['SYMFONY_ENV'] = 'test'; -include __DIR__ . "/../vendor/autoload.php"; -include __DIR__ . "/../behat-bootstrap.php"; +//use runtime +require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -$request = Request::createFromGlobals(); +Bootstrap::setProjectRoot(); -// set current request as property on tool as there's no -// request stack available yet -Tool::setCurrentRequest($request); +return function (Request $request, array $context) { -/** @var \Pimcore\Kernel $kernel */ -$kernel = \Pimcore\Bootstrap::kernel(); + // set current request as property on tool as there's no + // request stack available yet + Tool::setCurrentRequest($request); -// reset current request - will be read from request stack from now on -Tool::setCurrentRequest(null); + Bootstrap::bootstrap(); + $kernel = Bootstrap::kernel(); -$response = $kernel->handle($request); -$response->send(); + // reset current request - will be read from request stack from now on + Tool::setCurrentRequest(null); + + return $kernel; +}; -$kernel->terminate($request, $response); diff --git a/public/index_test_precision.php b/public/index_test_precision.php index f7a7ea3315..62b5c99f93 100644 --- a/public/index_test_precision.php +++ b/public/index_test_precision.php @@ -10,28 +10,30 @@ * @license https://www.coreshop.org/license GPLv3 and CCL */ + +use Pimcore\Bootstrap; use Pimcore\Tool; use Symfony\Component\HttpFoundation\Request; -define('PIMCORE_PROJECT_ROOT', __DIR__ . '/..'); +define('PIMCORE_PROJECT_ROOT', __DIR__.'/..'); $_SERVER['PIMCORE_ENVIRONMENT'] = $_SERVER['APP_ENV'] = $_SERVER['SYMFONY_ENV'] = 'test_precision'; -include __DIR__ . "/../vendor/autoload.php"; -include __DIR__ . "/../behat-bootstrap.php"; +//use runtime +require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; -$request = Request::createFromGlobals(); +Bootstrap::setProjectRoot(); -// set current request as property on tool as there's no -// request stack available yet -Tool::setCurrentRequest($request); +return function (Request $request, array $context) { -/** @var \Pimcore\Kernel $kernel */ -$kernel = \Pimcore\Bootstrap::kernel(); + // set current request as property on tool as there's no + // request stack available yet + Tool::setCurrentRequest($request); -// reset current request - will be read from request stack from now on -Tool::setCurrentRequest(null); + Bootstrap::bootstrap(); + $kernel = Bootstrap::kernel(); -$response = $kernel->handle($request); -$response->send(); + // reset current request - will be read from request stack from now on + Tool::setCurrentRequest(null); -$kernel->terminate($request, $response); + return $kernel; +}; diff --git a/src/CoreShop/Behat/Context/Domain/CacheContext.php b/src/CoreShop/Behat/Context/Domain/CacheContext.php new file mode 100644 index 0000000000..5549f1e4e1 --- /dev/null +++ b/src/CoreShop/Behat/Context/Domain/CacheContext.php @@ -0,0 +1,108 @@ +get() instanceof Concrete); + } + + /** + * @Then /^the (cache item) should have an object-var "([^"]+)" with value "([^"]+)"/ + * @Then /^the (cache item) should have an object-var "([^"]+)" with value of (tax rule group)/ + */ + public function theCacheItemShouldHaveAObjectVarWithValue(CacheItem $cacheItem, string $property, mixed $value): void + { + Assert::true($cacheItem->get() instanceof Concrete); + /** + * @var Concrete $item + */ + $item = $cacheItem->get(); + $objectValue = $item->getObjectVar($property); + + if ($value instanceof ResourceInterface) { + $value = $value->getId(); + } + + Assert::same((string) $objectValue, (string) $value); + } + + /** + * @Then /^the (cache object) should have an object-var "([^"]+)" of type ResourceInterface/ + */ + public function theCacheItemShouldHaveAObjectVarOfTypeResource(Concrete $cacheObject, string $property): void + { + $objectValue = $cacheObject->getObjectVar($property); + + Assert::isInstanceOf($objectValue, ResourceInterface::class); + } + + /** + * @Then /^the (cache item) serialized should have a property "([^"]+)" with value "([^"]+)"/ + * @Then /^the (cache item) serialized should have a property "([^"]+)" with value of (tax rule group)/ + */ + public function theCacheItemSerializedShouldLookLikeTheKnownOne(CacheItem $cacheItem, string $property, mixed $value): void + { + $itemData = $cacheItem->get(); + if (!is_scalar($itemData)) { + $itemData = serialize($itemData); + } + + $serializedNull = unserialize($itemData, ['allowed_classes' => false]); + + $convertToStdClass = static function (\__PHP_Incomplete_Class $object) { + $dump = serialize($object); + $dump = preg_replace('/^O:\d+:"[^"]++"/', 'O:8:"stdClass"', $dump); + $dump = preg_replace_callback( + '/:\d+:"\0.*?\0([^"]+)"/', + static fn ($matches) => ':' . strlen($matches[1]) . ':"' . $matches[1] . '"', + $dump, + ); + + return unserialize($dump); + }; + + $stdClass = $convertToStdClass($serializedNull); + + $cacheValue = $stdClass->{$property}; + + if ($value instanceof ResourceInterface) { + $value = $value->getId(); + } + + Assert::same((string) $cacheValue, (string) $value); + } +} diff --git a/src/CoreShop/Behat/Context/Domain/CartContext.php b/src/CoreShop/Behat/Context/Domain/CartContext.php index 1d7fdedca6..1cc8037b0a 100644 --- a/src/CoreShop/Behat/Context/Domain/CartContext.php +++ b/src/CoreShop/Behat/Context/Domain/CartContext.php @@ -24,6 +24,7 @@ use CoreShop\Component\Core\Model\OrderItemInterface; use CoreShop\Component\Core\Model\ProductInterface; use CoreShop\Component\Order\Context\CartContextInterface; +use CoreShop\Component\Order\Model\AdjustmentInterface; use CoreShop\Component\Product\Model\ProductUnitInterface; use CoreShop\Component\Taxation\Model\TaxItemInterface; use Pimcore\Model\DataObject\Fieldcollection; @@ -399,6 +400,29 @@ public function cartDiscountShouldBeIncludingTax($total): void ); } + /** + * @Then /^the cart item discount should be "([^"]+)" including tax$/ + */ + public function cartItemDiscountShouldBeIncludingTax($total): void + { + $cartItems = $this->cartContext->getCart()->getItems(); + $discounts = 0; + + foreach ($cartItems as $cartItem) { + $discounts += $cartItem->getAdjustmentsTotal(AdjustmentInterface::CART_PRICE_RULE, true); + } + + Assert::eq( + $total, + $discounts, + sprintf( + 'Cart discount is expected to be %s, but it is %s', + $total, + $discounts, + ), + ); + } + /** * @Then /^the cart discount should be "([^"]+)" excluding tax$/ */ @@ -415,6 +439,29 @@ public function cartDiscountShouldBeExcludingTax($total): void ); } + /** + * @Then /^the cart item discount should be "([^"]+)" excluding tax$/ + */ + public function cartItemDiscountShouldBeExcludingTax($total): void + { + $cartItems = $this->cartContext->getCart()->getItems(); + $discounts = 0; + + foreach ($cartItems as $cartItem) { + $discounts += $cartItem->getAdjustmentsTotal(AdjustmentInterface::CART_PRICE_RULE, false); + } + + Assert::eq( + $total, + $discounts, + sprintf( + 'Cart discount is expected to be %s, but it is %s', + $total, + $discounts, + ), + ); + } + /** * @Then /^there should be no product in (my cart)$/ */ @@ -462,6 +509,88 @@ public function theFirstItemInMyCartShouldHaveUnit(OrderInterface $cart, Product ); } + /** + * @Then /^the (product "[^"]+") in (my cart) should have (unit "([^"]+)")$/ + */ + public function theProductInMyCartShouldHaveUnit(ProductInterface $product, OrderInterface $cart, ProductUnitInterface $unit): void + { + /** + * @var OrderItemInterface $cartItem + */ + $cartItem = null; + + foreach ($cart->getItems() as $item) { + if (!$item->getIsGiftItem()) { + continue; + } + + if ($item->getProduct()->getId() === $product->getId()) { + $cartItem = $item; + + break; + } + } + + Assert::notNull( + $cartItem, + sprintf( + 'Product %s is not in the Cart or is not a gift', + $product->getName(), + ), + ); + + Assert::notNull( + $cartItem->getUnitDefinition(), + 'Expected cart item to have a unit-definition, but it did not', + ); + + Assert::eq( + $cartItem->getUnitDefinition()?->getUnit(), + $unit, + sprintf( + 'Expected cart item to have unit %s, but found %s', + $cartItem->getUnitDefinition()?->getUnitName(), + $unit->getName(), + ), + ); + } + + /** + * @Then /^the (product "[^"]+") in (my cart) should have no unit$/ + */ + public function theProductInMyCartShouldHaveNoUnit(ProductInterface $product, OrderInterface $cart): void + { + /** + * @var OrderItemInterface $cartItem + */ + $cartItem = null; + + foreach ($cart->getItems() as $item) { + if (!$item->getIsGiftItem()) { + continue; + } + + if ($item->getProduct()->getId() === $product->getId()) { + $cartItem = $item; + + break; + } + } + + Assert::notNull( + $cartItem, + sprintf( + 'Product %s is not in the Cart or is not a gift', + $product->getName(), + ), + ); + + Assert::null( + $cartItem->getUnitDefinition(), + 'Expected cart item to have not a unit-definition, but it had one', + ); + } + /** * @Then /^the second item in (my cart) should have (unit "([^"]+)")$/ */ diff --git a/src/CoreShop/Behat/Context/Domain/OrderContext.php b/src/CoreShop/Behat/Context/Domain/OrderContext.php index 31ce8a06d3..394bec3bbf 100644 --- a/src/CoreShop/Behat/Context/Domain/OrderContext.php +++ b/src/CoreShop/Behat/Context/Domain/OrderContext.php @@ -113,6 +113,22 @@ public function orderSubtotalShouldBeExcludingTax(OrderInterface $order, $total) ); } + /** + * @Then /^(the order) total tax should be "([^"]+)"$/ + */ + public function orderTotalTaxShouldBe(OrderInterface $order, $total): void + { + Assert::eq( + $total, + $order->getTotalTax(), + sprintf( + 'Order total tax is expected to be %s, but it is %s', + $total, + $order->getTotalTax(), + ), + ); + } + /** * @Then /^(the order) should weigh ([^"]+)kg$/ */ @@ -320,4 +336,22 @@ public function iShouldBeAbleToApplyInvoiceTransition($transition, OrderInterfac Assert::true($workflow->can($order, $transition)); } + + /** + * @Then /^(the order) should be immutable$/ + */ + public function theOrderShouldBeImmutable(OrderInterface $order): void + { + Assert::true( + $order->isImmutable(), + 'Order is mutable, but should be immutable!', + ); + + foreach ($order->getItems() as $item) { + Assert::true( + $item->isImmutable(), + 'Order Item is mutable, but should be immutable!', + ); + } + } } diff --git a/src/CoreShop/Behat/Context/Domain/PaymentProviderContext.php b/src/CoreShop/Behat/Context/Domain/PaymentProviderContext.php index 906487d131..1c2a50877f 100644 --- a/src/CoreShop/Behat/Context/Domain/PaymentProviderContext.php +++ b/src/CoreShop/Behat/Context/Domain/PaymentProviderContext.php @@ -23,7 +23,7 @@ use CoreShop\Component\Core\Model\PaymentProviderInterface; use CoreShop\Component\Core\Repository\PaymentProviderRepositoryInterface; use CoreShop\Component\Order\Cart\CartContextResolverInterface; -use CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculator; +use CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculatorInterface; use CoreShop\Component\Payment\Model\PaymentProviderRuleInterface; use CoreShop\Component\Payment\Validator\PaymentProviderRuleValidator; use CoreShop\Component\Resource\Factory\FactoryInterface; @@ -36,7 +36,7 @@ public function __construct( private PaymentProviderRepositoryInterface $paymentProviderRepository, private RuleValidationProcessorInterface $ruleValidationProcessor, private FactoryInterface $addressFactory, - private PaymentProviderRulePriceCalculator $paymentProviderPriceCalculator, + private PaymentProviderRulePriceCalculatorInterface $paymentProviderPriceCalculator, private PaymentProviderRuleValidator $paymentRuleValidator, private CartContextResolverInterface $cartContextResolver, ) { diff --git a/src/CoreShop/Behat/Context/Setup/CacheContext.php b/src/CoreShop/Behat/Context/Setup/CacheContext.php new file mode 100644 index 0000000000..83ebcdea7b --- /dev/null +++ b/src/CoreShop/Behat/Context/Setup/CacheContext.php @@ -0,0 +1,69 @@ +removeClearedTags(['object_' . $object->getId()]); + Cache::getHandler()->removeClearedTags(['class_' . $object->getClassId()]); + } + + Assert::true(Cache::getHandler()->save($key, $object, ['behat'], null, 0, true)); + + $this->sharedStorage->set('cache_key', $key); + } + + /** + * @Given /^I restore the object from the cache$/ + */ + public function iRestoreTheObjectFromTheCache(): void + { + $cacheItem = Cache::getHandler()->getItem($this->sharedStorage->get('cache_key')); + + Assert::true($cacheItem->isHit()); + + $this->sharedStorage->set('cache_item', $cacheItem); + } + + /** + * @Given /^I restore the object with Pimcore Cache Helper/ + */ + public function iRestoreTheObjectWithPimcoreCacheHelper(): void + { + $obj = Cache::getHandler()->load($this->sharedStorage->get('cache_key')); + $this->sharedStorage->set('cache_object', $obj); + } +} diff --git a/src/CoreShop/Behat/Context/Setup/CartContext.php b/src/CoreShop/Behat/Context/Setup/CartContext.php index bdec13a1f7..a10e1bedfe 100644 --- a/src/CoreShop/Behat/Context/Setup/CartContext.php +++ b/src/CoreShop/Behat/Context/Setup/CartContext.php @@ -152,6 +152,7 @@ public function removeProductFromCart(ProductInterface $product): void /** * @Given /^the cart belongs to (customer "[^"]+")$/ + * @Given /^the cart belongs to (guest "[^"]+")$/ */ public function theCartBelongsToCustomer(CustomerInterface $customer): void { diff --git a/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php b/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php index e31745629e..3c5fd8c322 100644 --- a/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php +++ b/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php @@ -41,6 +41,7 @@ use CoreShop\Bundle\OrderBundle\Form\Type\Rule\Condition\NotCombinableConfigurationType; use CoreShop\Bundle\OrderBundle\Form\Type\Rule\Condition\TimespanConfigurationType; use CoreShop\Bundle\ResourceBundle\Form\Registry\FormTypeRegistryInterface; +use CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType; use CoreShop\Component\Address\Model\ZoneInterface; use CoreShop\Component\Core\Model\CategoryInterface; use CoreShop\Component\Core\Model\CountryInterface; @@ -235,6 +236,17 @@ public function theCartPriceRuleHasACustomerCondition(CartPriceRuleInterface $ru ])); } + /** + * @Given /^the (cart rule "[^"]+") has a condition guest$/ + * @Given /^the (cart rule) has a condition guest$/ + */ + public function theCartPriceRuleHasAGuestCondition(CartPriceRuleInterface $rule): void + { + $this->assertConditionForm(EmptyConfigurationFormType::class, 'guest'); + + $this->addCondition($rule, $this->createConditionWithForm('guest', [])); + } + /** * @Given /^the (cart rule "[^"]+") has a condition timespan which is valid from "([^"]+") to "([^"]+)"$/ * @Given /^the (cart rule) has a condition timespan which is valid from "([^"]+)" to "([^"]+)"$/ diff --git a/src/CoreShop/Behat/Context/Setup/CustomerContext.php b/src/CoreShop/Behat/Context/Setup/CustomerContext.php index e825820621..f0e98f8366 100644 --- a/src/CoreShop/Behat/Context/Setup/CustomerContext.php +++ b/src/CoreShop/Behat/Context/Setup/CustomerContext.php @@ -44,11 +44,21 @@ public function __construct( /** * @Given /^the site has a customer "([^"]+)"$/ */ - public function theSiteHasACustomer(string $email): void + public function theSiteHasACustomer(string $email, bool $isGuest = false): void { - $category = $this->createCustomer($email); + $customer = $this->createCustomer($email, $isGuest); - $this->saveCustomer($category); + $this->saveCustomer($customer); + } + + /** + * @Given /^the site has a guest "([^"]+)"$/ + */ + public function theSiteHasAGuest(string $email): void + { + $customer = $this->createCustomer($email, true); + + $this->saveCustomer($customer); } /** @@ -99,6 +109,14 @@ public function iAmCustomer(CustomerInterface $customer): void $this->fixedCustomerContext->setCustomer($customer); } + /** + * @Given /^I am (guest "[^"]+")$/ + */ + public function iAmGuest(CustomerInterface $customer): void + { + $this->fixedCustomerContext->setCustomer($customer); + } + /** * @Given /^the (customer "[^"]+") has an address with (country "[^"]+"), "([^"]+)", "([^"]+)", "([^"]+)", "([^"]+)"$/ * @Given /^the (customer) has an address with (country "[^"]+"), "([^"]+)", "([^"]+)", "([^"]+)", "([^"]+)"$/ @@ -167,7 +185,7 @@ public function theCustomersAddress( return $found; } - private function createCustomer(string $email): CustomerInterface + private function createCustomer(string $email, bool $isGuest = false): CustomerInterface { /** @var CustomerInterface $customer */ $customer = $this->customerFactory->createNew(); @@ -181,22 +199,24 @@ private function createCustomer(string $email): CustomerInterface $customer->setFirstname($firstname); $customer->setLastname($lastname); - /** - * @var UserInterface $user - */ - $user = $this->userFactory->createNew(); - $user->setKey(File::getValidFilename($email)); - $user->setParent($customer); - $user->setPublished(true); - $user->setLoginIdentifier($email); - $user->setCustomer($customer); + if (!$isGuest) { + /** + * @var UserInterface $user + */ + $user = $this->userFactory->createNew(); + $user->setKey(File::getValidFilename($email)); + $user->setParent($customer); + $user->setPublished(true); + $user->setLoginIdentifier($email); + $user->setCustomer($customer); - $customer->setUser($user); + $customer->setUser($user); + } return $customer; } - private function saveCustomer(CustomerInterface $customer): void + private function saveCustomer(CustomerInterface $customer, $isGuest = false): void { $user = $customer->getUser(); $customer->setUser(null); diff --git a/src/CoreShop/Behat/Context/Setup/FilterContext.php b/src/CoreShop/Behat/Context/Setup/FilterContext.php index 963bcd2c37..234df1eb86 100644 --- a/src/CoreShop/Behat/Context/Setup/FilterContext.php +++ b/src/CoreShop/Behat/Context/Setup/FilterContext.php @@ -110,7 +110,7 @@ public function theFilterHasNameSelect(FilterInterface $filter, string $label, s $condition->setLabel($label); $filter->setOrderDirection('asc'); - $filter->setOrderKey('id'); + $filter->setOrderKey('o_id'); $condition->setConfiguration([ 'field' => 'internalName', diff --git a/src/CoreShop/Behat/Context/Setup/PaymentContext.php b/src/CoreShop/Behat/Context/Setup/PaymentContext.php index 9aab435014..fe41c2e390 100644 --- a/src/CoreShop/Behat/Context/Setup/PaymentContext.php +++ b/src/CoreShop/Behat/Context/Setup/PaymentContext.php @@ -39,6 +39,7 @@ use CoreShop\Bundle\PaymentBundle\Form\Type\Rule\Action\DiscountPercentActionConfigurationType; use CoreShop\Bundle\PaymentBundle\Form\Type\Rule\Condition\AmountConfigurationType; use CoreShop\Bundle\ResourceBundle\Form\Registry\FormTypeRegistryInterface; +use CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType; use CoreShop\Component\Address\Model\ZoneInterface; use CoreShop\Component\Core\Model\CategoryInterface; use CoreShop\Component\Core\Model\CountryInterface; @@ -458,6 +459,17 @@ public function thePaymentProviderRuleHasACustomerGroupsCondition(PaymentProvide ])); } + /** + * @Given /^the (payment-provider-rule "[^"]+") has a condition guest$/ + * @Given /^the (payment-provider-rule) has a condition guest$/ + */ + public function thePaymentProviderRuleHasAGuestCondition(PaymentProviderRuleInterface $rule): void + { + $this->assertConditionForm(EmptyConfigurationFormType::class, 'guest'); + + $this->addCondition($rule, $this->createConditionWithForm('guest', [])); + } + /** * @Given /^the (payment-provider-rule "[^"]+") has a condition zones with (zone "[^"]+")$/ * @Given /^the (payment-provider-rule) has a condition zones with (zone "[^"]+")$/ diff --git a/src/CoreShop/Behat/Context/Setup/ProductPriceRuleContext.php b/src/CoreShop/Behat/Context/Setup/ProductPriceRuleContext.php index deead75b88..ea9f7b85af 100644 --- a/src/CoreShop/Behat/Context/Setup/ProductPriceRuleContext.php +++ b/src/CoreShop/Behat/Context/Setup/ProductPriceRuleContext.php @@ -29,13 +29,16 @@ use CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\ProductsConfigurationType; use CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\StoresConfigurationType; use CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\ZonesConfigurationType; +use CoreShop\Bundle\OrderBundle\Form\Type\Rule\Condition\NotCombinableConfigurationType; use CoreShop\Bundle\ProductBundle\Form\Type\ProductPriceRuleActionType; use CoreShop\Bundle\ProductBundle\Form\Type\ProductPriceRuleConditionType; use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Action\DiscountAmountConfigurationType; use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Action\DiscountPercentConfigurationType; use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Action\PriceConfigurationType; +use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Condition\ProductPriceNestedConfigurationType; use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Condition\TimespanConfigurationType; use CoreShop\Bundle\ResourceBundle\Form\Registry\FormTypeRegistryInterface; +use CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType; use CoreShop\Component\Address\Model\ZoneInterface; use CoreShop\Component\Core\Model\CategoryInterface; use CoreShop\Component\Core\Model\CountryInterface; @@ -44,6 +47,7 @@ use CoreShop\Component\Core\Model\ProductInterface; use CoreShop\Component\Core\Model\StoreInterface; use CoreShop\Component\Customer\Model\CustomerGroupInterface; +use CoreShop\Component\Order\Model\CartPriceRuleInterface; use CoreShop\Component\Product\Model\ProductPriceRuleInterface; use CoreShop\Component\Resource\Factory\FactoryInterface; use CoreShop\Component\Rule\Model\ActionInterface; @@ -177,6 +181,17 @@ public function theProductPriceRuleHasACustomerCondition( ])); } + /** + * @Given /^the (price rule "[^"]+") has a condition guest$/ + * @Given /^the (price rule) has a condition guest$/ + */ + public function theProductPriceRuleHasAGuestCondition(ProductPriceRuleInterface $rule): void + { + $this->assertConditionForm(EmptyConfigurationFormType::class, 'guest'); + + $this->addCondition($rule, $this->createConditionWithForm('guest', [])); + } + /** * @Given /^the (price rule "[^"]+") has a condition timespan which is valid from "([^"]+") to "([^"]+)"$/ * @Given /^the (price rule) has a condition timespan which is valid from "([^"]+)" to "([^"]+)"$/ @@ -421,6 +436,52 @@ public function theProductPriceRuleHasAQuantityCondition( $this->addCondition($rule, $this->createConditionWithForm('quantity', $configuration)); } + /** + * @Given /^the (price rule "[^"]+") has a condition nested with operator "([^"]+)" with (product "[^"]+")$/ + * @Given /^the (price rule) has a condition nested with operator "([^"]+)" with (product "[^"]+")$/ + */ + public function theProductsPriceRuleHasANestedConditionWithProduct(ProductPriceRuleInterface $rule, $operator, ProductInterface $product): void + { + $this->assertConditionForm(ProductPriceNestedConfigurationType::class, 'nested'); + + $this->addCondition($rule, $this->createConditionWithForm('nested', [ + 'operator' => $operator, + 'conditions' => [ + [ + 'type' => 'products', + 'configuration' => [ + 'products' => [ + $product->getId(), + ], + ], + ], + ], + ])); + } + + /** + * @Given /^the (price rule "[^"]+") has a condition not combinable with (cart rule "[^"]+")$/ + * @Given /^the (price rule) has a condition not combinable with (cart rule "[^"]+")$/ + * @Given /^the (price rule) has a condition not combinable with (cart rule "[^"]+") and (cart rule "[^"]+")$/ + * @Given /^the (price rule "[^"]+") has a condition not combinable with (cart rule "[^"]+") and (cart rule "[^"]+")$/ + */ + public function theCartPriceRuleHasANotCombinableCondition(ProductPriceRuleInterface $rule, CartPriceRuleInterface $notCombinable, CartPriceRuleInterface $notCombinable2 = null): void + { + $this->assertConditionForm(NotCombinableConfigurationType::class, 'not_combinable_with_cart_price_voucher_rule'); + + $configuration = [ + 'price_rules' => [ + $notCombinable->getId(), + ], + ]; + + if (null !== $notCombinable2) { + $configuration['price_rules'][] = $notCombinable2->getId(); + } + + $this->addCondition($rule, $this->createConditionWithForm('not_combinable_with_cart_price_voucher_rule', $configuration)); + } + private function addCondition(ProductPriceRuleInterface $rule, ConditionInterface $condition): void { $rule->addCondition($condition); diff --git a/src/CoreShop/Behat/Context/Setup/ProductSpecificPriceRuleContext.php b/src/CoreShop/Behat/Context/Setup/ProductSpecificPriceRuleContext.php index 492b20f699..97ad22b1d5 100644 --- a/src/CoreShop/Behat/Context/Setup/ProductSpecificPriceRuleContext.php +++ b/src/CoreShop/Behat/Context/Setup/ProductSpecificPriceRuleContext.php @@ -34,6 +34,7 @@ use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Condition\ProductSpecificPriceNestedConfigurationType; use CoreShop\Bundle\ProductBundle\Form\Type\Rule\Condition\TimespanConfigurationType; use CoreShop\Bundle\ResourceBundle\Form\Registry\FormTypeRegistryInterface; +use CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType; use CoreShop\Component\Address\Model\ZoneInterface; use CoreShop\Component\Core\Model\CountryInterface; use CoreShop\Component\Core\Model\CurrencyInterface; @@ -136,6 +137,17 @@ public function theProductsSpecificPriceRuleHasACustomerCondition(ProductSpecifi ])); } + /** + * @Given /^the (specific price rule "[^"]+") has a condition guest$/ + * @Given /^the (specific price rule) has a condition guest$/ + */ + public function theProductsSpecificPriceRuleHasAGuestCondition(ProductSpecificPriceRuleInterface $rule): void + { + $this->assertConditionForm(EmptyConfigurationFormType::class, 'guest'); + + $this->addCondition($rule, $this->createConditionWithForm('guest', [])); + } + /** * @Given /^the (specific price rule "[^"]+") has a condition timespan which is valid from "([^"]+") to "([^"]+)"$/ * @Given /^the (specific price rule) has a condition timespan which is valid from "([^"]+)" to "([^"]+)"$/ diff --git a/src/CoreShop/Behat/Context/Setup/ShippingContext.php b/src/CoreShop/Behat/Context/Setup/ShippingContext.php index f9a76509aa..bcdf749770 100644 --- a/src/CoreShop/Behat/Context/Setup/ShippingContext.php +++ b/src/CoreShop/Behat/Context/Setup/ShippingContext.php @@ -32,6 +32,7 @@ use CoreShop\Bundle\CoreBundle\Form\Type\Shipping\Rule\Action\DiscountAmountActionConfigurationType; use CoreShop\Bundle\CoreBundle\Form\Type\Shipping\Rule\Action\PriceActionConfigurationType; use CoreShop\Bundle\ResourceBundle\Form\Registry\FormTypeRegistryInterface; +use CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType; use CoreShop\Bundle\ShippingBundle\Form\Type\Rule\Action\AdditionPercentActionConfigurationType; use CoreShop\Bundle\ShippingBundle\Form\Type\Rule\Action\DiscountPercentActionConfigurationType; use CoreShop\Bundle\ShippingBundle\Form\Type\Rule\Condition\AmountConfigurationType; @@ -471,6 +472,17 @@ public function theShippingRuleHasACustomerGroupsCondition(ShippingRuleInterface ])); } + /** + * @Given /^the (shipping rule "[^"]+") has a condition guest$/ + * @Given /^the (shipping rule) has a condition guest$/ + */ + public function theShippingRuleHasAGuestCondition(ShippingRuleInterface $rule): void + { + $this->assertConditionForm(EmptyConfigurationFormType::class, 'guest'); + + $this->addCondition($rule, $this->createConditionWithForm('guest', [])); + } + /** * @Given /^the (shipping rule "[^"]+") has a condition zones with (zone "[^"]+")$/ * @Given /^the (shipping rule) has a condition zones with (zone "[^"]+")$/ diff --git a/src/CoreShop/Behat/Context/Setup/StoreContext.php b/src/CoreShop/Behat/Context/Setup/StoreContext.php index cf780f6747..ce3db89df3 100644 --- a/src/CoreShop/Behat/Context/Setup/StoreContext.php +++ b/src/CoreShop/Behat/Context/Setup/StoreContext.php @@ -114,6 +114,7 @@ private function createStore( CurrencyInterface $currency = null, CountryInterface $country = null, $grossValues = false, + $defaultStore = false, ): StoreInterface { /** * @var StoreInterface $store diff --git a/src/CoreShop/Behat/Context/Transform/CacheContext.php b/src/CoreShop/Behat/Context/Transform/CacheContext.php new file mode 100644 index 0000000000..b5392f365e --- /dev/null +++ b/src/CoreShop/Behat/Context/Transform/CacheContext.php @@ -0,0 +1,55 @@ +getItem($key); + } + + /** + * @Transform /^cache item$/ + */ + public function cacheItem(): mixed + { + return $this->sharedStorage->get('cache_item'); + } + + /** + * @Transform /^cache object$/ + */ + public function cacheObject(): mixed + { + return $this->sharedStorage->get('cache_object'); + } +} diff --git a/src/CoreShop/Behat/Context/Transform/CustomerContext.php b/src/CoreShop/Behat/Context/Transform/CustomerContext.php index 3ebe61e098..af1ef25542 100644 --- a/src/CoreShop/Behat/Context/Transform/CustomerContext.php +++ b/src/CoreShop/Behat/Context/Transform/CustomerContext.php @@ -45,6 +45,18 @@ public function getCustomerByEmail($email): CustomerInterface return $customer; } + /** + * @Transform /^guest "([^"]+)"$/ + */ + public function getGuestByEmail($email): CustomerInterface + { + $customer = $this->customerRepository->findGuestByEmail($email); + + Assert::isInstanceOf($customer, CustomerInterface::class); + + return $customer; + } + /** * @Transform /^customer$/ */ diff --git a/src/CoreShop/Behat/Context/Ui/Frontend/CheckoutContext.php b/src/CoreShop/Behat/Context/Ui/Frontend/CheckoutContext.php index 79c4679f6e..5472352183 100644 --- a/src/CoreShop/Behat/Context/Ui/Frontend/CheckoutContext.php +++ b/src/CoreShop/Behat/Context/Ui/Frontend/CheckoutContext.php @@ -215,6 +215,22 @@ public function IShouldBeOnTheThankYouPage(): void $this->thankYouPage->verify(['token' => $this->thankYouPage->getToken()]); } + /** + * @When The order total should be :total + */ + public function theOrderTotalShouldBe(string $orderTotal): void + { + Assert::same($this->thankYouPage->getOrderTotal(), $orderTotal); + } + + /** + * @When I re-capture payment for same order + */ + public function IRecapturePaymentForSameOrder(): void + { + $this->thankYouPage->recapturePaymentForThisOrder(); + } + /** * @Given I specify the guest checkout firstname :firstname */ diff --git a/src/CoreShop/Behat/Page/Frontend/Checkout/AddressPage.php b/src/CoreShop/Behat/Page/Frontend/Checkout/AddressPage.php index 5a3a255b4b..d05cd19739 100644 --- a/src/CoreShop/Behat/Page/Frontend/Checkout/AddressPage.php +++ b/src/CoreShop/Behat/Page/Frontend/Checkout/AddressPage.php @@ -35,12 +35,12 @@ public function chooseDifferentShippingAddress(): void public function useShippingAddress(AddressInterface $shippingAddress): void { - $this->getElement('shipping_address')->selectOption($shippingAddress->getId()); + $this->getElement('shipping_address')->selectOption((string) $shippingAddress->getId()); } public function useInvoiceAddress(AddressInterface $invoiceAddress): void { - $this->getElement('invoice_address')->selectOption($invoiceAddress->getId()); + $this->getElement('invoice_address')->selectOption((string) $invoiceAddress->getId()); } public function shippingAddressVisible(): bool diff --git a/src/CoreShop/Behat/Page/Frontend/Checkout/PaymentPage.php b/src/CoreShop/Behat/Page/Frontend/Checkout/PaymentPage.php index 34e169cf42..2f5f282d0e 100644 --- a/src/CoreShop/Behat/Page/Frontend/Checkout/PaymentPage.php +++ b/src/CoreShop/Behat/Page/Frontend/Checkout/PaymentPage.php @@ -30,7 +30,7 @@ public function getRouteName(): string public function selectPaymentProvider(PaymentProviderInterface $paymentProvider): void { - $this->getElement('payment_provider')->selectOption($paymentProvider->getId()); + $this->getElement('payment_provider')->selectOption((string) $paymentProvider->getId()); } public function submitStep(): void diff --git a/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPage.php b/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPage.php index fb743711b0..bd53d0fc9b 100644 --- a/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPage.php +++ b/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPage.php @@ -32,10 +32,27 @@ public function getToken(): string return $this->getElement('order_token')->getAttribute('data-test-order-token'); } + public function recapturePaymentForThisOrder(): void + { + $this->getSession()->visit($this->makePathAbsolute("en/shop/pay/{$this->getToken()}")); + } + + public function getOrderTotal(): string + { + $orderTotalText = $this->getElement('order_total')->getText(); + + if (str_contains($orderTotalText, ',')) { + return strstr($orderTotalText, ',', true); + } + + return trim($orderTotalText); + } + protected function getDefinedElements(): array { return array_merge(parent::getDefinedElements(), [ 'order_token' => '[data-test-order-token]', + 'order_total' => '[data-test-order-total]', ]); } } diff --git a/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPageInterface.php b/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPageInterface.php index 862a6c04b0..5c3318f379 100644 --- a/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPageInterface.php +++ b/src/CoreShop/Behat/Page/Frontend/Checkout/ThankYouPageInterface.php @@ -23,4 +23,8 @@ interface ThankYouPageInterface extends FrontendPageInterface { public function getToken(): string; + + public function recapturePaymentForThisOrder(): void; + + public function getOrderTotal(): string; } diff --git a/src/CoreShop/Behat/Resources/config/services/contexts/domain.yml b/src/CoreShop/Behat/Resources/config/services/contexts/domain.yml index fb398794b1..5e23528f95 100644 --- a/src/CoreShop/Behat/Resources/config/services/contexts/domain.yml +++ b/src/CoreShop/Behat/Resources/config/services/contexts/domain.yml @@ -100,7 +100,7 @@ services: - '@coreshop.repository.payment_provider' - '@coreshop.payment_provider_rule.processor' - '@coreshop.factory.address' - - '@CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculator' + - '@CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculatorInterface' - '@CoreShop\Component\Payment\Validator\PaymentProviderRuleValidatorInterface' - '@CoreShop\Component\Order\Cart\CartContextResolverInterface' tags: @@ -251,3 +251,10 @@ services: - '@coreshop.behat.shared_storage' tags: - { name: fob.context_service } + + coreshop.behat.context.domain.cache: + class: CoreShop\Behat\Context\Domain\CacheContext + arguments: + - '@coreshop.behat.shared_storage' + tags: + - { name: fob.context_service } diff --git a/src/CoreShop/Behat/Resources/config/services/contexts/setup.yml b/src/CoreShop/Behat/Resources/config/services/contexts/setup.yml index 98613ab237..a5a02178f6 100644 --- a/src/CoreShop/Behat/Resources/config/services/contexts/setup.yml +++ b/src/CoreShop/Behat/Resources/config/services/contexts/setup.yml @@ -384,3 +384,10 @@ services: - '%kernel.project_dir%/etc/build' tags: - { name: fob.context_service } + + coreshop.behat.context.setup.cache: + class: CoreShop\Behat\Context\Setup\CacheContext + arguments: + - '@coreshop.behat.shared_storage' + tags: + - { name: fob.context_service } diff --git a/src/CoreShop/Behat/Resources/config/services/contexts/transform.yml b/src/CoreShop/Behat/Resources/config/services/contexts/transform.yml index 45ead0ae83..3af131f749 100644 --- a/src/CoreShop/Behat/Resources/config/services/contexts/transform.yml +++ b/src/CoreShop/Behat/Resources/config/services/contexts/transform.yml @@ -221,3 +221,10 @@ services: - '@coreshop.repository.attribute_value' tags: - { name: fob.context_service } + + coreshop.behat.context.transform.cache: + class: CoreShop\Behat\Context\Transform\CacheContext + arguments: + - '@coreshop.behat.shared_storage' + tags: + - { name: fob.context_service } diff --git a/src/CoreShop/Behat/Resources/config/suites/domain.yml b/src/CoreShop/Behat/Resources/config/suites/domain.yml index 0db2110313..b3fb6b2de3 100644 --- a/src/CoreShop/Behat/Resources/config/suites/domain.yml +++ b/src/CoreShop/Behat/Resources/config/suites/domain.yml @@ -21,3 +21,4 @@ imports: - domain/recycle_bin.yml - domain/optimistic_entity_lock.yml - domain/payment_provider.yml + - domain/cache.yml diff --git a/src/CoreShop/Behat/Resources/config/suites/domain/cache.yml b/src/CoreShop/Behat/Resources/config/suites/domain/cache.yml new file mode 100644 index 0000000000..900ad734c9 --- /dev/null +++ b/src/CoreShop/Behat/Resources/config/suites/domain/cache.yml @@ -0,0 +1,51 @@ +default: + suites: + domain_cache: + contexts: + - coreshop.behat.context.hook.pimcore_setup + - coreshop.behat.context.hook.coreshop_setup + + - coreshop.behat.context.hook.doctrine_orm + - coreshop.behat.context.hook.pimcore_dao + + - coreshop.behat.context.transform.shared_storage + - coreshop.behat.context.transform.product + - coreshop.behat.context.transform.product_price_rule + - coreshop.behat.context.transform.product_specific_price_rule + - coreshop.behat.context.transform.category + - coreshop.behat.context.transform.country + - coreshop.behat.context.transform.currency + - coreshop.behat.context.transform.customer + - coreshop.behat.context.transform.customer_group + - coreshop.behat.context.transform.zone + - coreshop.behat.context.transform.store + - coreshop.behat.context.transform.tax_rate + - coreshop.behat.context.transform.tax_rule_group + - coreshop.behat.context.transform.product_unit + - coreshop.behat.context.transform.cart + - coreshop.behat.context.transform.product_quantity_price_rule + - coreshop.behat.context.transform.variant + - coreshop.behat.context.transform.cache + + - coreshop.behat.context.setup.product + - coreshop.behat.context.setup.product_price_rule + - coreshop.behat.context.setup.product_specific_price_rule + - coreshop.behat.context.setup.store + - coreshop.behat.context.setup.category + - coreshop.behat.context.setup.country + - coreshop.behat.context.setup.currency + - coreshop.behat.context.setup.customer + - coreshop.behat.context.setup.customer_group + - coreshop.behat.context.setup.zone + - coreshop.behat.context.setup.tax_rate + - coreshop.behat.context.setup.tax_rule_group + - coreshop.behat.context.setup.product_unit + - coreshop.behat.context.setup.pimcore_class + - coreshop.behat.context.setup.cart + - coreshop.behat.context.setup.product_quantity_price_rule + - coreshop.behat.context.setup.variant + - coreshop.behat.context.setup.cache + + - coreshop.behat.context.domain.cache + filters: + tags: "@domain&&@cache" diff --git a/src/CoreShop/Behat/Resources/config/suites/ui/cart.yml b/src/CoreShop/Behat/Resources/config/suites/ui/cart.yml index f78ad4018f..1f38b60ad2 100644 --- a/src/CoreShop/Behat/Resources/config/suites/ui/cart.yml +++ b/src/CoreShop/Behat/Resources/config/suites/ui/cart.yml @@ -15,6 +15,7 @@ default: - coreshop.behat.context.transform.product - coreshop.behat.context.transform.country - coreshop.behat.context.transform.product_specific_price_rule + - coreshop.behat.context.transform.product_price_rule - coreshop.behat.context.transform.currency - coreshop.behat.context.transform.product_unit - coreshop.behat.context.transform.product_quantity_price_rule @@ -24,6 +25,7 @@ default: - coreshop.behat.context.setup.product - coreshop.behat.context.setup.tax_rate - coreshop.behat.context.setup.tax_rule_group + - coreshop.behat.context.setup.product_price_rule - coreshop.behat.context.setup.product_specific_price_rule - coreshop.behat.context.setup.product_unit - coreshop.behat.context.setup.product_quantity_price_rule diff --git a/src/CoreShop/Behat/Resources/config/suites/ui/checkout.yml b/src/CoreShop/Behat/Resources/config/suites/ui/checkout.yml index 4e143b24b6..a098ac3828 100644 --- a/src/CoreShop/Behat/Resources/config/suites/ui/checkout.yml +++ b/src/CoreShop/Behat/Resources/config/suites/ui/checkout.yml @@ -45,7 +45,7 @@ default: - coreshop.behat.context.ui.cart - coreshop.behat.context.ui.product - coreshop.behat.context.ui.user - - coreshop.behat.context.ui.register + - coreshop.behat.context.ui.login - coreshop.behat.context.ui.store - coreshop.behat.context.ui.currency filters: diff --git a/src/CoreShop/Behat/Service/Setup.php b/src/CoreShop/Behat/Service/Setup.php index 1ad8981cc6..638228d84a 100644 --- a/src/CoreShop/Behat/Service/Setup.php +++ b/src/CoreShop/Behat/Service/Setup.php @@ -39,6 +39,10 @@ public static function setupPimcore(): void $connection = \Pimcore::getContainer()->get('database_connection'); + if (null === $connection) { + throw new \Exception('Database connection not found'); + } + $dbName = $connection->getParams()['dbname']; $params = $connection->getParams(); $config = $connection->getConfiguration(); @@ -66,11 +70,23 @@ public static function setupPimcore(): void \Pimcore::getContainer()->get('event_dispatcher'), ); - $installer->setupDatabase([ - 'username' => 'admin', - 'password' => 'coreshop', - ]); - + $method = new \ReflectionMethod($installer, 'setupDatabase'); + $num = $method->getNumberOfParameters(); + + if ($num >= 3) { + $installer->setupDatabase($connection, [ + 'username' => 'admin', + 'password' => 'coreshop', + ]); + } else { + /** + * @phpstan-ignore-next-line + */ + $installer->setupDatabase([ + 'username' => 'admin', + 'password' => 'coreshop', + ]); + } static::$pimcoreSetupDone = true; } diff --git a/src/CoreShop/Bundle/AddressBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/AddressBundle/DependencyInjection/Configuration.php index 530dec2d32..d6aa35b1a7 100644 --- a/src/CoreShop/Bundle/AddressBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/AddressBundle/DependencyInjection/Configuration.php @@ -89,6 +89,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('country')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -104,6 +110,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -141,6 +153,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('state')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -175,6 +193,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('path')->defaultValue('address_identifier')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() diff --git a/src/CoreShop/Bundle/AddressBundle/README.md b/src/CoreShop/Bundle/AddressBundle/README.md index 4cbe04458b..c19af6d1ae 100644 --- a/src/CoreShop/Bundle/AddressBundle/README.md +++ b/src/CoreShop/Bundle/AddressBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/Configuration.php index 17c5750341..005598a73c 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/Configuration.php @@ -36,19 +36,32 @@ public function getConfigTreeBuilder(): TreeBuilder ->useAttributeAsKey('class_name') ->arrayPrototype() ->children() - ->scalarNode('interface')->end() + ->arrayNode('interface') + ->beforeNormalization()-> + castToArray()->end() + ->scalarPrototype()->end() + ->end() ->scalarNode('parent_class')->end() ->scalarNode('group')->end() ->scalarNode('description')->end() ->scalarNode('listing_parent_class')->end() - ->scalarNode('use_traits')->end() - ->scalarNode('listing_use_traits')->end() + ->arrayNode('use_traits') + ->beforeNormalization()-> + castToArray()->end() + ->scalarPrototype()->end() + ->end() + ->arrayNode('listing_use_traits') + ->beforeNormalization()-> + castToArray()->end() + ->scalarPrototype()->end() + ->end() ->arrayNode('fields') ->useAttributeAsKey('field_name') ->arrayPrototype() ->children() ->scalarNode('after')->end() ->scalarNode('before')->end() + ->booleanNode('replace')->defaultTrue()->end() ->variableNode('definition')->end() ->end() ->end() diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/CoreShopClassDefinitionPatchExtension.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/CoreShopClassDefinitionPatchExtension.php index 009316bf80..bfc748afbc 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/CoreShopClassDefinitionPatchExtension.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/DependencyInjection/CoreShopClassDefinitionPatchExtension.php @@ -52,6 +52,7 @@ public function load(array $configs, ContainerBuilder $container): void $field['after'] ?? null, $field['before'] ?? null, $field['definition'] ?? null, + $field['replace'] ?? true, ]), ); diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patch.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patch.php index 1d8d05ff99..6814560303 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patch.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patch.php @@ -20,17 +20,32 @@ class Patch implements PatchInterface { + private ?array $interface = null; + + private ?array $useTraits = null; + + private ?array $listingUseTraits = null; + public function __construct( protected string $className, - protected ?string $interface, + string|array|null $interface, protected ?string $parentClass, protected ?string $group, protected ?string $description, protected ?string $listingParentClass, - protected ?string $useTraits, - protected ?string $listingUseTraits, + string|array|null $useTraits, + string|array|null $listingUseTraits, protected ?array $fields, ) { + if (is_string($interface)) { + $this->interface = [$interface]; + } + if (is_string($useTraits)) { + $this->useTraits = [$useTraits]; + } + if (is_string($listingUseTraits)) { + $this->listingUseTraits = [$listingUseTraits]; + } } public function getClassName(): string @@ -38,7 +53,7 @@ public function getClassName(): string return $this->className; } - public function getInterface(): ?string + public function getInterface(): ?array { return $this->interface; } @@ -63,12 +78,12 @@ public function getListingParentClass(): ?string return $this->listingParentClass; } - public function getUseTraits(): ?string + public function getUseTraits(): ?array { return $this->useTraits; } - public function getListingUseTraits(): ?string + public function getListingUseTraits(): ?array { return $this->listingUseTraits; } diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchField.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchField.php index e68e0fedf1..618fedd815 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchField.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchField.php @@ -25,6 +25,7 @@ public function __construct( protected ?string $after, protected ?string $before, protected ?array $definition, + protected bool $replace = true, ) { if (null === $this->definition) { $this->definition = []; @@ -52,4 +53,9 @@ public function getDefinition(): ?array { return $this->definition; } + + public function isReplace(): bool + { + return $this->replace; + } } diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchFieldInterface.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchFieldInterface.php index 382acb728a..6e860b3550 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchFieldInterface.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchFieldInterface.php @@ -27,4 +27,6 @@ public function getAfter(): ?string; public function getBefore(): ?string; public function getDefinition(): ?array; + + public function isReplace(): bool; } diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchInterface.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchInterface.php index 31849a926c..dc18e3bf3b 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchInterface.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/PatchInterface.php @@ -22,7 +22,7 @@ interface PatchInterface { public function getClassName(): string; - public function getInterface(): ?string; + public function getInterface(): ?array; public function getParentClass(): ?string; @@ -32,9 +32,9 @@ public function getDescription(): ?string; public function getListingParentClass(): ?string; - public function getUseTraits(): ?string; + public function getUseTraits(): ?array; - public function getListingUseTraits(): ?string; + public function getListingUseTraits(): ?array; /** * @return PatchField[]|null diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patcher.php b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patcher.php index 2b512d70b5..ca79c8d866 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patcher.php +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/Patcher.php @@ -77,48 +77,58 @@ protected function patchWithClassUpdate(PatchInterface $patch): ClassUpdate if (null !== $patch->getInterface()) { $interfaces = $classUpdater->getProperty('implementsInterfaces'); - if (null === $interfaces || !str_contains($interfaces, $patch->getInterface())) { - if (!$interfaces) { - $interfaces = $patch->getInterface(); - } else { - $interfaces .= sprintf(',%s', $patch->getInterface()); + foreach ($patch->getInterface() as $patchInterface) { + if (null === $interfaces || !str_contains($interfaces, $patchInterface)) { + if (!$interfaces) { + $interfaces = $patchInterface; + } else { + $interfaces .= sprintf(',%s', $patchInterface); + } } - - $classUpdater->setProperty('implementsInterfaces', $interfaces); } + + $classUpdater->setProperty('implementsInterfaces', $interfaces); } if (null !== $patch->getUseTraits()) { $traits = $classUpdater->getProperty('useTraits'); - if (null === $traits || !str_contains($traits, $patch->getUseTraits())) { - if (!$traits) { - $traits = $patch->getUseTraits(); - } else { - $traits .= sprintf(',%s', $patch->getUseTraits()); + foreach ($patch->getUseTraits() as $patchTrait) { + if (null === $traits || !str_contains($traits, $patchTrait)) { + if (!$traits) { + $traits = $patchTrait; + } else { + $traits .= sprintf(',%s', $patchTrait); + } } - - $classUpdater->setProperty('useTraits', $traits); } + + $classUpdater->setProperty('useTraits', $traits); } if (null !== $patch->getListingParentClass()) { - $traits = $classUpdater->getProperty('listingParentClass'); - - if (null === $traits || !str_contains($traits, $patch->getListingUseTraits())) { - if (!$traits) { - $traits = $patch->getListingUseTraits(); - } else { - $traits .= sprintf(',%s', $patch->getListingUseTraits()); + $traits = $classUpdater->getProperty('listingUseTraits'); + + foreach ($patch->getListingUseTraits() as $patchListingUseTrait) { + if (null === $traits || !str_contains($traits, $patchListingUseTrait)) { + if (!$traits) { + $traits = $patchListingUseTrait; + } else { + $traits .= sprintf(',%s', $patchListingUseTrait); + } } - - $classUpdater->setProperty('listingParentClass', $traits); } + + $classUpdater->setProperty('listingUseTraits', $traits); } foreach ($patch->getFields() as $field) { if ($classUpdater->hasField($field->getFieldName())) { - $classUpdater->replaceField($field->getFieldName(), $field->getDefinition()); + if ($field->isReplace()) { + $classUpdater->replaceField($field->getFieldName(), $field->getDefinition()); + } else { + $classUpdater->replaceFieldProperties($field->getFieldName(), $field->getDefinition()); + } } elseif ($field->getBefore()) { $classUpdater->insertFieldBefore($field->getBefore(), $field->getDefinition()); } elseif ($field->getAfter()) { diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/README.md b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/README.md index f28a6d04ce..ed450d473d 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/README.md +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/composer.json b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/composer.json index 1695fb647c..a061d32a2f 100644 --- a/src/CoreShop/Bundle/ClassDefinitionPatchBundle/composer.json +++ b/src/CoreShop/Bundle/ClassDefinitionPatchBundle/composer.json @@ -26,7 +26,7 @@ "require": { "coreshop/pimcore": "^4.0", "pimcore/pimcore": "^11.0", - "sebastian/diff": "^4.0 | ^5.0" + "sebastian/diff": "^4.0 | ^5.0 | ^6.0" }, "require-dev": { "phpstan/phpstan": "^1.5.4", diff --git a/src/CoreShop/Bundle/ConfigurationBundle/README.md b/src/CoreShop/Bundle/ConfigurationBundle/README.md index 45412163ce..ec44d58f16 100644 --- a/src/CoreShop/Bundle/ConfigurationBundle/README.md +++ b/src/CoreShop/Bundle/ConfigurationBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/CoreBundle/Application/Version.php b/src/CoreShop/Bundle/CoreBundle/Application/Version.php index d26eff5195..631429f123 100644 --- a/src/CoreShop/Bundle/CoreBundle/Application/Version.php +++ b/src/CoreShop/Bundle/CoreBundle/Application/Version.php @@ -24,9 +24,9 @@ final class Version public const MINOR_VERSION = '0'; - public const RELEASE_VERSION = '1'; + public const RELEASE_VERSION = '5'; - public const EXTRA_VERSION = 'beta.1'; + public const EXTRA_VERSION = ''; public static function getVersion(): string { diff --git a/src/CoreShop/Bundle/CoreBundle/Command/InstallCommand.php b/src/CoreShop/Bundle/CoreBundle/Command/InstallCommand.php index 33d94c1d5e..cfe03f012e 100644 --- a/src/CoreShop/Bundle/CoreBundle/Command/InstallCommand.php +++ b/src/CoreShop/Bundle/CoreBundle/Command/InstallCommand.php @@ -100,9 +100,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $outputStyle->newLine(2); $outputStyle->success($this->getProperFinalMessage($errored)); $outputStyle->writeln( - sprintf( - 'You can now open your store at the following path under the website root: /', - ), + 'You can now open your store at the following path under the website root: /', ); return 0; diff --git a/src/CoreShop/Bundle/CoreBundle/Controller/ConfigurationController.php b/src/CoreShop/Bundle/CoreBundle/Controller/ConfigurationController.php index 7d523dd87f..b643a7d648 100644 --- a/src/CoreShop/Bundle/CoreBundle/Controller/ConfigurationController.php +++ b/src/CoreShop/Bundle/CoreBundle/Controller/ConfigurationController.php @@ -33,7 +33,7 @@ public function saveAllAction( ConfigurationServiceInterface $configurationService, StoreRepositoryInterface $storeRepository, ): Response { - $values = $this->decodeJson($this->getParameterFromRequest($request, 'values')); + $values = $this->decodeJson($this->getParameterFromRequest($request, 'values'), true, [], false); $values = array_htmlspecialchars($values); foreach ($values as $store => $storeValues) { diff --git a/src/CoreShop/Bundle/CoreBundle/Controller/OrderCreationController.php b/src/CoreShop/Bundle/CoreBundle/Controller/OrderCreationController.php index 11ecafc204..599a94d1f7 100644 --- a/src/CoreShop/Bundle/CoreBundle/Controller/OrderCreationController.php +++ b/src/CoreShop/Bundle/CoreBundle/Controller/OrderCreationController.php @@ -149,6 +149,8 @@ public static function getSubscribedServices(): array new SubscribedService('CoreShop\Component\Shipping\Resolver\CarriersResolverInterface', CarriersResolver::class, attributes: new Autowire('CoreShop\Component\Shipping\Resolver\CarriersResolverInterface')), TaxedShippingCalculatorInterface::class, CartContextResolverInterface::class, + CarriersResolverInterface::class, + TaxedShippingCalculatorInterface::class, ]; } } diff --git a/src/CoreShop/Bundle/CoreBundle/CoreExtension/StoreValues.php b/src/CoreShop/Bundle/CoreBundle/CoreExtension/StoreValues.php index 8f7cc5ef3b..c161c1c82b 100644 --- a/src/CoreShop/Bundle/CoreBundle/CoreExtension/StoreValues.php +++ b/src/CoreShop/Bundle/CoreBundle/CoreExtension/StoreValues.php @@ -473,15 +473,15 @@ public function save(Localizedfield|\Pimcore\Model\DataObject\Fieldcollection\Da foreach ($availableStoreValues as $availableStoreValuesEntity) { if (!in_array($availableStoreValuesEntity->getId(), $validStoreValues, true)) { $this->getEntityManager()->remove($availableStoreValuesEntity); - $this->getEntityManager()->flush($availableStoreValuesEntity); } } foreach ($allStoreValues as $storeEntity) { $this->getEntityManager()->persist($storeEntity); - $this->getEntityManager()->flush($storeEntity); } + $this->getEntityManager()->flush(); + //We have to set that here, values could change during persist due to copy or variant inheritance break $object->setObjectVar($this->getName(), $allStoreValues); } diff --git a/src/CoreShop/Bundle/CoreBundle/CoreShopCoreBundle.php b/src/CoreShop/Bundle/CoreBundle/CoreShopCoreBundle.php index ae884d5d86..6856afb644 100644 --- a/src/CoreShop/Bundle/CoreBundle/CoreShopCoreBundle.php +++ b/src/CoreShop/Bundle/CoreBundle/CoreShopCoreBundle.php @@ -37,7 +37,6 @@ use CoreShop\Bundle\ProductBundle\CoreShopProductBundle; use CoreShop\Bundle\ProductQuantityPriceRulesBundle\CoreShopProductQuantityPriceRulesBundle; use CoreShop\Bundle\ResourceBundle\AbstractResourceBundle; -use CoreShop\Bundle\ResourceBundle\ComposerPackageBundleInterface; use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle; use CoreShop\Bundle\SEOBundle\CoreShopSEOBundle; use CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle; @@ -54,7 +53,7 @@ use Pimcore\HttpKernel\BundleCollection\BundleCollection; use Symfony\Component\DependencyInjection\ContainerBuilder; -final class CoreShopCoreBundle extends AbstractResourceBundle implements ComposerPackageBundleInterface +final class CoreShopCoreBundle extends AbstractResourceBundle { public function getSupportedDrivers(): array { @@ -101,8 +100,8 @@ public static function registerDependentBundles(BundleCollection $collection): v $collection->addBundle(new CoreShopProductQuantityPriceRulesBundle(), 1600); $collection->addBundle(new CoreShopWishlistBundle(), 1500); $collection->addBundle(new CoreShopClassDefinitionPatchBundle(), 1400); - $collection->addBundle(new PimcoreCustomReportsBundle(), 10); - $collection->addBundle(new PimcoreNewsletterBundle(), 10); + $collection->addBundle(new PimcoreCustomReportsBundle(), 20000); + $collection->addBundle(new PimcoreNewsletterBundle(), 20000); } public function getPackageName(): string diff --git a/src/CoreShop/Bundle/CoreBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/CoreBundle/DependencyInjection/Configuration.php index c871bd71b3..27365d9698 100644 --- a/src/CoreShop/Bundle/CoreBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/CoreBundle/DependencyInjection/Configuration.php @@ -59,6 +59,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() diff --git a/src/CoreShop/Bundle/CoreBundle/EventListener/CustomerOrderDeletionListener.php b/src/CoreShop/Bundle/CoreBundle/EventListener/CustomerOrderDeletionListener.php index 1fa266c5f4..4e23935ae1 100644 --- a/src/CoreShop/Bundle/CoreBundle/EventListener/CustomerOrderDeletionListener.php +++ b/src/CoreShop/Bundle/CoreBundle/EventListener/CustomerOrderDeletionListener.php @@ -57,7 +57,7 @@ public function checkCustomerOrdersBeforeDeletion(DataObjectEvent $event): void $hasOrders = $this->orderRepository->hasCustomerOrders($object); if ($hasOrders) { - throw new \InvalidArgumentException(sprintf('Cannot delete a customer with orders')); + throw new \InvalidArgumentException('Cannot delete a customer with orders'); } } } diff --git a/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/CustomerListener.php b/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/CustomerListener.php index ad8e44f64e..c2a4f94b80 100644 --- a/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/CustomerListener.php +++ b/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/CustomerListener.php @@ -143,6 +143,7 @@ private function prepareUserParameters(UserInterface $user): array { return [ '_locale' => $this->shopperContext->getLocaleCode(), + 'store_id' => $this->shopperContext->getStore()->getId(), 'recipient' => $user->getCustomer()->getEmail(), 'gender' => $user->getCustomer()->getGender(), 'firstname' => $user->getCustomer()->getFirstname(), diff --git a/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/OrderUpdateListener.php b/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/OrderUpdateListener.php new file mode 100644 index 0000000000..4db131ce67 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/OrderUpdateListener.php @@ -0,0 +1,37 @@ +getSubject(); + + if (!$order instanceof \CoreShop\Component\Order\Model\OrderInterface) { + return; + } + + $this->rulesProcessor->applyRules($order->getSaleState(), $order, [ + 'backend_updated' => true, + ]); + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/PaymentWorkflowListener.php b/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/PaymentWorkflowListener.php index b3bc21b47a..c6ef5c9654 100644 --- a/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/PaymentWorkflowListener.php +++ b/src/CoreShop/Bundle/CoreBundle/EventListener/NotificationRules/PaymentWorkflowListener.php @@ -18,6 +18,7 @@ namespace CoreShop\Bundle\CoreBundle\EventListener\NotificationRules; +use CoreShop\Component\Core\Model\OrderInterface; use CoreShop\Component\Core\Model\PaymentInterface; use Symfony\Component\Workflow\Event\Event; use Webmozart\Assert\Assert; @@ -33,9 +34,20 @@ public function applyPaymentWorkflowTransitionCompleted(Event $event): void */ Assert::isInstanceOf($subject, PaymentInterface::class); + $order = $subject->getOrder(); + + if (!$order instanceof OrderInterface) { + return; + } + $this->rulesProcessor->applyRules('payment', $subject, [ 'order_id' => $event->getSubject()->getOrder()->getId(), + '_locale' => $order->getLocaleCode(), 'paymentState' => $event->getSubject()->getState(), + 'transition' => $event->getTransition()?->getName(), + 'workflow' => $event->getWorkflowName(), + 'fromState' => $event->getMarking()->getPlaces(), + 'toState' => $event->getTransition()?->getTos(), ]); } } diff --git a/src/CoreShop/Bundle/CoreBundle/EventListener/RecursiveVariantCacheInvalidationEventListener.php b/src/CoreShop/Bundle/CoreBundle/EventListener/RecursiveVariantCacheInvalidationEventListener.php new file mode 100644 index 0000000000..0ca9c6e1c5 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/EventListener/RecursiveVariantCacheInvalidationEventListener.php @@ -0,0 +1,78 @@ + ['invalidateRuleCacheAndPrePopulateCache'], + 'coreshop.product_specific_price_rule.post_save' => ['invalidateRuleCacheAndPrePopulateCache'], + 'coreshop.cart_price_rule.post_save' => ['invalidateRuleCacheAndPrePopulateCache'], + 'coreshop.payment_provider_rule.post_save' => ['invalidateRuleCacheAndPrePopulateCache'], + 'coreshop.shipping_rule.post_save' => ['invalidateRuleCacheAndPrePopulateCache'], + ]; + } + + public function invalidateRuleCacheAndPrePopulateCache(ResourceControllerEvent $event): void + { + $resource = $event->getSubject(); + + if (!$resource instanceof RuleInterface) { + return; + } + + foreach ($resource->getConditions() as $condition) { + if ($condition->getId() !== 'products') { + continue; + } + + $config = $condition->getConfiguration(); + + if (!isset($config['include_variants']) || !$config['include_variants']) { + continue; + } + + if ($resource instanceof PaymentProviderRuleInterface) { + Cache::clearTag(PaymentRuleProductsConditionChecker::PAYMENT_PROVIDER_RULE_RECURSIVE_VARIANT_CACHE_TAG); + + continue; + } + + if ($resource instanceof ShippingRuleInterface) { + Cache::clearTag(PaymentRuleProductsConditionChecker::PAYMENT_PROVIDER_RULE_RECURSIVE_VARIANT_CACHE_TAG); + + continue; + } + + Cache::clearTag(sprintf('cs_rule_variant_%s', $resource->getId())); + + break; + } + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreMailConfigurationType.php b/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreMailConfigurationType.php index b00b45334d..fa13f3fe1a 100644 --- a/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreMailConfigurationType.php +++ b/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreMailConfigurationType.php @@ -21,7 +21,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; -use Symfony\Component\Form\Extension\Core\Type\NumberType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\FormBuilderInterface; class StoreMailConfigurationType extends AbstractType @@ -36,7 +36,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'entry_options' => [ 'allow_add' => true, 'allow_delete' => true, - 'entry_type' => NumberType::class, + 'entry_type' => IntegerType::class, ], ]) ->add('doNotSendToDesignatedRecipient', CheckboxType::class) diff --git a/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreOrderMailConfigurationType.php b/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreOrderMailConfigurationType.php index 8a0faf759b..1c233f2bff 100644 --- a/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreOrderMailConfigurationType.php +++ b/src/CoreShop/Bundle/CoreBundle/Form/Type/Notification/Action/StoreOrderMailConfigurationType.php @@ -21,7 +21,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; -use Symfony\Component\Form\Extension\Core\Type\NumberType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\FormBuilderInterface; class StoreOrderMailConfigurationType extends AbstractType @@ -36,7 +36,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'entry_options' => [ 'allow_add' => true, 'allow_delete' => true, - 'entry_type' => NumberType::class, + 'entry_type' => IntegerType::class, ], ]) ->add('sendInvoices', CheckboxType::class) diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230829163505.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230829163505.php new file mode 100644 index 0000000000..707c42b3c2 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230829163505.php @@ -0,0 +1,46 @@ +hasTable('coreshop_payment_provider_rule_translation')) { + return; + } + + $this->addSql(' + CREATE TABLE coreshop_payment_provider_rule_translation (id INT(11) AUTO_INCREMENT NOT NULL, translatable_id INT(11) NOT NULL, label VARCHAR(256) NULL, creationDate DATETIME NOT NULL, modificationDate DATETIME DEFAULT NULL, locale VARCHAR(5), UNIQUE translatable_id_locale (translatable_id, locale), INDEX translatable_id (translatable_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8MB4 COLLATE `utf8mb4_general_ci` ENGINE = InnoDB; + ALTER TABLE coreshop_payment_provider_rule_translation ADD CONSTRAINT FK_9A9D1D4B2C2AC5D3 FOREIGN KEY (translatable_id) REFERENCES coreshop_payment_provider_rule (id) ON DELETE CASCADE; + '); + } + + public function down(Schema $schema): void + { + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230928104945.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230928104945.php new file mode 100644 index 0000000000..6eb42a5bf5 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230928104945.php @@ -0,0 +1,90 @@ +container->getParameter('coreshop.model.order.pimcore_class_name'), + ); + + if ($classUpdater->hasField('immutable')) { + return; + } + + $immutableField = [ + 'name' => 'immutable', + 'title' => 'coreshop.order.immutable', + 'tooltip' => '', + 'mandatory' => false, + 'noteditable' => true, + 'index' => false, + 'locked' => false, + 'style' => '', + 'permissions' => null, + 'datatype' => 'data', + 'fieldtype' => 'booleanSelect', + 'relationType' => false, + 'invisible' => false, + 'visibleGridView' => false, + 'visibleSearch' => false, + 'yesLabel' => '', + 'noLabel' => '', + 'emptyLabel' => '', + 'options' => [ + [ + 'key' => '', + 'value' => 0, + ], + [ + 'key' => '', + 'value' => 1, + ], + [ + 'key' => '', + 'value' => -1, + ], + ], + 'width' => '', + ]; + + $classUpdater->insertFieldAfter('additionalData', $immutableField); + $classUpdater->save(); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230928105158.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230928105158.php new file mode 100644 index 0000000000..202950ba1a --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230928105158.php @@ -0,0 +1,90 @@ +container->getParameter('coreshop.model.order_item.pimcore_class_name'), + ); + + if ($classUpdater->hasField('immutable')) { + return; + } + + $immutableField = [ + 'name' => 'immutable', + 'title' => 'coreshop.order_item.immutable', + 'tooltip' => '', + 'mandatory' => false, + 'noteditable' => true, + 'index' => false, + 'locked' => false, + 'style' => '', + 'permissions' => null, + 'datatype' => 'data', + 'fieldtype' => 'booleanSelect', + 'relationType' => false, + 'invisible' => false, + 'visibleGridView' => false, + 'visibleSearch' => false, + 'yesLabel' => '', + 'noLabel' => '', + 'emptyLabel' => '', + 'options' => [ + [ + 'key' => '', + 'value' => 0, + ], + [ + 'key' => '', + 'value' => 1, + ], + [ + 'key' => '', + 'value' => -1, + ], + ], + 'width' => '', + ]; + + $classUpdater->insertFieldAfter('order', $immutableField); + $classUpdater->save(); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20231004120900.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20231004120900.php new file mode 100644 index 0000000000..81d196b21d --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20231004120900.php @@ -0,0 +1,63 @@ +container->get('coreshop.repository.order')->getList(); + $listing->setCondition('saleState = \'order\''); + + $batchListing = new BatchListing($listing, 50); + + /** + * @var OrderInterface $order + */ + foreach ($batchListing as $order) { + $order->setImmutable(true); + + foreach ($order->getItems() as $item) { + $item->setImmutable(true); + $item->save(); + } + + $order->save(); + } + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20231201091924.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20231201091924.php new file mode 100644 index 0000000000..b64bfa24c5 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20231201091924.php @@ -0,0 +1,45 @@ +addSql( + ' + CREATE TABLE coreshop_cart_price_rule_voucher_code_customer (id INT AUTO_INCREMENT NOT NULL, customerId INT NOT NULL, uses INT NOT NULL, voucherCodeId INT DEFAULT NULL, INDEX IDX_7F7BC3AAFDD3BBCD (voucherCodeId), INDEX customerId_idx (customerId), UNIQUE INDEX voucherCodeId_customerId (voucherCodeId, customerId), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8MB4 COLLATE `utf8mb4_general_ci` ENGINE = InnoDB; + ALTER TABLE coreshop_cart_price_rule_voucher_code_customer ADD CONSTRAINT FK_7F7BC3AAFDD3BBCD FOREIGN KEY (voucherCodeId) REFERENCES coreshop_cart_price_rule_voucher_code (id); + ', + ); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240117102103.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240117102103.php new file mode 100644 index 0000000000..4cfd12d485 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240117102103.php @@ -0,0 +1,48 @@ +container->get(PimcoreRoutesInstaller::class)->installResources(new NullOutput(), 'coreshop'); + } + + public function down(Schema $schema): void + { + if ($schema->hasTable('settings_store')) { + $this->addSql("DELETE FROM settings_store WHERE id='coreshop_payment_token'"); + } + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211090209.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211090209.php new file mode 100644 index 0000000000..ca54a61445 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211090209.php @@ -0,0 +1,53 @@ +setPriority(3); + $route->save(); + + return; + } + + $this->write('Static route "coreshop_payment_token" not found, make sure the priority is set to 3'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211095530.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211095530.php new file mode 100644 index 0000000000..b668029816 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211095530.php @@ -0,0 +1,54 @@ +container->getParameter('coreshop.model.order.pimcore_class_name'), + ); + + if (!$classUpdater->hasField('token')) { + return; + } + + $classUpdater->replaceFieldProperties('token', ['unique' => true]); + $classUpdater->save(); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211095804.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211095804.php new file mode 100644 index 0000000000..77f473f776 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240211095804.php @@ -0,0 +1,54 @@ +container->getParameter('coreshop.model.wishlist.pimcore_class_name'), + ); + + if (!$classUpdater->hasField('token')) { + return; + } + + $classUpdater->replaceFieldProperties('token', ['unique' => true]); + $classUpdater->save(); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240421093551.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240421093551.php new file mode 100644 index 0000000000..d25a554ebc --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20240421093551.php @@ -0,0 +1,47 @@ +setKey('coreshop_permission_messenger'); + $permission->setCategory('coreshop_permission_group_coreshop'); + $permission->save(); + } + } + + public function down(Schema $schema): void + { + } +} diff --git a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/CategoryRepository.php b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/CategoryRepository.php index f942749ff0..534a0c8e79 100644 --- a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/CategoryRepository.php +++ b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/CategoryRepository.php @@ -22,6 +22,7 @@ use CoreShop\Component\Core\Repository\CategoryRepositoryInterface; use CoreShop\Component\Product\Model\CategoryInterface; use CoreShop\Component\Store\Model\StoreInterface; +use Doctrine\DBAL\ArrayParameterType; use Pimcore\Model\DataObject\Listing; class CategoryRepository extends BaseCategoryRepository implements CategoryRepositoryInterface @@ -55,6 +56,41 @@ public function findChildCategoriesForStore(CategoryInterface $category, StoreIn return $list->getObjects(); } + public function findRecursiveChildCategoryIdsForStoreByCategories(array $categories, StoreInterface $store): array + { + $list = $this->getList(); + $dao = $list->getDao(); + + /** @psalm-suppress InternalMethod */ + $query = ' + SELECT oo_id as id FROM ( + SELECT CONCAT(path, `key`) as realFullPath FROM objects WHERE id IN (:categories) + ) as categories + INNER JOIN ' . $dao->getTableName() . " variants ON variants.path LIKE CONCAT(categories.realFullPath, '/%') + "; + + $params = [ + 'categories' => $categories, + ]; + $paramTypes = [ + 'categories' => ArrayParameterType::STRING, + ]; + + $resultCategories = $this->connection->fetchAllAssociative($query, $params, $paramTypes); + + $childs = []; + + foreach ($categories as $categoryId) { + $childs[$categoryId] = true; + } + + foreach ($resultCategories as $result) { + $childs[$result['id']] = true; + } + + return array_keys($childs); + } + public function findRecursiveChildCategoryIdsForStore(CategoryInterface $category, StoreInterface $store): array { $list = $this->getList(); diff --git a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/ProductRepository.php b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/ProductRepository.php index de2effeff7..a322f705b6 100644 --- a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/ProductRepository.php +++ b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/ProductRepository.php @@ -24,12 +24,16 @@ use CoreShop\Component\Core\Repository\ProductRepositoryInterface; use CoreShop\Component\Core\Repository\ProductVariantRepositoryInterface; use CoreShop\Component\Store\Model\StoreInterface; +use Doctrine\DBAL\ArrayParameterType; +use Pimcore\Cache; use Pimcore\Model\DataObject\AbstractObject; use Pimcore\Model\DataObject\Listing; use Symfony\Component\OptionsResolver\OptionsResolver; class ProductRepository extends BaseProductRepository implements ProductRepositoryInterface, ProductVariantRepositoryInterface { + public const VARIANT_RECURSIVE_QUERY_CACHE_TAG = 'coreshop_variant_recursive'; + public function findLatestByStore(StoreInterface $store, int $count = 8): array { $conditions = [ @@ -37,7 +41,7 @@ public function findLatestByStore(StoreInterface $store, int $count = 8): array ['condition' => 'stores LIKE ?', 'variable' => '%,' . $store->getId() . ',%'], ]; - /** @psalm-suppress InvalidScalarArgument */ + /** @psalm-suppress InvalidArgument */ return $this->findBy($conditions, ['creationDate' => 'DESC'], $count); } @@ -55,6 +59,51 @@ public function findAllVariants(ProductInterface $product, bool $recursive = tru return $list->getObjects(); } + public function findRecursiveVariantIdsForProductAndStoreByProducts(array $products, StoreInterface $store, array $cacheTags = []): array + { + $cacheKey = sprintf('cs_rvids_%s_%d', md5(implode('-', $products)), $store->getId()); + + if (false === $variantIds = Cache::load($cacheKey)) { + $list = $this->getList(); + $dao = $list->getDao(); + + /** @psalm-suppress InternalMethod */ + $query = ' + SELECT oo_id as id FROM ( + SELECT CONCAT(path, `key`) as realFullPath FROM objects WHERE id IN (:products) + ) as products + INNER JOIN ' . $dao->getTableName() . " variants ON variants.path LIKE CONCAT(products.realFullPath, '/%') + WHERE variants.stores LIKE :store + "; + + $params = [ + 'products' => $products, + 'store' => '%,' . $store->getId() . ',%', + ]; + $paramTypes = [ + 'products' => ArrayParameterType::STRING, + ]; + + $resultProducts = $this->connection->fetchAllAssociative($query, $params, $paramTypes); + + $variantIds = []; + + foreach ($products as $productId) { + $variantIds[$productId] = true; + } + + foreach ($resultProducts as $result) { + $variantIds[$result['id']] = true; + } + + $cacheTags[] = self::VARIANT_RECURSIVE_QUERY_CACHE_TAG; + + Cache::save($variantIds, $cacheKey, $cacheTags, 500, 0, true); + } + + return array_keys($variantIds); + } + public function findRecursiveVariantIdsForProductAndStore(ProductInterface $product, StoreInterface $store): array { $list = $this->getList(); diff --git a/src/CoreShop/Bundle/CoreBundle/README.md b/src/CoreShop/Bundle/CoreBundle/README.md index 029b6f4053..46f9b97398 100644 --- a/src/CoreShop/Bundle/CoreBundle/README.md +++ b/src/CoreShop/Bundle/CoreBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/CoreBundle/Report/CarriersReport.php b/src/CoreShop/Bundle/CoreBundle/Report/CarriersReport.php index 0735b0845e..c63c4c3af8 100644 --- a/src/CoreShop/Bundle/CoreBundle/Report/CarriersReport.php +++ b/src/CoreShop/Bundle/CoreBundle/Report/CarriersReport.php @@ -76,7 +76,7 @@ public function getReportData(ParameterBag $parameterBag): array ON o.id = `order`.oo_id WHERE store = $storeId AND creationDate > $fromTimestamp AND creationDate < $toTimestamp ) t - WHERE store = $storeId AND carrier IS NOT NULL AND o_creationDate > $fromTimestamp AND o_creationDate < $toTimestamp AND saleState='" . OrderSaleStates::STATE_ORDER . "' + WHERE store = $storeId AND carrier IS NOT NULL AND creationDate > $fromTimestamp AND creationDate < $toTimestamp AND saleState='" . OrderSaleStates::STATE_ORDER . "' GROUP BY carrier"; $results = $this->db->fetchAllAssociative($sql); diff --git a/src/CoreShop/Bundle/CoreBundle/Report/CategoriesReport.php b/src/CoreShop/Bundle/CoreBundle/Report/CategoriesReport.php index d9affb4b93..b3cd073041 100644 --- a/src/CoreShop/Bundle/CoreBundle/Report/CategoriesReport.php +++ b/src/CoreShop/Bundle/CoreBundle/Report/CategoriesReport.php @@ -114,7 +114,7 @@ public function getReportData(ParameterBag $parameterBag): array $query = " SELECT SQL_CALC_FOUND_ROWS `categories`.oo_id as categoryId, - `categories`.o_key as categoryKey, + `categories`.key as categoryKey, `localizedCategories`.name as categoryName, `orders`.store, SUM(orderItems.totalGross) AS sales, diff --git a/src/CoreShop/Bundle/CoreBundle/Report/PaymentProvidersReport.php b/src/CoreShop/Bundle/CoreBundle/Report/PaymentProvidersReport.php index 7e182ba8a3..421f7b71e7 100644 --- a/src/CoreShop/Bundle/CoreBundle/Report/PaymentProvidersReport.php +++ b/src/CoreShop/Bundle/CoreBundle/Report/PaymentProvidersReport.php @@ -76,7 +76,7 @@ public function getReportData(ParameterBag $parameterBag): array ON o.id = `order`.oo_id WHERE store = $storeId AND creationDate > $fromTimestamp AND creationDate < $toTimestamp ) t - WHERE store = $storeId AND o_creationDate > $fromTimestamp AND o_creationDate < $toTimestamp AND saleState='" . OrderSaleStates::STATE_ORDER . "' + WHERE store = $storeId AND creationDate > $fromTimestamp AND creationDate < $toTimestamp AND saleState='" . OrderSaleStates::STATE_ORDER . "' GROUP BY paymentProvider"; $results = $this->db->fetchAllAssociative($sql); diff --git a/src/CoreShop/Bundle/CoreBundle/Report/ProductsReport.php b/src/CoreShop/Bundle/CoreBundle/Report/ProductsReport.php index d992c66d07..91975869f8 100644 --- a/src/CoreShop/Bundle/CoreBundle/Report/ProductsReport.php +++ b/src/CoreShop/Bundle/CoreBundle/Report/ProductsReport.php @@ -60,6 +60,10 @@ public function getReportData(ParameterBag $parameterBag): array $orderStateFilter = null; } + if (count($orderStateFilter) === 1 && $orderStateFilter[0] === 'all') { + $orderStateFilter = null; + } + $storeId = $parameterBag->get('store'); if (null === $storeId) { diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Country.orm.xml b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Country.orm.xml index ebafc92f5a..2f212395cd 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Country.orm.xml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Country.orm.xml @@ -6,6 +6,7 @@ + diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductStoreValues.orm.xml b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductStoreValues.orm.xml index 9724396732..50cfba6193 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductStoreValues.orm.xml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductStoreValues.orm.xml @@ -16,9 +16,6 @@ - - - diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml index fa8024ad10..3d5f511a30 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml @@ -5,9 +5,6 @@ - - - diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Store.orm.xml b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Store.orm.xml index 6de8e3ee43..da00ca083c 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Store.orm.xml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/doctrine/model/Store.orm.xml @@ -16,6 +16,9 @@ + + + diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/pimcore/admin.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/pimcore/admin.yml index d1cbf4601e..601902b54f 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/pimcore/admin.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/pimcore/admin.yml @@ -31,6 +31,7 @@ core_shop_core: shipping_rule_conditions_currencies: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/currencies.js' shipping_rule_conditions_customerGroups: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/customerGroups.js' shipping_rule_conditions_customers: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/customers.js' + shipping_rule_conditions_guest: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/guest.js' shipping_rule_conditions_products: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/products.js' shipping_rule_conditions_stores: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/stores.js' shipping_rule_conditions_zones: '/bundles/coreshopcore/pimcore/js/shipping/rules/conditions/zones.js' @@ -43,6 +44,7 @@ core_shop_core: payment_provider_rule_conditions_currencies: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/currencies.js' payment_provider_rule_conditions_customerGroups: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/customerGroups.js' payment_provider_rule_conditions_customers: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/customers.js' + payment_provider_rule_conditions_guest: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/guest.js' payment_provider_rule_conditions_products: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/products.js' payment_provider_rule_conditions_stores: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/stores.js' payment_provider_rule_conditions_zones: '/bundles/coreshopcore/pimcore/js/payment/rules/conditions/zones.js' @@ -54,6 +56,8 @@ core_shop_core: product_price_rule_condition_currencies: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/currencies.js' product_price_rule_condition_customer_groups: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/customerGroups.js' product_price_rule_condition_customers: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/customers.js' + product_price_rule_condition_guest: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/guest.js' + product_price_rule_condition_not_combinable_with_cart_price_voucher_rule: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/not_combinable.js' product_price_rule_condition_quantity: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/quantity.js' product_price_rule_condition_stores: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/stores.js' product_price_rule_condition_zones: '/bundles/coreshopcore/pimcore/js/product/pricerule/conditions/zones.js' @@ -63,12 +67,15 @@ core_shop_core: product_specific_price_rule_condition_currencies: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/currencies.js' product_specific_price_rule_condition_customer_groups: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/customerGroups.js' product_specific_price_rule_condition_customers: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/customers.js' + product_specific_price_rule_condition_guest: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/guest.js' + product_specific_price_rule_condition_not_combinable_with_cart_price_voucher_rule: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/not_combinable.js' product_specific_price_rule_condition_stores: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/stores.js' product_specific_price_rule_condition_zones: '/bundles/coreshopcore/pimcore/js/product/specificprice/conditions/zones.js' product_quantity_price_rules_condition_countries: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/countries.js' product_quantity_price_rules_condition_currencies: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/currencies.js' product_quantity_price_rules_condition_customer_groups: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/customerGroups.js' product_quantity_price_rules_condition_customers: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/customers.js' + product_quantity_price_rules_condition_guest: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/guest.js' product_quantity_price_rules_condition_stores: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/stores.js' product_quantity_price_rules_condition_zones: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/zones.js' product_quantity_price_rules_condition_timespan: '/bundles/coreshopcore/pimcore/js/productquantitypricerules/conditions/timespan.js' @@ -81,6 +88,7 @@ core_shop_core: cart_pricerule_condition_currencies: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/currencies.js' cart_pricerule_condition_customer_groups: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/customerGroups.js' cart_pricerule_condition_customers: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/customers.js' + cart_pricerule_condition_guest: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/guest.js' cart_pricerule_condition_products: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/products.js' cart_pricerule_condition_stores: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/stores.js' cart_pricerule_condition_zones: '/bundles/coreshopcore/pimcore/js/cart/pricerules/conditions/zones.js' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/cart-processor.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/cart-processor.yml index a2776d83a5..5bea7ad7e2 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/cart-processor.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/cart-processor.yml @@ -2,12 +2,6 @@ services: _defaults: public: true - CoreShop\Component\Core\Order\Processor\CartTextProcessor: - arguments: - - '@coreshop.translation_locale_provider' - tags: - - { name: coreshop.cart_processor, priority: 700 } - CoreShop\Component\Core\Order\Processor\CartItemProcessor: arguments: - '@CoreShop\Component\Core\Product\ProductTaxCalculatorFactoryInterface' @@ -28,6 +22,13 @@ services: tags: - { name: coreshop.cart_processor, priority: 600 } + CoreShop\Component\Core\Order\Processor\CartItemsImmutableProcessor: + arguments: + - '@CoreShop\Component\Core\Order\Processor\CartItemProcessor' + - '@CoreShop\Component\Order\Cart\CartContextResolverInterface' + tags: + - { name: coreshop.cart_processor, priority: 605 } + CoreShop\Component\Core\Order\Processor\CartSubtotalProcessor: tags: - { name: coreshop.cart_processor, priority: 580 } @@ -68,6 +69,12 @@ services: tags: - { name: coreshop.cart_processor, priority: 400 } + CoreShop\Component\Core\Order\Processor\CartTextProcessor: + arguments: + - '@coreshop.translation_locale_provider' + tags: + - { name: coreshop.cart_processor, priority: 380 } + CoreShop\Component\Core\Order\Processor\CartTaxProcessor: arguments: - '@CoreShop\Component\Taxation\Collector\TaxCollectorInterface' @@ -81,9 +88,11 @@ services: arguments: - '%coreshop.currency.decimal_factor%' - '%coreshop.currency.decimal_precision%' - - '@CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculator' + - '@CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculatorInterface' - '@CoreShop\Component\Order\Cart\CartContextResolverInterface' - '@coreshop.factory.adjustment' + - '@CoreShop\Component\Payment\Checker\PaymentProviderRuleCheckerInterface' + - '@Pimcore\Translation\Translator' tags: - { name: coreshop.cart_processor, priority: 300 } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/context.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/context.yml index f62f78a5a1..954e3c9737 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/context.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/context.yml @@ -36,7 +36,7 @@ services: # country store resolver CoreShop\Component\Core\Context\StoreBasedCartContext: - decorates: CoreShop\Component\Order\Context\CartContext + decorates: coreshop.storage_list.context.factory.order arguments: - '@CoreShop\Component\Core\Context\StoreBasedCartContext.inner' - '@CoreShop\Component\Core\Context\ShopperContextInterface' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/listeners.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/listeners.yml index 831a264416..ee3c35b729 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/listeners.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/listeners.yml @@ -95,3 +95,7 @@ services: - '@router' tags: - { name: kernel.event_subscriber } + + CoreShop\Bundle\CoreBundle\EventListener\RecursiveVariantCacheInvalidationEventListener: + tags: + - { name: kernel.event_subscriber } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/notification.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/notification.yml index afba6c9a99..7a4cba4784 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/notification.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/notification.yml @@ -116,6 +116,10 @@ services: tags: - { name: coreshop.notification_rule.condition, type: backendCreated, notification-type: order, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Notification\Condition\BackendCreatedConfigurationType } + CoreShop\Component\Core\Notification\Rule\Condition\Order\BackendUpdateChecker: + tags: + - { name: coreshop.notification_rule.condition, type: backendUpdated, notification-type: order } + #### PAYMENT coreshop.notification_rule.condition.payment.payment_state: class: CoreShop\Component\Core\Notification\Rule\Condition\SimpleStateChecker @@ -281,3 +285,8 @@ services: - { name: kernel.event_listener, event: coreshop.customer.register, method: applyRegisterCustomerRule } - { name: kernel.event_listener, event: coreshop.customer.request_newsletter_confirm, method: applyNewsletterConfirmRequestRule } - { name: kernel.event_listener, event: coreshop.customer.newsletter_confirm_post, method: applyNewsletterConfirmed } + + CoreShop\Bundle\CoreBundle\EventListener\NotificationRules\OrderUpdateListener: + parent: CoreShop\Bundle\CoreBundle\EventListener\NotificationRules\AbstractNotificationRuleListener + tags: + - { name: kernel.event_listener, event: coreshop.order.backend_update_save, method: applyOrderUpdateNotification } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/order.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/order.yml index fef5bc9f70..6e75d39ec5 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/order.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/order.yml @@ -1,5 +1,5 @@ parameters: - coreshop.form.type.order.payment.validation_groups: [coreshop] + coreshop.form.type.order.payment.validation_groups: [coreshop_revise] services: _defaults: @@ -74,6 +74,11 @@ services: CoreShop\Component\Core\Order\Modifier\CartItemQuantityModifier: decorates: coreshop.cart_item.quantity_modifier + coreshop.cart_item.quantity_modifier.backend: + class: CoreShop\Component\Core\Order\Modifier\CartItemQuantityModifier + arguments: + - true + CoreShop\Component\Core\Cart\CartContextResolver: decorates: 'CoreShop\Component\Order\Cart\CartContextResolver' arguments: @@ -100,4 +105,4 @@ services: CoreShop\Bundle\CoreBundle\Twig\AddToCartExtension: tags: - - { name: twig.extension } \ No newline at end of file + - { name: twig.extension } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/payment.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/payment.yml index 822e32e6f4..6088da34ac 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/payment.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/payment.yml @@ -42,6 +42,10 @@ services: tags: - { name: coreshop.payment_provider_rule.condition, type: customerGroups, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CustomerGroupsConfigurationType } + CoreShop\Component\Core\Payment\Rule\Condition\GuestConditionChecker: + tags: + - { name: coreshop.payment_provider_rule.condition, type: guest, form-type: CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType } + CoreShop\Component\Core\Payment\Rule\Condition\StoresConditionChecker: tags: - { name: coreshop.payment_provider_rule.condition, type: stores, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\StoresConfigurationType } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/product-quantity-price-rules.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/product-quantity-price-rules.yml index c6be356605..3ecbf1e8ba 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/product-quantity-price-rules.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/product-quantity-price-rules.yml @@ -9,6 +9,11 @@ services: tags: - { name: coreshop.product_quantity_price_rules.condition, type: customerGroups, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CustomerGroupsConfigurationType } + coreshop.product_quantity_price_rules.rule.condition.guest: + class: CoreShop\Component\Core\Product\Rule\Condition\GuestConditionChecker + tags: + - { name: coreshop.product_quantity_price_rules.condition, type: guest, form-type: CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType } + coreshop.product_quantity_price_rules.rule.condition.countries: class: CoreShop\Component\Core\Product\Rule\Condition\CountriesConditionChecker tags: diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/rules.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/rules.yml index 1b9299a00f..4b453715af 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/rules.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/rules.yml @@ -14,6 +14,12 @@ services: - { name: coreshop.product_price_rule.condition, type: customerGroups, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CustomerGroupsConfigurationType } - { name: coreshop.product_specific_price_rule.condition, type: customerGroups, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CustomerGroupsConfigurationType } + coreshop.rule.condition.guest: + class: CoreShop\Component\Core\Product\Rule\Condition\GuestConditionChecker + tags: + - { name: coreshop.product_price_rule.condition, type: guest, form-type: CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType } + - { name: coreshop.product_specific_price_rule.condition, type: guest, form-type: CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType } + coreshop.rule.condition.countries: class: CoreShop\Component\Core\Product\Rule\Condition\CountriesConditionChecker tags: @@ -38,6 +44,12 @@ services: - { name: coreshop.product_price_rule.condition, type: currencies, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CurrenciesConfigurationType } - { name: coreshop.product_specific_price_rule.condition, type: currencies, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CurrenciesConfigurationType } + coreshop.rule.condition.not_combinable_with_cart_price_voucher_rule: + class: CoreShop\Component\Core\Product\Rule\Condition\NotCombinableWithCartPriceRuleVoucherConditionChecker + tags: + - { name: coreshop.product_price_rule.condition, type: not_combinable_with_cart_price_voucher_rule, form-type: CoreShop\Bundle\OrderBundle\Form\Type\Rule\Condition\NotCombinableConfigurationType } + - { name: coreshop.product_specific_price_rule.condition, type: not_combinable_with_cart_price_voucher_rule, form-type: CoreShop\Bundle\OrderBundle\Form\Type\Rule\Condition\NotCombinableConfigurationType } + coreshop.product_price_rule.condition.categories: class: CoreShop\Component\Core\Product\Rule\Condition\CategoriesConditionChecker arguments: @@ -82,6 +94,11 @@ services: tags: - { name: coreshop.cart_price_rule.condition, type: customerGroups, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CustomerGroupsConfigurationType } + coreshop.rule.cart_price_rule.condition.guest: + class: CoreShop\Component\Core\Cart\Rule\Condition\GuestConditionChecker + tags: + - { name: coreshop.cart_price_rule.condition, type: guest, form-type: CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType } + coreshop.rule.cart_price_rule.condition.countries: class: CoreShop\Component\Core\Cart\Rule\Condition\CountriesConditionChecker tags: diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/shipping.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/shipping.yml index c1e75582a5..c018f32d31 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/services/shipping.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/services/shipping.yml @@ -30,6 +30,10 @@ services: tags: - { name: coreshop.shipping_rule.condition, type: customerGroups, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\CustomerGroupsConfigurationType } + CoreShop\Component\Core\Shipping\Rule\Condition\GuestConditionChecker: + tags: + - { name: coreshop.shipping_rule.condition, type: guest, form-type: CoreShop\Bundle\RuleBundle\Form\Type\Rule\EmptyConfigurationFormType } + CoreShop\Component\Core\Shipping\Rule\Condition\StoresConditionChecker: tags: - { name: coreshop.shipping_rule.condition, type: stores, form-type: CoreShop\Bundle\CoreBundle\Form\Type\Rule\Condition\StoresConfigurationType } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/config/validation/Order.yml b/src/CoreShop/Bundle/CoreBundle/Resources/config/validation/Order.yml index 3927ba3373..7d76e0ca11 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/config/validation/Order.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/config/validation/Order.yml @@ -1,5 +1,5 @@ CoreShop\Component\Core\Model\Order: constraints: - \CoreShop\Bundle\CoreBundle\Validator\Constraints\CartStockAvailability: { groups: ['coreshop'] } - - \CoreShop\Bundle\CoreBundle\Validator\Constraints\CartMinimumQuantity: { messageBelowMinimum: 'coreshop.cart_item.quantity_below_min_limit', groups: ['coreshop'] } - - \CoreShop\Bundle\CoreBundle\Validator\Constraints\CartMaximumQuantity: { messageAboveMaximum: 'coreshop.cart_item.quantity_above_max_limit', groups: ['coreshop'] } + - \CoreShop\Bundle\CoreBundle\Validator\Constraints\CartMinimumQuantity: { messageBelowMinimum: 'coreshop.cart_item.quantity_below_min_limit', groups: ['coreshop', 'coreshop_revise'] } + - \CoreShop\Bundle\CoreBundle\Validator\Constraints\CartMaximumQuantity: { messageAboveMaximum: 'coreshop.cart_item.quantity_above_max_limit', groups: ['coreshop', 'coreshop_revise'] } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrder.json b/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrder.json index 991adb9682..562a8730b4 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrder.json +++ b/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrder.json @@ -143,7 +143,7 @@ "columnLength": 190, "phpdocType": "string", "regex": "", - "unique": false, + "unique": true, "showCharCount": null, "name": "token", "title": "coreshop.order.token", @@ -3167,6 +3167,41 @@ "invisible": false, "visibleGridView": false, "visibleSearch": false + }, + { + "name": "immutable", + "title": "coreshop.order.immutable", + "tooltip": "", + "mandatory": false, + "noteditable": true, + "index": false, + "locked": false, + "style": "", + "permissions": null, + "datatype": "data", + "fieldtype": "booleanSelect", + "relationType": false, + "invisible": false, + "visibleGridView": false, + "visibleSearch": false, + "yesLabel": "yes", + "noLabel": "no", + "emptyLabel": "null", + "options": [ + { + "key": "no", + "value": 0 + }, + { + "key": "yes", + "value": 1 + }, + { + "key": "null", + "value": -1 + } + ], + "width": "" } ], "locked": false, diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrderItem.json b/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrderItem.json index 9a85c045da..62b5acede0 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrderItem.json +++ b/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopOrderBundle/CoreShopOrderItem.json @@ -473,7 +473,7 @@ "title": "coreshop.order_item.order", "tooltip": "", "mandatory": false, - "noteditable": false, + "noteditable": true, "index": false, "locked": false, "style": "", @@ -499,6 +499,41 @@ "documentTypes": [], "stack": "coreshop.order", "returnConcrete": false + }, + { + "name": "immutable", + "title": "coreshop.order_item.immutable", + "tooltip": "", + "mandatory": false, + "noteditable": true, + "index": false, + "locked": false, + "style": "", + "permissions": null, + "datatype": "data", + "fieldtype": "booleanSelect", + "relationType": false, + "invisible": false, + "visibleGridView": false, + "visibleSearch": false, + "yesLabel": "yes", + "noLabel": "no", + "emptyLabel": "null", + "options": [ + { + "key": "no", + "value": 0 + }, + { + "key": "yes", + "value": 1 + }, + { + "key": "null", + "value": -1 + } + ], + "width": "" } ], "locked": false diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopWishlistBundle/CoreShopWishlist.json b/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopWishlistBundle/CoreShopWishlist.json index 29c24498a2..e70c1b6757 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopWishlistBundle/CoreShopWishlist.json +++ b/src/CoreShop/Bundle/CoreBundle/Resources/install/pimcore/classes/CoreShopWishlistBundle/CoreShopWishlist.json @@ -57,7 +57,7 @@ "columnLength": 190, "regex": "", "regexFlags": [], - "unique": false, + "unique": true, "showCharCount": false, "defaultValueGenerator": "" }, diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/css/core.css b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/css/core.css index 73702fd35e..5ac67607a9 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/css/core.css +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/css/core.css @@ -88,6 +88,10 @@ body.pimcore_version_11 .coreshop_nav_icon_customer_to_company_assign_to_existin background: url(../img/customer.svg) center center no-repeat !important; } +.coreshop_rule_icon_condition_not_combinable_with_cart_price_voucher_rule { + background: url(../img/not_combinable.svg) center center no-repeat !important; +} + .coreshop_rule_icon_condition_countries { background: url(../img/countries.svg) center center no-repeat !important; } @@ -120,6 +124,10 @@ body.pimcore_version_11 .coreshop_nav_icon_customer_to_company_assign_to_existin background: url(../img/customer-group.svg) center center no-repeat !important; } +.coreshop_rule_icon_condition_guest { + background: url(../img/guest.svg) center center no-repeat !important; +} + .coreshop_icon_report { background: url(../img/charts.svg) center center no-repeat !important; } @@ -210,7 +218,8 @@ body.pimcore_version_11 .coreshop_nav_icon_customer_to_company_assign_to_existin background: url(../img/store-mail.svg) center center no-repeat !important; } -.coreshop_rule_icon_condition_backendCreated { +.coreshop_rule_icon_condition_backendCreated, +.coreshop_rule_icon_condition_backendUpdated { background: url(../img/orders-backend.svg) center center no-repeat !important; } diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/img/guest.svg b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/img/guest.svg new file mode 100644 index 0000000000..7cd7f9738e --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/img/guest.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/img/not_combinable.svg b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/img/not_combinable.svg new file mode 100644 index 0000000000..fd9222e7c2 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/img/not_combinable.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/cart/pricerules/conditions/guest.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/cart/pricerules/conditions/guest.js new file mode 100644 index 0000000000..0bdfc42ef5 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/cart/pricerules/conditions/guest.js @@ -0,0 +1,14 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.cart.pricerules.conditions.guest'); +coreshop.cart.pricerules.conditions.guest = Class.create(coreshop.product.pricerule.conditions.guest, {}); diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/payment/rules/conditions/guest.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/payment/rules/conditions/guest.js new file mode 100644 index 0000000000..05fed85c03 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/payment/rules/conditions/guest.js @@ -0,0 +1,14 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.paymentproviderrule.conditions.guest'); +coreshop.paymentproviderrule.conditions.guest = Class.create(coreshop.shippingrule.conditions.guest, {}); diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/pricerule/conditions/guest.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/pricerule/conditions/guest.js new file mode 100644 index 0000000000..e8ad7cd9f1 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/pricerule/conditions/guest.js @@ -0,0 +1,14 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.product.pricerule.conditions.guest'); +coreshop.product.pricerule.conditions.guest = Class.create(coreshop.shippingrule.conditions.guest, {}); diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/pricerule/conditions/not_combinable.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/pricerule/conditions/not_combinable.js new file mode 100644 index 0000000000..1b10060e3d --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/pricerule/conditions/not_combinable.js @@ -0,0 +1,54 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.product.pricerule.conditions.not_combinable_with_cart_price_voucher_rule'); +coreshop.product.pricerule.conditions.not_combinable_with_cart_price_voucher_rule = Class.create(coreshop.rules.conditions.abstract, { + type: 'not_combinable_with_cart_price_voucher_rule', + + getForm: function () { + var me = this; + + var price_rules = { + fieldLabel: t('coreshop_condition_not_combinable'), + typeAhead: true, + listWidth: 100, + width: 500, + store: { + type: 'coreshop_cart_price_voucher_rules' + }, + displayField: 'name', + valueField: 'id', + forceSelection: true, + multiselect: true, + triggerAction: 'all', + name: 'price_rules', + height: 400, + delimiter: false, + value: me.data.countries + }; + + + if (this.data && this.data.price_rules) { + price_rules.value = this.data.price_rules; + } + + price_rules = new Ext.ux.form.MultiSelect(price_rules); + + this.form = new Ext.form.Panel({ + items: [ + price_rules + ] + }); + + return this.form; + } +}); \ No newline at end of file diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/specificprice/conditions/guest.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/specificprice/conditions/guest.js new file mode 100644 index 0000000000..7794c6f51f --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/specificprice/conditions/guest.js @@ -0,0 +1,14 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.product.specificprice.conditions.guest'); +coreshop.product.specificprice.conditions.guest = Class.create(coreshop.product.pricerule.conditions.guest, {}); diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/specificprice/conditions/not_combinable.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/specificprice/conditions/not_combinable.js new file mode 100644 index 0000000000..8d0aed2bc7 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/product/specificprice/conditions/not_combinable.js @@ -0,0 +1,14 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.product.pricerule.conditions.not_combinable_with_cart_price_voucher_rule'); +coreshop.product.specificprice.conditions.not_combinable_with_cart_price_voucher_rule = Class.create(coreshop.product.pricerule.conditions.not_combinable_with_cart_price_voucher_rule, {}); \ No newline at end of file diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/productquantitypricerules/conditions/guest.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/productquantitypricerules/conditions/guest.js new file mode 100644 index 0000000000..409714b9e8 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/productquantitypricerules/conditions/guest.js @@ -0,0 +1,14 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.product_quantity_price_rules.conditions.guest'); +coreshop.product_quantity_price_rules.conditions.customerGroups = Class.create(coreshop.product.pricerule.conditions.guest, {}); diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/shipping/rules/conditions/guest.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/shipping/rules/conditions/guest.js new file mode 100644 index 0000000000..2832d0220b --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/shipping/rules/conditions/guest.js @@ -0,0 +1,16 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.shippingrule.conditions.guest'); +coreshop.shippingrule.conditions.guest = Class.create(coreshop.rules.conditions.abstract, { + type: 'guest', +}); diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/workflow/variantUnitDefinitionSolidifier.js b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/workflow/variantUnitDefinitionSolidifier.js index 0ccfdf7217..2ae167a733 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/workflow/variantUnitDefinitionSolidifier.js +++ b/src/CoreShop/Bundle/CoreBundle/Resources/public/pimcore/js/workflow/variantUnitDefinitionSolidifier.js @@ -26,7 +26,7 @@ coreshop.product.workflow.variantUnitDefinitionSolidifier = Class.create({ this.data = object.data; Ext.Ajax.request({ - url: Routing.generate('coreshop_admin_purchsable_variant_unit_solidifier_check', {objectid: this.object.general.id}), + url: Routing.generate('coreshop_admin_purchsable_variant_unit_solidifier_check', {objectId: this.object.general.id}), method: 'GET', success: function (response) { var res = Ext.decode(response.responseText); @@ -58,7 +58,7 @@ coreshop.product.workflow.variantUnitDefinitionSolidifier = Class.create({ this.panel.setLoading(t('loading')); Ext.Ajax.request({ - url: Routing.generate('coreshop_admin_purchsable_variant_unit_solidifier_apply', {objectid: this.object.general.id}), + url: Routing.generate('coreshop_admin_purchsable_variant_unit_solidifier_apply', {objectId: this.object.general.id}), method: 'PUT', success: function (response) { diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.de.yml b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.de.yml index e9ff192603..929f395cb6 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.de.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.de.yml @@ -21,6 +21,7 @@ coreshop_condition_countries: 'Länder' coreshop_condition_zones: 'Zonen' coreshop_condition_categories: 'Kategorien' coreshop_condition_recursive: 'Alle Unterkategorien miteinbeziehen' +coreshop_condition_not_combinable_with_cart_price_rule: 'Nicht kombinierbar mit Warenkorb Gutschein Preisregeln' coreshop_action_giftProduct: 'Geschenkprodukt' coreshop_action_voucherCredit: 'Gutscheinwert' coreshop_zones: 'Zonen' @@ -122,6 +123,7 @@ coreshop_prices_are_gross: 'Preise sind Bruttopreise' coreshop_condition_stores: 'Stores' coreshop_condition_customers: 'Kunden' coreshop_condition_customerGroups: 'Kundengruppen' +coreshop_condition_guest: 'Gast' coreshop_condition_carriers: 'Lieferdienste' coreshop_condition_quantity: 'Menge' coreshop_condition_comment: 'Kommentar' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.en.yml b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.en.yml index 0022bbadbc..a41ecf2bb6 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.en.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.en.yml @@ -20,6 +20,7 @@ coreshop_condition_countries: 'Countries' coreshop_condition_zones: 'Zones' coreshop_condition_categories: 'Categories' coreshop_condition_recursive: 'Include all Subcategories' +coreshop_condition_not_combinable_with_cart_price_voucher_rule: 'Not combinable with Cart Price Voucher Rules' coreshop_action_giftProduct: 'Gift Product' coreshop_action_voucherCredit: 'Voucher Credit' coreshop_zones: 'Zones' @@ -121,6 +122,7 @@ coreshop_prices_are_gross: 'Prices are gross prices' coreshop_condition_stores: 'Stores' coreshop_condition_customers: 'Customers' coreshop_condition_customerGroups: 'Customer Groups' +coreshop_condition_guest: 'Guest' coreshop_condition_carriers: 'Carriers' coreshop_condition_quantity: 'Quantity' coreshop_condition_comment: 'Comment' @@ -201,6 +203,7 @@ coreshop_allowed_countries: 'Allowed Countries' coreshop_operator_store_price: 'Operator Store Price' coreshop_operator_store_price_settings: 'Operator Store Price Settings' coreshop_condition_backendCreated: 'Backend created' +coreshop_condition_backendUpdated: 'Backend updated' coreshop_condition_include_variants: 'Include Variants' coreshop_product_quantity_price_rules_behaviour_amount_decrease: 'Amount Decrease' coreshop_product_quantity_price_rules_behaviour_amount_increase: 'Amount Increase' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.it.yml b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.it.yml index 10a40ef1c2..5c30354f2f 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.it.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.it.yml @@ -107,6 +107,7 @@ coreshop_prices_are_gross: 'I prezzi sono prezzi lordi' coreshop_condition_stores: 'Negozi' coreshop_condition_customers: 'Clienti' coreshop_condition_customerGroups: 'Gruppi di clienti' +coreshop_condition_guest: 'Ospite' coreshop_condition_carriers: 'Vettori' coreshop_condition_quantity: 'Quantità' coreshop_condition_comment: 'Commento' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.sv.yml b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.sv.yml index 54c16d1762..ee21f10087 100644 --- a/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.sv.yml +++ b/src/CoreShop/Bundle/CoreBundle/Resources/translations/admin.sv.yml @@ -107,6 +107,7 @@ coreshop_prices_are_gross: 'Priser är brutto' coreshop_condition_stores: 'Butiker' coreshop_condition_customers: 'Kunder' coreshop_condition_customerGroups: 'Kundgrupper' +coreshop_condition_guest: 'Gäst' coreshop_condition_carriers: 'Transportörer' coreshop_condition_quantity: 'Kvantitet' coreshop_condition_comment: 'Kommentar' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/translations/messages.de.yml b/src/CoreShop/Bundle/CoreBundle/Resources/translations/messages.de.yml new file mode 100644 index 0000000000..b44f4b8efd --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/translations/messages.de.yml @@ -0,0 +1 @@ +coreshop.paymentprovider.rule.label: 'Zahlungsgebühr' diff --git a/src/CoreShop/Bundle/CoreBundle/Resources/translations/messages.en.yml b/src/CoreShop/Bundle/CoreBundle/Resources/translations/messages.en.yml new file mode 100644 index 0000000000..0d154f52d9 --- /dev/null +++ b/src/CoreShop/Bundle/CoreBundle/Resources/translations/messages.en.yml @@ -0,0 +1 @@ +coreshop.paymentprovider.rule.label: 'Payment fee' diff --git a/src/CoreShop/Bundle/CoreBundle/Security/AccessVoter.php b/src/CoreShop/Bundle/CoreBundle/Security/AccessVoter.php index 23cb8bb537..61619c0dfb 100644 --- a/src/CoreShop/Bundle/CoreBundle/Security/AccessVoter.php +++ b/src/CoreShop/Bundle/CoreBundle/Security/AccessVoter.php @@ -28,6 +28,9 @@ public function __construct( ) { } + /** + * @phpstan-ignore-next-line + */ protected function supports(string $attribute, $subject): bool { return str_starts_with($attribute, $this->prefix); diff --git a/src/CoreShop/Bundle/CurrencyBundle/CoreExtension/MoneyCurrency.php b/src/CoreShop/Bundle/CurrencyBundle/CoreExtension/MoneyCurrency.php index d240245170..e609e43b13 100644 --- a/src/CoreShop/Bundle/CurrencyBundle/CoreExtension/MoneyCurrency.php +++ b/src/CoreShop/Bundle/CurrencyBundle/CoreExtension/MoneyCurrency.php @@ -221,7 +221,7 @@ public function getDataFromEditmode(mixed $data, Concrete $object = null, array public function getVersionPreview(mixed $data, Concrete $object = null, array $params = []): string { - return $data; + return (string) $data; } public function checkValidity(mixed $data, bool $omitMandatoryCheck = false, array $params = []): void diff --git a/src/CoreShop/Bundle/CurrencyBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/CurrencyBundle/DependencyInjection/Configuration.php index e30a769d49..f2040952b3 100644 --- a/src/CoreShop/Bundle/CurrencyBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/CurrencyBundle/DependencyInjection/Configuration.php @@ -64,6 +64,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->scalarNode('permission')->defaultValue('currency')->cannotBeOverwritten()->end() ->arrayNode('classes') ->addDefaultsIfNotSet() diff --git a/src/CoreShop/Bundle/CurrencyBundle/README.md b/src/CoreShop/Bundle/CurrencyBundle/README.md index 2d82c15401..4a256de23d 100644 --- a/src/CoreShop/Bundle/CurrencyBundle/README.md +++ b/src/CoreShop/Bundle/CurrencyBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/CustomerBundle/README.md b/src/CoreShop/Bundle/CustomerBundle/README.md index bc31b98d19..fe41e51163 100644 --- a/src/CoreShop/Bundle/CustomerBundle/README.md +++ b/src/CoreShop/Bundle/CustomerBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php index 631d8b7d4d..37132d305b 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/CartController.php @@ -402,6 +402,7 @@ public static function getSubscribedServices(): array new SubscribedService('event_dispatcher', EventDispatcherInterface::class), new SubscribedService('coreshop.repository.cart_price_rule_voucher_code', CartPriceRuleVoucherRepositoryInterface::class), new SubscribedService(CartPriceRuleProcessorInterface::class, CartPriceRuleProcessorInterface::class), + new SubscribedService(CartPriceRuleUnProcessorInterface::class, CartPriceRuleUnProcessorInterface::class), ], ); } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/CheckoutController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/CheckoutController.php index 6b3cac03c1..d71d327599 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/CheckoutController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/CheckoutController.php @@ -33,6 +33,7 @@ use CoreShop\Component\Order\OrderSaleTransitions; use CoreShop\Component\Order\OrderTransitions; use CoreShop\Component\Order\Repository\OrderRepositoryInterface; +use CoreShop\Component\Resource\TokenGenerator\UniqueTokenGenerator; use CoreShop\Component\Tracking\Tracker\TrackerInterface; use Payum\Core\Payum; use Symfony\Component\HttpFoundation\Request; @@ -205,6 +206,15 @@ public function doCheckoutAction(Request $request): Response */ $order = $this->getCart(); + //Fallback for Orders/Carts without token (eg. legacy carts) + //will be removed in future + //@Todo: remove with CoreShop 5.0 + if (!$order->getToken()) { + $tokenGenerator = new UniqueTokenGenerator(); + $order->setToken($tokenGenerator->generate(10)); + $order->save(); + } + $workflow = $this->container->get(StateMachineManagerInterface::class)->get($order, OrderSaleTransitions::IDENTIFIER); if ($order->getSaleState() !== OrderSaleStates::STATE_ORDER) { @@ -227,7 +237,7 @@ public function doCheckoutAction(Request $request): Response return $event->getResponse(); } - $response = $this->redirectToRoute('coreshop_payment', ['order' => (string) $order->getId()]); + $response = $this->redirectToRoute('coreshop_payment_token', ['token' => (string) $order->getToken()]); if (0 === $order->getTotal()) { $orderStateMachine = $this->container->get(StateMachineManagerInterface::class)->get($order, 'coreshop_order'); diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php index e937d19994..8a3db90cb7 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/CustomerController.php @@ -24,9 +24,11 @@ use CoreShop\Bundle\ResourceBundle\Event\ResourceControllerEvent; use CoreShop\Component\Address\Model\AddressIdentifierInterface; use CoreShop\Component\Address\Model\AddressInterface; +use CoreShop\Component\Address\Repository\AddressIdentifierRepositoryInterface; use CoreShop\Component\Core\Context\ShopperContextInterface; use CoreShop\Component\Core\Customer\Address\AddressAssignmentManagerInterface; use CoreShop\Component\Core\Model\CustomerInterface; +use CoreShop\Component\Customer\Repository\CustomerRepositoryInterface; use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Repository\OrderRepositoryInterface; use CoreShop\Component\Pimcore\DataObject\VersionHelper; @@ -368,8 +370,10 @@ public static function getSubscribedServices(): array ShopperContextInterface::class, AddressAssignmentManagerInterface::class, new SubscribedService('coreshop.repository.order', OrderRepositoryInterface::class), + new SubscribedService('coreshop.repository.customer', CustomerRepositoryInterface::class), new SubscribedService('coreshop.repository.address', RepositoryInterface::class, attributes: new Autowire(service: 'coreshop.repository.address')), new SubscribedService('coreshop.factory.address', FactoryInterface::class, attributes: new Autowire(service: 'coreshop.factory.address')), + new SubscribedService('coreshop.repository.address_identifier', AddressIdentifierRepositoryInterface::class), new SubscribedService('event_dispatcher', EventDispatcherInterface::class), ]); } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/MailController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/MailController.php index 77b985a1d6..417d1d770b 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/MailController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/MailController.php @@ -22,6 +22,7 @@ use Pimcore\Http\Request\Resolver\EditmodeResolver; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Service\Attribute\SubscribedService; class MailController extends FrontendController { @@ -41,4 +42,14 @@ public function orderConfirmationAction(Request $request): Response return $this->render($this->getTemplateConfigurator()->findTemplate('Mail/order-confirmation.html'), $viewParameters); } + + public static function getSubscribedServices(): array + { + return array_merge( + parent::getSubscribedServices(), + [ + new SubscribedService(EditmodeResolver::class, EditmodeResolver::class), + ], + ); + } } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/OrderController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/OrderController.php index 2d0bdd3503..951f0fd4f0 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/OrderController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/OrderController.php @@ -97,4 +97,15 @@ protected function getFormFactory(): FormFactoryInterface { return $this->container->get('form.factory'); } + + public static function getSubscribedServices(): array + { + return array_merge( + parent::getSubscribedServices(), + [ + 'coreshop.repository.order' => OrderRepositoryInterface::class, + 'coreshop.repository.payment' => PaymentRepositoryInterface::class, + ], + ); + } } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/ProductController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/ProductController.php index c35088af0c..f127aa0ccf 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/ProductController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/ProductController.php @@ -18,6 +18,7 @@ namespace CoreShop\Bundle\FrontendBundle\Controller; +use CoreShop\Bundle\ResourceBundle\Pimcore\Repository\StackRepositoryInterface; use CoreShop\Component\Core\Model\ProductInterface; use CoreShop\Component\Core\Repository\ProductRepositoryInterface; use CoreShop\Component\Order\Model\PurchasableInterface; @@ -93,6 +94,7 @@ public static function getSubscribedServices(): array 'coreshop.repository.product' => ProductRepositoryInterface::class, StoreContextInterface::class => StoreContextInterface::class, TrackerInterface::class => TrackerInterface::class, + 'coreshop.repository.stack.purchasable' => StackRepositoryInterface::class, ]); } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/QuoteController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/QuoteController.php index 51ef0405af..c74717a503 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/QuoteController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/QuoteController.php @@ -23,7 +23,9 @@ use CoreShop\Component\Customer\Context\CustomerNotFoundException; use CoreShop\Component\Customer\Model\CustomerInterface; use CoreShop\Component\Order\OrderSaleStates; +use CoreShop\Component\Order\Repository\OrderRepositoryInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Contracts\Service\Attribute\SubscribedService; class QuoteController extends FrontendController { @@ -55,4 +57,12 @@ public function showAction(Request $request) 'quote' => $quote, ]); } + + public static function getSubscribedServices(): array + { + return array_merge(parent::getSubscribedServices(), [ + CustomerContextInterface::class => CustomerContextInterface::class, + new SubscribedService('coreshop.repository.order', OrderRepositoryInterface::class), + ]); + } } diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php index 6108b7d798..00f2ee8963 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/RegisterController.php @@ -55,7 +55,7 @@ public function registerAction(Request $request): Response if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) { $form = $form->handleRequest($request); - if ($form->isValid()) { + if ($form->isSubmitted() && $form->isValid()) { $customer = $form->getData(); $customer->setLocaleCode($this->container->get('coreshop.context.locale')->getLocaleCode()); diff --git a/src/CoreShop/Bundle/FrontendBundle/Controller/SearchController.php b/src/CoreShop/Bundle/FrontendBundle/Controller/SearchController.php index fdecb7e739..dffe27eb59 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Controller/SearchController.php +++ b/src/CoreShop/Bundle/FrontendBundle/Controller/SearchController.php @@ -19,11 +19,13 @@ namespace CoreShop\Bundle\FrontendBundle\Controller; use CoreShop\Bundle\FrontendBundle\Form\Type\SearchType; +use CoreShop\Component\Core\Repository\ProductRepositoryInterface; use CoreShop\Component\Store\Context\StoreContextInterface; use Knp\Component\Pager\PaginatorInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Contracts\Service\Attribute\SubscribedService; class SearchController extends FrontendController { @@ -44,7 +46,7 @@ public function searchAction(Request $request): Response if ($form->isSubmitted() && $form->isValid()) { $formData = $form->getData(); $text = $formData['text']; - $page = $this->getParameterFromRequest($request, 'page', 1); + $page = (int) $this->getParameterFromRequest($request, 'page', 1); $itemsPerPage = 10; $query = [ @@ -91,4 +93,16 @@ protected function getPaginator(): PaginatorInterface { return $this->container->get(PaginatorInterface::class); } + + public static function getSubscribedServices(): array + { + return array_merge( + parent::getSubscribedServices(), + [ + new SubscribedService(StoreContextInterface::class, StoreContextInterface::class), + new SubscribedService('coreshop.repository.product', ProductRepositoryInterface::class), + new SubscribedService(PaginatorInterface::class, PaginatorInterface::class), + ], + ); + } } diff --git a/src/CoreShop/Bundle/FrontendBundle/CoreShopFrontendBundle.php b/src/CoreShop/Bundle/FrontendBundle/CoreShopFrontendBundle.php index 61b3cff1fd..cf162ec3ac 100644 --- a/src/CoreShop/Bundle/FrontendBundle/CoreShopFrontendBundle.php +++ b/src/CoreShop/Bundle/FrontendBundle/CoreShopFrontendBundle.php @@ -31,7 +31,7 @@ final class CoreShopFrontendBundle extends AbstractPimcoreBundle implements Depe { public static function registerDependentBundles(BundleCollection $collection): void { - $collection->addBundle(new CoreShopCoreBundle(), 1600); + $collection->addBundle(new CoreShopCoreBundle(), 100); $collection->addBundle(new EmailizrBundle(), 1000); } diff --git a/src/CoreShop/Bundle/FrontendBundle/README.md b/src/CoreShop/Bundle/FrontendBundle/README.md index c0af6c5587..85a3c6a4e3 100644 --- a/src/CoreShop/Bundle/FrontendBundle/README.md +++ b/src/CoreShop/Bundle/FrontendBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/FrontendBundle/Resources/install/pimcore/staticroutes.yml b/src/CoreShop/Bundle/FrontendBundle/Resources/install/pimcore/staticroutes.yml index 7f14c867e8..314ce976e3 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Resources/install/pimcore/staticroutes.yml +++ b/src/CoreShop/Bundle/FrontendBundle/Resources/install/pimcore/staticroutes.yml @@ -134,6 +134,7 @@ routes: variables: _locale,token priority: 2 + # Deprecated: this route will be removed in the next major release of CoreShop. Use coreshop_payment_token instead. coreshop_payment: pattern: '/(\w+)\/shop\/pay\/([0-9]+)$/' reverse: '/%_locale/shop/pay/%order' @@ -141,6 +142,13 @@ routes: variables: _locale,order priority: 2 + coreshop_payment_token: + pattern: '/(\w+)\/shop\/pay\/(.*)$/' + reverse: '/%_locale/shop/pay/%token' + controller: 'CoreShop\Bundle\PayumBundle\Controller\PaymentController::prepareCaptureAction' + variables: _locale,token + priority: 3 + coreshop_switch_currency: pattern: '/(\w+)\/shop\/switch-currency\/(.*)$/' reverse: '/%_locale/shop/switch-currency/%currencyCode' diff --git a/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.de.yaml b/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.de.yaml index 2407940f2a..a08fc433bf 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.de.yaml +++ b/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.de.yaml @@ -227,7 +227,6 @@ coreshop.checkout.address.invoice_as_shipping_invalid: 'Die Verwendung der Rechn coreshop.cart_price_rule_voucher_generator.amount.not_blank: 'Die Anzahl der zu erstellenden Gutscheincodes muss mindestens {{ limit }} sein.' coreshop.cart_price_rule_voucher_generator.amount.min: 'Bitte geben Sie die Anzahl der zu generierenden Gutscheincodes ein.' coreshop.cart_price_rule_voucher_generator.length.not_blank: 'Bitte geben Sie eine Gutscheincodelänge ein.' -coreshop.cart_price_rule_voucher_generator.length.min: 'Der Gutscheincode muss mindestens {{ limit }} Zeichen lang sein.' -coreshop.cart_price_rule_voucher_generator.length.max: 'Der Gutscheincode darf nicht länger als {{ limit }} Zeichen lang sein.' +coreshop.cart_price_rule_voucher_generator.length.range: 'Der Gutscheincode muss mindestens {{ min }} und maximal {{ max }} Zeichen lang sein.' coreshop.cart_price_rule_voucher_generator.possible_generation_amount: 'Ungültige Gutscheincodelänge oder ungültiger Gutscheinbetrag. Es ist nicht möglich %expectedAmount% einzigartige Gutscheincodes mit einer Länge von %codeLength% Zeichen zu generieren. Es können maximal %possibleAmount% Gutscheincodes generiert werden.' coreshop.cart_item.quantity.min: 'Die Menge eines Produktes im Warenkorb kann nicht kleiner als 1 sein.' diff --git a/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.en.yaml b/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.en.yaml index 123fd11f74..191bc56206 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.en.yaml +++ b/src/CoreShop/Bundle/FrontendBundle/Resources/translations/messages.en.yaml @@ -227,7 +227,6 @@ coreshop.checkout.address.invoice_as_shipping_invalid: 'Using the invoice addres coreshop.cart_price_rule_voucher_generator.amount.not_blank: 'Amount of coupons to generate must be at least {{ limit }}.' coreshop.cart_price_rule_voucher_generator.amount.min: 'Please enter amount of coupons to generate.' coreshop.cart_price_rule_voucher_generator.length.not_blank: 'Please enter coupon code length.' -coreshop.cart_price_rule_voucher_generator.length.min: 'Coupon code must be at least {{ limit }} characters long.' -coreshop.cart_price_rule_voucher_generator.length.max: 'Coupon code must not be longer than {{ limit }} characters.' +coreshop.cart_price_rule_voucher_generator.length.range: 'Coupon must be at least {{ min }} and at most {{ max }} characters long.' coreshop.cart_price_rule_voucher_generator.possible_generation_amount: 'Invalid coupons code length or coupons amount. It is not possible to generate %expectedAmount% unique coupons with code length %codeLength%. The possible amount to generate is %possibleAmount%.' coreshop.cart_item.quantity.min: 'Quantity of an order item cannot be lower than 1.' diff --git a/src/CoreShop/Bundle/FrontendBundle/Resources/views/Cart/_widget.html.twig b/src/CoreShop/Bundle/FrontendBundle/Resources/views/Cart/_widget.html.twig index da95581e91..06d21aa78d 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Resources/views/Cart/_widget.html.twig +++ b/src/CoreShop/Bundle/FrontendBundle/Resources/views/Cart/_widget.html.twig @@ -4,7 +4,7 @@ diff --git a/src/CoreShop/Bundle/FrontendBundle/Resources/views/Common/order_detail.html.twig b/src/CoreShop/Bundle/FrontendBundle/Resources/views/Common/order_detail.html.twig index cd2952260e..af58320164 100644 --- a/src/CoreShop/Bundle/FrontendBundle/Resources/views/Common/order_detail.html.twig +++ b/src/CoreShop/Bundle/FrontendBundle/Resources/views/Common/order_detail.html.twig @@ -117,10 +117,10 @@ {% endfor %} @@ -226,7 +226,7 @@ {{ 'coreshop.ui.total'|trans }}: diff --git a/src/CoreShop/Bundle/FrontendBundle/composer.json b/src/CoreShop/Bundle/FrontendBundle/composer.json index 4e32a1937b..6c3de444c5 100644 --- a/src/CoreShop/Bundle/FrontendBundle/composer.json +++ b/src/CoreShop/Bundle/FrontendBundle/composer.json @@ -25,7 +25,7 @@ ], "require": { "coreshop/core-bundle": "^4.0", - "dachcom-digital/emailizr": "^2.0.0", + "dachcom-digital/emailizr": "^3.0.0", "pimcore/pimcore": "^11.0" }, "require-dev": { diff --git a/src/CoreShop/Bundle/IndexBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/IndexBundle/DependencyInjection/Configuration.php index e3fcb7b3a9..5204cff6fc 100644 --- a/src/CoreShop/Bundle/IndexBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/IndexBundle/DependencyInjection/Configuration.php @@ -98,6 +98,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('filter')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() diff --git a/src/CoreShop/Bundle/IndexBundle/Installer.php b/src/CoreShop/Bundle/IndexBundle/Installer.php index 99e3d9a178..bd5ea3f10d 100644 --- a/src/CoreShop/Bundle/IndexBundle/Installer.php +++ b/src/CoreShop/Bundle/IndexBundle/Installer.php @@ -56,6 +56,11 @@ public function install(): void parent::install(); } + public function markAllMigrationsInstalled(): void + { + $this->markInstalled(); + } + public function needsReloadAfterInstall(): bool { return true; diff --git a/src/CoreShop/Bundle/IndexBundle/Migrations/Version20200224161101.php b/src/CoreShop/Bundle/IndexBundle/Migrations/Version20200224161101.php index 709f45ccb5..d2c101fa95 100644 --- a/src/CoreShop/Bundle/IndexBundle/Migrations/Version20200224161101.php +++ b/src/CoreShop/Bundle/IndexBundle/Migrations/Version20200224161101.php @@ -25,6 +25,10 @@ class Version20200224161101 extends AbstractMigration { public function up(Schema $schema): void { + if ($schema->getTable('coreshop_index')->hasColumn('indexLastVersion')) { + return; + } + $this->addSql(' ALTER TABLE coreshop_index ADD indexLastVersion TINYINT(1) DEFAULT \'0\' NOT NULL;'); } diff --git a/src/CoreShop/Bundle/IndexBundle/README.md b/src/CoreShop/Bundle/IndexBundle/README.md index 5ff3066881..25cbd2926a 100644 --- a/src/CoreShop/Bundle/IndexBundle/README.md +++ b/src/CoreShop/Bundle/IndexBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/IndexBundle/Resources/config/pimcore/config.yml b/src/CoreShop/Bundle/IndexBundle/Resources/config/pimcore/config.yml index 89b98747fb..02db3788ae 100755 --- a/src/CoreShop/Bundle/IndexBundle/Resources/config/pimcore/config.yml +++ b/src/CoreShop/Bundle/IndexBundle/Resources/config/pimcore/config.yml @@ -2,6 +2,10 @@ imports: - { resource: admin.yml } - { resource: messenger.yml } +doctrine_migrations: + migrations_paths: + 'CoreShop\Bundle\IndexBundle\Migrations': '@CoreShopIndexBundle/Migrations' + pimcore: objects: class_definitions: diff --git a/src/CoreShop/Bundle/IndexBundle/Worker/MysqlWorker/Listing.php b/src/CoreShop/Bundle/IndexBundle/Worker/MysqlWorker/Listing.php index e0d0f68f79..00ca5571ad 100644 --- a/src/CoreShop/Bundle/IndexBundle/Worker/MysqlWorker/Listing.php +++ b/src/CoreShop/Bundle/IndexBundle/Worker/MysqlWorker/Listing.php @@ -441,7 +441,7 @@ protected function addOrderBy(QueryBuilder $queryBuilder) } foreach ($this->orders as $order) { - $queryBuilder->add('orderBy', $this->getWorker()->renderOrder($order, 'q')); + $queryBuilder->add('orderBy', $this->getWorker()->renderOrder($order, 'q'), true); } } diff --git a/src/CoreShop/Bundle/InventoryBundle/README.md b/src/CoreShop/Bundle/InventoryBundle/README.md index c1fe632009..68cccd9913 100644 --- a/src/CoreShop/Bundle/InventoryBundle/README.md +++ b/src/CoreShop/Bundle/InventoryBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/LocaleBundle/README.md b/src/CoreShop/Bundle/LocaleBundle/README.md index 8f8dd30a79..370a266898 100644 --- a/src/CoreShop/Bundle/LocaleBundle/README.md +++ b/src/CoreShop/Bundle/LocaleBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/MenuBundle/README.md b/src/CoreShop/Bundle/MenuBundle/README.md index 00f1d23844..e74bd5dcbf 100644 --- a/src/CoreShop/Bundle/MenuBundle/README.md +++ b/src/CoreShop/Bundle/MenuBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/MessengerBundle/Controller/ListMessagesController.php b/src/CoreShop/Bundle/MessengerBundle/Controller/ListMessagesController.php index ed23665149..3e450fc3d9 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Controller/ListMessagesController.php +++ b/src/CoreShop/Bundle/MessengerBundle/Controller/ListMessagesController.php @@ -34,6 +34,8 @@ class ListMessagesController extends \Pimcore\Bundle\AdminBundle\Controller\Admi { public function listReceiverMessageCountAction(ReceiversRepositoryInterface $receiverLocator): Response { + $this->checkPermission('coreshop_permission_messenger'); + $receivers = []; foreach ($receiverLocator->getReceiversMapping() as $name => $receiver) { $receivers[] = [ @@ -47,6 +49,8 @@ public function listReceiverMessageCountAction(ReceiversRepositoryInterface $rec public function listListableReceiversAction(ReceiversRepositoryInterface $receiverLocator): Response { + $this->checkPermission('coreshop_permission_messenger'); + $receivers = []; foreach ($receiverLocator->getListableReceiversMapping() as $name => $receiver) { $receivers[] = [ @@ -60,6 +64,8 @@ public function listListableReceiversAction(ReceiversRepositoryInterface $receiv public function listFailureReceiversAction(FailureReceiversRepositoryInterface $failureReceivers): Response { + $this->checkPermission('coreshop_permission_messenger'); + $receivers = []; foreach ($failureReceivers->getReceiversWithFailureReceivers() as $name) { $receivers[] = [ @@ -74,6 +80,8 @@ public function listFailedMessagesAction( Request $request, FailedMessageRepositoryInterface $failedMessageRepository, ): Response { + $this->checkPermission('coreshop_permission_messenger'); + $receiverName = $request->attributes->get('receiverName'); if (!is_string($receiverName)) { @@ -89,6 +97,8 @@ public function listMessagesAction( Request $request, MessageRepositoryInterface $messageRepository, ): Response { + $this->checkPermission('coreshop_permission_messenger'); + $receiverName = $request->attributes->get('receiverName'); if (!is_string($receiverName)) { diff --git a/src/CoreShop/Bundle/MessengerBundle/Controller/MessageController.php b/src/CoreShop/Bundle/MessengerBundle/Controller/MessageController.php index e20aa28772..7fdd46dfbf 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Controller/MessageController.php +++ b/src/CoreShop/Bundle/MessengerBundle/Controller/MessageController.php @@ -29,6 +29,8 @@ class MessageController extends \Pimcore\Bundle\AdminBundle\Controller\AdminAbst { public function deleteStoredMessageAction(Request $request, FailedMessageRejecter $failedMessageRejecter) { + $this->checkPermission('coreshop_permission_messenger'); + $id = (int) $request->request->get('id'); $receiver = (string) $request->attributes->get('receiverName'); @@ -43,6 +45,8 @@ public function deleteStoredMessageAction(Request $request, FailedMessageRejecte public function retryFailedMessageAction(Request $request, FailedMessageRetryer $failedMessageRetryer) { + $this->checkPermission('coreshop_permission_messenger'); + $id = (int) $request->request->get('id'); $receiver = (string) $request->attributes->get('receiverName'); diff --git a/src/CoreShop/Bundle/MessengerBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/MessengerBundle/DependencyInjection/Configuration.php index 5cfaa73901..10206022ce 100755 --- a/src/CoreShop/Bundle/MessengerBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/MessengerBundle/DependencyInjection/Configuration.php @@ -75,7 +75,7 @@ private function addPimcoreResourcesSection(ArrayNodeDefinition $node): void ->end() ->scalarNode('permissions') ->cannotBeOverwritten() - ->defaultValue(['index', 'filter']) + ->defaultValue(['messenger']) ->end() ->end() ->end() diff --git a/src/CoreShop/Bundle/MessengerBundle/Messenger/FailedMessageDetails.php b/src/CoreShop/Bundle/MessengerBundle/Messenger/FailedMessageDetails.php index a09d7d0d51..4adf088f6d 100755 --- a/src/CoreShop/Bundle/MessengerBundle/Messenger/FailedMessageDetails.php +++ b/src/CoreShop/Bundle/MessengerBundle/Messenger/FailedMessageDetails.php @@ -18,7 +18,7 @@ namespace CoreShop\Bundle\MessengerBundle\Messenger; -final class FailedMessageDetails +final class FailedMessageDetails implements \JsonSerializable { public function __construct( private mixed $id, @@ -53,4 +53,15 @@ public function getSerialized(): string { return $this->serialized; } + + public function jsonSerialize(): mixed + { + return [ + 'id' => $this->id, + 'class' => $this->class, + 'failedAt' => $this->failedAt, + 'error' => $this->error, + 'serialized' => $this->serialized, + ]; + } } diff --git a/src/CoreShop/Bundle/MessengerBundle/Messenger/MessageDetails.php b/src/CoreShop/Bundle/MessengerBundle/Messenger/MessageDetails.php index 8ea6720789..6563c662af 100755 --- a/src/CoreShop/Bundle/MessengerBundle/Messenger/MessageDetails.php +++ b/src/CoreShop/Bundle/MessengerBundle/Messenger/MessageDetails.php @@ -18,7 +18,7 @@ namespace CoreShop\Bundle\MessengerBundle\Messenger; -final class MessageDetails +final class MessageDetails implements \JsonSerializable { public function __construct( private mixed $id, @@ -41,4 +41,13 @@ public function getSerialized(): string { return $this->serialized; } + + public function jsonSerialize(): mixed + { + return [ + 'id' => $this->id, + 'class' => $this->class, + 'serialized' => $this->serialized, + ]; + } } diff --git a/src/CoreShop/Bundle/MessengerBundle/Migrations/Version20240421093216.php b/src/CoreShop/Bundle/MessengerBundle/Migrations/Version20240421093216.php new file mode 100644 index 0000000000..db3e535fd2 --- /dev/null +++ b/src/CoreShop/Bundle/MessengerBundle/Migrations/Version20240421093216.php @@ -0,0 +1,47 @@ +setKey('coreshop_permission_messenger'); + $permission->setCategory('coreshop_permission_group_coreshop'); + $permission->save(); + } + } + + public function down(Schema $schema): void + { + } +} diff --git a/src/CoreShop/Bundle/MessengerBundle/README.md b/src/CoreShop/Bundle/MessengerBundle/README.md index f135313cb0..b2cccaa31e 100644 --- a/src/CoreShop/Bundle/MessengerBundle/README.md +++ b/src/CoreShop/Bundle/MessengerBundle/README.md @@ -12,7 +12,7 @@ code. [Read more on coreshop.org](http://www.coreshop.org) Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/MessengerBundle/Resources/config/pimcore/config.yml b/src/CoreShop/Bundle/MessengerBundle/Resources/config/pimcore/config.yml index 4a73753f2e..9f7c25607f 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Resources/config/pimcore/config.yml +++ b/src/CoreShop/Bundle/MessengerBundle/Resources/config/pimcore/config.yml @@ -1,6 +1,10 @@ imports: - { resource: admin.yml } +doctrine_migrations: + migrations_paths: + 'CoreShop\Bundle\MessengerBundle\Migrations': '@CoreShopMessengerBundle/Migrations' + framework: messenger: buses: diff --git a/src/CoreShop/Bundle/MessengerBundle/Resources/config/services.yml b/src/CoreShop/Bundle/MessengerBundle/Resources/config/services.yml index edd1fb091d..7b2642fc9b 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/MessengerBundle/Resources/config/services.yml @@ -57,9 +57,11 @@ services: - { name: controller.service_arguments } calls: - [setContainer, ['@service_container']] + - [setTokenResolver, ['@Pimcore\Security\User\TokenStorageUserResolver']] CoreShop\Bundle\MessengerBundle\Controller\MessageController: tags: - { name: controller.service_arguments } calls: - - [setContainer, ['@service_container']] \ No newline at end of file + - [setContainer, ['@service_container']] + - [setTokenResolver, ['@Pimcore\Security\User\TokenStorageUserResolver']] \ No newline at end of file diff --git a/src/CoreShop/Bundle/MessengerBundle/Resources/public/pimcore/js/list.js b/src/CoreShop/Bundle/MessengerBundle/Resources/public/pimcore/js/list.js index 4af0ed2a76..ba74aa7483 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Resources/public/pimcore/js/list.js +++ b/src/CoreShop/Bundle/MessengerBundle/Resources/public/pimcore/js/list.js @@ -63,18 +63,11 @@ coreshop.messenger.list = Class.create({ height: 200, items: this.getChart() }, { - xtype: 'panel', - layout: 'fit', region: 'center', + xtype: 'tabpanel', items: [ - { - xtype: 'tabpanel', - layot: 'fit', - items: [ - this.getFailedGrid(), - this.getGrid(), - ] - } + this.getFailedGrid(), + this.getGrid(), ] }] }] @@ -143,6 +136,7 @@ coreshop.messenger.list = Class.create({ var failureReceivers = Ext.create('Ext.form.ComboBox', { xtype: 'combo', fieldLabel: t('coreshop_messenger_failure_receivers'), + width: 400, mode: 'local', store: { proxy: { @@ -194,6 +188,7 @@ coreshop.messenger.list = Class.create({ var grid = new Ext.grid.Panel({ xtype: 'grid', + layout: 'fit', store: this.failedMessagesStore, viewConfig: { enableTextSelection: true @@ -203,24 +198,24 @@ coreshop.messenger.list = Class.create({ ], columns: [{ text: 'ID', - width: 150, + width: 75, dataIndex: 'id' }, { text: t('coreshop_messenger_class'), - flex: 1, + width: 400, dataIndex: 'class' }, { text: t('coreshop_messenger_failed_at'), width: 100, formatter: 'date("m/d/Y")', - dataIndex: 'failedAt' + dataIndex: 'failed_at' }, { text: t('coreshop_messenger_error'), - width: 250, + flex: 1, dataIndex: 'error' }, { xtype: 'actioncolumn', - width: 80, + width: 100, menuDisabled: true, sortable: false, items: [{ @@ -234,13 +229,33 @@ coreshop.messenger.list = Class.create({ height: 550, title: t('info'), modal: true, - layout: "fit", + layout: 'fit', items: [{ padding: 10, + scrollable: true, html: record.data.serialized }] }).show(); } + }, { + iconCls: 'pimcore_icon_error', + tooltip: t('coreshop_messenger_info'), + handler: function (grid, rowIndex) { + var record = grid.getStore().getAt(rowIndex); + + new Ext.Window({ + width: 500, + height: 550, + title: t('error'), + modal: true, + layout: 'fit', + items: [{ + padding: 10, + scrollable: true, + html: record.data.error + }] + }).show(); + } }, { iconCls: 'pimcore_icon_delete', tooltip: t('coreshop_messenger_delete_failed_message'), @@ -290,8 +305,9 @@ coreshop.messenger.list = Class.create({ }); return { + layout: 'fit', + items: [grid], title: t('coreshop_messenger_failed_messages'), - items: [grid] }; }, @@ -300,6 +316,7 @@ coreshop.messenger.list = Class.create({ var receivers = Ext.create('Ext.form.ComboBox', { xtype: 'combo', fieldLabel: t('coreshop_messenger_receivers'), + width: 400, mode: 'local', store: { proxy: { @@ -351,6 +368,7 @@ coreshop.messenger.list = Class.create({ var grid = new Ext.grid.Panel({ xtype: 'grid', + layout: 'fit', store: this.messagesStore, viewConfig: { enableTextSelection: true @@ -394,6 +412,7 @@ coreshop.messenger.list = Class.create({ }); return { + layout: 'fit', title: t('coreshop_messenger_pending_messages'), items: [grid] }; diff --git a/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.de.yml b/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.de.yml index 2b159eac5e..94ebf33b84 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.de.yml +++ b/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.de.yml @@ -9,4 +9,5 @@ coreshop_messenger_failure_receivers: 'Verfügbare Empfänger' coreshop_messenger_failed_messages: 'Fehlgeschlagene Nachrichten' coreshop_messenger_pending_messages: 'Ausstehende Nachrichten' coreshop_messenger_receivers: 'Empfänger' -coreshop_messenger_info: 'Details' \ No newline at end of file +coreshop_messenger_info: 'Details' +coreshop_permission_messenger: 'CoreShop: Messenger' \ No newline at end of file diff --git a/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.en.yml b/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.en.yml index 4252116baf..5c1f54acf2 100644 --- a/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.en.yml +++ b/src/CoreShop/Bundle/MessengerBundle/Resources/translations/admin.en.yml @@ -9,4 +9,5 @@ coreshop_messenger_failure_receivers: 'Available Receivers' coreshop_messenger_failed_messages: 'Failed Messages' coreshop_messenger_pending_messages: 'Pending Messages' coreshop_messenger_receivers: 'Receivers' -coreshop_messenger_info: 'Details' \ No newline at end of file +coreshop_messenger_info: 'Details' +coreshop_permission_messenger: 'CoreShop: Messenger' \ No newline at end of file diff --git a/src/CoreShop/Bundle/MoneyBundle/CoreExtension/Money.php b/src/CoreShop/Bundle/MoneyBundle/CoreExtension/Money.php index 3f817f9a7b..f7e05959ec 100644 --- a/src/CoreShop/Bundle/MoneyBundle/CoreExtension/Money.php +++ b/src/CoreShop/Bundle/MoneyBundle/CoreExtension/Money.php @@ -588,7 +588,7 @@ public function getDataFromEditmode(mixed $data, Concrete $object = null, array public function getVersionPreview(mixed $data, Concrete $object = null, array $params = []): string { - return $data; + return (string) $data; } public function checkValidity(mixed $data, bool $omitMandatoryCheck = false, array $params = []): void diff --git a/src/CoreShop/Bundle/MoneyBundle/README.md b/src/CoreShop/Bundle/MoneyBundle/README.md index 23be1c16b9..d4ee88a87d 100644 --- a/src/CoreShop/Bundle/MoneyBundle/README.md +++ b/src/CoreShop/Bundle/MoneyBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/NotificationBundle/README.md b/src/CoreShop/Bundle/NotificationBundle/README.md index c7e5a935d8..acf9531bbd 100644 --- a/src/CoreShop/Bundle/NotificationBundle/README.md +++ b/src/CoreShop/Bundle/NotificationBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md b/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md index 5c64935c33..21bfac0424 100644 --- a/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md +++ b/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/OrderBundle/Controller/CartPriceRuleController.php b/src/CoreShop/Bundle/OrderBundle/Controller/CartPriceRuleController.php index d56f2f4981..52d8a1d15e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Controller/CartPriceRuleController.php +++ b/src/CoreShop/Bundle/OrderBundle/Controller/CartPriceRuleController.php @@ -25,6 +25,7 @@ use CoreShop\Component\Order\Model\CartPriceRuleInterface; use CoreShop\Component\Order\Model\CartPriceRuleVoucherCode; use CoreShop\Component\Order\Model\CartPriceRuleVoucherCodeInterface; +use CoreShop\Component\Order\Repository\CartPriceRuleRepositoryInterface; use CoreShop\Component\Order\Repository\CartPriceRuleVoucherRepositoryInterface; use CoreShop\Component\Resource\Factory\FactoryInterface; use Symfony\Component\Form\FormFactoryInterface; @@ -34,6 +35,18 @@ class CartPriceRuleController extends ResourceController { + public function listVoucherRulesAction(): JsonResponse + { + /** + * @var CartPriceRuleRepositoryInterface $repository + */ + $repository = $this->repository; + + $data = $repository->findVoucherRules(); + + return $this->viewHandler->handle($data, ['group' => 'List']); + } + public function getConfigAction(Request $request): JsonResponse { $actions = $this->getConfigActions(); diff --git a/src/CoreShop/Bundle/OrderBundle/Controller/OrderCommentController.php b/src/CoreShop/Bundle/OrderBundle/Controller/OrderCommentController.php index d144eaad11..ceb9d69bf9 100644 --- a/src/CoreShop/Bundle/OrderBundle/Controller/OrderCommentController.php +++ b/src/CoreShop/Bundle/OrderBundle/Controller/OrderCommentController.php @@ -87,8 +87,9 @@ public function addAction(Request $request): JsonResponse public function deleteAction(Request $request): JsonResponse { $commentId = $this->getParameterFromRequest($request, 'id'); + $objectNoteService = $this->container->get(NoteServiceInterface::class); - $commentEntity = $objectNoteService->getNoteById($commentId); + $commentEntity = $objectNoteService->getNoteById((int) $commentId); if ($commentEntity instanceof Note) { /** @psalm-suppress InternalMethod */ diff --git a/src/CoreShop/Bundle/OrderBundle/Controller/OrderController.php b/src/CoreShop/Bundle/OrderBundle/Controller/OrderController.php index 18fd8a6349..a5db9fb631 100644 --- a/src/CoreShop/Bundle/OrderBundle/Controller/OrderController.php +++ b/src/CoreShop/Bundle/OrderBundle/Controller/OrderController.php @@ -20,6 +20,7 @@ use Carbon\Carbon; use CoreShop\Bundle\OrderBundle\Events; +use CoreShop\Bundle\OrderBundle\Form\Type\OrderType; use CoreShop\Bundle\ResourceBundle\Controller\PimcoreController; use CoreShop\Bundle\WorkflowBundle\History\HistoryLogger; use CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManagerInterface; @@ -29,22 +30,27 @@ use CoreShop\Component\Address\Model\CountryInterface; use CoreShop\Component\Currency\Model\CurrencyInterface; use CoreShop\Component\Customer\Model\CustomerInterface; +use CoreShop\Component\Order\Manager\CartManagerInterface; use CoreShop\Component\Order\Model\CartPriceRuleInterface; use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Model\OrderItemInterface; use CoreShop\Component\Order\Model\PriceRuleItemInterface; use CoreShop\Component\Order\Notes; +use CoreShop\Component\Order\OrderEditPossibleInterface; use CoreShop\Component\Order\OrderInvoiceStates; use CoreShop\Component\Order\OrderPaymentStates; use CoreShop\Component\Order\OrderShipmentStates; use CoreShop\Component\Order\OrderStates; use CoreShop\Component\Order\OrderTransitions; use CoreShop\Component\Order\Processable\ProcessableInterface; +use CoreShop\Component\Order\Processor\CartProcessorInterface; use CoreShop\Component\Order\Repository\OrderInvoiceRepositoryInterface; +use CoreShop\Component\Order\Repository\OrderItemRepositoryInterface; use CoreShop\Component\Order\Repository\OrderRepositoryInterface; use CoreShop\Component\Order\Repository\OrderShipmentRepositoryInterface; use CoreShop\Component\Payment\Repository\PaymentRepositoryInterface; use CoreShop\Component\Pimcore\DataObject\DataLoader; +use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; use CoreShop\Component\Pimcore\DataObject\NoteServiceInterface; use CoreShop\Component\Store\Model\StoreInterface; use JMS\Serializer\SerializerInterface; @@ -56,9 +62,10 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\DependencyInjection\Attribute\TaggedIterator; use Symfony\Component\EventDispatcher\GenericEvent; +use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Workflow\StateMachine; +use Symfony\Component\Workflow\WorkflowInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\Service\Attribute\SubscribedService; @@ -78,7 +85,7 @@ public function getStatesAction(Request $request): Response $stateMachine = null; foreach ($worklows as $workflow) { - if (!$workflow instanceof StateMachine) { + if (!$workflow instanceof WorkflowInterface) { continue; } @@ -266,6 +273,108 @@ public function detailAction(Request $request, OrderRepositoryInterface $orderRe return $this->viewHandler->handle(['success' => true, 'sale' => $jsonSale]); } + public function updateAction( + Request $request, + OrderRepositoryInterface $orderRepository, + OrderItemRepositoryInterface $orderItemRepository, + FormFactoryInterface $formFactory, + CartManagerInterface $cartManager, + CartProcessorInterface $cartProcessor, + ): Response { + $this->isGrantedOr403(); + + $orderId = $this->getParameterFromRequest($request, 'id'); + $order = $orderRepository->find($orderId); + + if (!$order instanceof OrderInterface) { + throw $this->createNotFoundException(); + } + + $form = $formFactory->createNamed('', OrderType::class, $order, [ + 'allow_zero_quantity' => true, + ]); + + $previewOnly = $request->query->getBoolean('preview'); + + if ($request->getMethod() === 'POST') { + $handledForm = $form->handleRequest($request); + + /** + * @var OrderInterface&DataObject\Concrete $order + */ + $order = $handledForm->getData(); + + $changedOrderItems = []; + + InheritanceHelper::useInheritedValues( + function () use ($cartManager, $cartProcessor, $previewOnly, $order, $orderItemRepository, &$changedOrderItems) { + if ($previewOnly) { + $cartProcessor->process($order); + } else { + $commentEntity = $this->container->get(NoteServiceInterface::class)->createPimcoreNoteInstance($order, Notes::NOTE_ORDER_BACKEND_UPDATE_SAVE); + $commentEntity->setTitle('Order Backend Update'); + $commentEntity->setDescription('Order has been updated manually from backend'); + + $items = $order->getItems(); + + /** + * @var OrderItemInterface&DataObject\Concrete $orderItem + */ + foreach ($items as $index => $orderItem) { + $originalCartItem = $orderItemRepository->forceFind($orderItem->getId()); + + if (!$originalCartItem instanceof $orderItem) { + continue; + } + + if ($originalCartItem->getQuantity() !== $orderItem->getQuantity()) { + $commentEntity->addData('item_from_' . $index, 'text', $originalCartItem->getQuantity()); + $commentEntity->addData('item_to_' . $index, 'text', $orderItem->getQuantity()); + + $itemNote = $this->container->get(NoteServiceInterface::class)->createPimcoreNoteInstance($orderItem, Notes::NOTE_ORDER_BACKEND_UPDATE_SAVE); + $itemNote->setTitle('Order Item Backend Update'); + $itemNote->setDescription('Order Item has been updated manually from backend'); + $itemNote->addData('from', 'text', $originalCartItem->getQuantity()); + $itemNote->addData('to', 'text', $orderItem->getQuantity()); + + $this->container->get(NoteServiceInterface::class)->storeNote($itemNote, ['item' => $orderItem, 'originalItem' => $originalCartItem]); + + $changedOrderItems[] = [ + 'orderItem' => $orderItem, + 'originalOrderItem' => $originalCartItem, + 'from' => $originalCartItem->getQuantity(), + 'to' => $orderItem->getQuantity(), + ]; + } + } + + /** + * @psalm-suppress TooManyArguments + * + * @phpstan-ignore-next-line + */ + $cartManager->persistCart($order, ['enable_versioning' => true]); + + $this->container->get(NoteServiceInterface::class)->storeNote($commentEntity, ['order' => $order]); + } + }, + ); + + $this->container->get('event_dispatcher')->dispatch( + new GenericEvent($order, [ + 'changedOrderItems' => $changedOrderItems, + ]), + $previewOnly ? Events::ORDER_BACKEND_UPDATE_PREVIEW : Events::ORDER_BACKEND_UPDATE_SAVE, + ); + + $json = $this->getDetails($order); + + return $this->viewHandler->handle(['success' => true, 'sale' => $json]); + } + + return $this->viewHandler->handle(['success' => false, 'message' => 'Method not supported, use POST']); + } + public function findOrderAction(Request $request, OrderRepositoryInterface $orderRepository): Response { $this->isGrantedOr403(); @@ -486,7 +595,7 @@ protected function getDetails(OrderInterface $order): array $invoices = $this->getInvoices($order); - $jsonSale['editable'] = count($invoices) > 0 ? false : true; + $jsonSale['editable'] = $this->container->get(OrderEditPossibleInterface::class)->isOrderEditable($order); $jsonSale['invoices'] = $invoices; $jsonSale['payments'] = $this->getPayments($order); $jsonSale['shipments'] = $this->getShipments($order); @@ -843,6 +952,7 @@ public static function getSubscribedServices(): array new SubscribedService('coreshop.repository.order_shipment', OrderShipmentRepositoryInterface::class, attributes: new Autowire(service:'coreshop.repository.order_shipment')), new SubscribedService('coreshop.repository.payment', PaymentRepositoryInterface::class, attributes: new Autowire(service:'coreshop.repository.payment')), HistoryLogger::class, + OrderEditPossibleInterface::class, ]); } } diff --git a/src/CoreShop/Bundle/OrderBundle/Controller/OrderCreationController.php b/src/CoreShop/Bundle/OrderBundle/Controller/OrderCreationController.php index 88982c51cb..d53c896ced 100644 --- a/src/CoreShop/Bundle/OrderBundle/Controller/OrderCreationController.php +++ b/src/CoreShop/Bundle/OrderBundle/Controller/OrderCreationController.php @@ -32,6 +32,7 @@ use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Model\OrderItemInterface; use CoreShop\Component\Order\OrderSaleTransitions; +use CoreShop\Component\Order\OrderTransitions; use CoreShop\Component\Order\Processor\CartProcessorInterface; use CoreShop\Component\Pimcore\DataObject\DataLoader; use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; @@ -133,15 +134,23 @@ public function saleCreationAction( $cart = $handledForm->getData(); $cart->setCreationDate(time()); + $cartManager->persistCart($cart); + $workflow = $manager->get($cart, OrderSaleTransitions::IDENTIFIER); + $orderWorkflow = $manager->get($cart, OrderTransitions::IDENTIFIER); if (!$workflow->can($cart, $type)) { throw new HttpException(500); } - InheritanceHelper::useInheritedValues(static function () use ($workflow, $cart, $type, $cartManager) { + InheritanceHelper::useInheritedValues(static function () use ($workflow, $cart, $type, $cartManager, $orderWorkflow) { $workflow->apply($cart, $type); + if ($type === OrderSaleTransitions::TRANSITION_ORDER) { + //confirm order + $orderWorkflow->apply($cart, OrderTransitions::TRANSITION_CONFIRM); + } + $cartManager->persistCart($cart); }); diff --git a/src/CoreShop/Bundle/OrderBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/OrderBundle/DependencyInjection/Configuration.php index 56c998b9ab..709a7b21d4 100644 --- a/src/CoreShop/Bundle/OrderBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/OrderBundle/DependencyInjection/Configuration.php @@ -29,6 +29,7 @@ use CoreShop\Bundle\OrderBundle\Controller\OrderPaymentController; use CoreShop\Bundle\OrderBundle\Controller\OrderShipmentController; use CoreShop\Bundle\OrderBundle\Doctrine\ORM\CartPriceRuleRepository; +use CoreShop\Bundle\OrderBundle\Doctrine\ORM\CartPriceRuleVoucherCodeCustomerRepository; use CoreShop\Bundle\OrderBundle\Doctrine\ORM\CartPriceRuleVoucherRepository; use CoreShop\Bundle\OrderBundle\Form\Type\CartPriceRuleTranslationType; use CoreShop\Bundle\OrderBundle\Form\Type\CartPriceRuleType; @@ -37,12 +38,15 @@ use CoreShop\Bundle\OrderBundle\Pimcore\Repository\OrderRepository; use CoreShop\Bundle\OrderBundle\Pimcore\Repository\OrderShipmentRepository; use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle; +use CoreShop\Component\Order\Factory\CartPriceRuleVoucherCodeCustomerFactory; use CoreShop\Component\Order\Model\AdjustmentInterface; use CoreShop\Component\Order\Model\CartPriceRule; use CoreShop\Component\Order\Model\CartPriceRuleInterface; use CoreShop\Component\Order\Model\CartPriceRuleTranslation; use CoreShop\Component\Order\Model\CartPriceRuleTranslationInterface; use CoreShop\Component\Order\Model\CartPriceRuleVoucherCode; +use CoreShop\Component\Order\Model\CartPriceRuleVoucherCodeCustomer; +use CoreShop\Component\Order\Model\CartPriceRuleVoucherCodeCustomerInterface; use CoreShop\Component\Order\Model\CartPriceRuleVoucherCodeInterface; use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Model\OrderInvoiceInterface; @@ -70,6 +74,7 @@ public function getConfigTreeBuilder(): TreeBuilder $rootNode ->children() ->booleanNode('legacy_serialization')->defaultTrue()->end() + ->booleanNode('allow_order_edit')->defaultFalse()->end() ->end() ; $this->addModelsSection($rootNode); @@ -110,6 +115,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('cart_price_rule')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -156,6 +167,21 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->end() ->end() ->end() + ->arrayNode('cart_price_rule_voucher_code_customer') + ->addDefaultsIfNotSet() + ->children() + ->variableNode('options')->end() + ->arrayNode('classes') + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('model')->defaultValue(CartPriceRuleVoucherCodeCustomer::class)->cannotBeEmpty()->end() + ->scalarNode('interface')->defaultValue(CartPriceRuleVoucherCodeCustomerInterface::class)->cannotBeEmpty()->end() + ->scalarNode('factory')->defaultValue(CartPriceRuleVoucherCodeCustomerFactory::class)->cannotBeEmpty()->end() + ->scalarNode('repository')->defaultValue(CartPriceRuleVoucherCodeCustomerRepository::class)->end() + ->end() + ->end() + ->end() + ->end() ->end() ->end() ->arrayNode('pimcore') diff --git a/src/CoreShop/Bundle/OrderBundle/DependencyInjection/CoreShopOrderExtension.php b/src/CoreShop/Bundle/OrderBundle/DependencyInjection/CoreShopOrderExtension.php index 6ba690d4f1..75f65927d9 100644 --- a/src/CoreShop/Bundle/OrderBundle/DependencyInjection/CoreShopOrderExtension.php +++ b/src/CoreShop/Bundle/OrderBundle/DependencyInjection/CoreShopOrderExtension.php @@ -47,6 +47,8 @@ public function load(array $configs, ContainerBuilder $container): void $loader->load('services.yml'); + $container->setParameter('coreshop.order.allow_edit', $configs['allow_order_edit']); + $this->registerResources('coreshop', CoreShopResourceBundle::DRIVER_DOCTRINE_ORM, $configs['resources'], $container); $this->registerPimcoreModels('coreshop', $configs['pimcore'], $container); diff --git a/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleRepository.php b/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleRepository.php index 3fe836d4c1..0cf91cf2ad 100644 --- a/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleRepository.php +++ b/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleRepository.php @@ -34,6 +34,17 @@ public function findNonVoucherRules(): array ; } + public function findVoucherRules(): array + { + return $this->createQueryBuilder('o') + ->andWhere('o.isVoucherRule = :isVoucherRule') + ->setParameter('isVoucherRule', true) + ->orderBy('o.priority', 'DESC') + ->getQuery() + ->getResult() + ; + } + public function findAll(): array { return $this->createQueryBuilder('o') diff --git a/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleVoucherCodeCustomerRepository.php b/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleVoucherCodeCustomerRepository.php new file mode 100644 index 0000000000..f7aa4dbda1 --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Doctrine/ORM/CartPriceRuleVoucherCodeCustomerRepository.php @@ -0,0 +1,42 @@ +createQueryBuilder('o') + ->where('o.voucherCode = :voucherCode') + ->andWhere('o.customerId = :customerId') + ->setParameter('voucherCode', $voucherCode) + ->setParameter('customerId', $customer->getId()) + ->getQuery() + ->getOneOrNullResult() + ; + } +} diff --git a/src/CoreShop/Bundle/OrderBundle/Events.php b/src/CoreShop/Bundle/OrderBundle/Events.php index 05e1e8aa38..2ae14982b4 100644 --- a/src/CoreShop/Bundle/OrderBundle/Events.php +++ b/src/CoreShop/Bundle/OrderBundle/Events.php @@ -34,4 +34,14 @@ final class Events * Fired when an Admin creates a new Address via a CoreShop UI */ public const ADMIN_ADDRESS_CREATION = 'coreshop.address.admin_creation'; + + /** + * Fired when an Admin updates an Order in the Backend for preview + */ + public const ORDER_BACKEND_UPDATE_PREVIEW = 'coreshop.order.backend_update_preview'; + + /** + * Fired when an Admin updates an Order in the Backend for saving + */ + public const ORDER_BACKEND_UPDATE_SAVE = 'coreshop.order.backend_update_save'; } diff --git a/src/CoreShop/Bundle/OrderBundle/Form/DataMapper/BackendCartItemQuantityDataMapper.php b/src/CoreShop/Bundle/OrderBundle/Form/DataMapper/BackendCartItemQuantityDataMapper.php new file mode 100644 index 0000000000..e0896c7005 --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Form/DataMapper/BackendCartItemQuantityDataMapper.php @@ -0,0 +1,61 @@ +propertyPathDataMapper->mapDataToForms($viewData, $forms); + } + + public function mapFormsToData($forms, &$viewData): void + { + $formsOtherThanQuantity = []; + + //First map all the other fields, then map quantity. + foreach ($forms as $form) { + if ('quantity' === $form->getName()) { + $targetQuantity = $form->getData(); + $this->cartItemQuantityModifier->modify($viewData, (float) $targetQuantity); + + continue; + } + + $formsOtherThanQuantity[] = $form; + } + + if (!empty($formsOtherThanQuantity)) { + $this->propertyPathDataMapper->mapFormsToData(new ArrayCollection($formsOtherThanQuantity), $viewData); + } + } +} diff --git a/src/CoreShop/Bundle/OrderBundle/Form/Type/OrderItemType.php b/src/CoreShop/Bundle/OrderBundle/Form/Type/OrderItemType.php new file mode 100644 index 0000000000..b59369ac05 --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Form/Type/OrderItemType.php @@ -0,0 +1,56 @@ +add('quantity', IntegerType::class, [ + 'attr' => ['min' => 1], + 'label' => 'coreshop.ui.quantity', + ])->setDataMapper($options['allow_zero_quantity'] ? $this->zeroQuantityDataMapper : $this->dataMapper) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + parent::configureOptions($resolver); + + $resolver->setDefaults([ + 'allow_zero_quantity' => false, + ]); + } +} diff --git a/src/CoreShop/Bundle/OrderBundle/Form/Type/OrderType.php b/src/CoreShop/Bundle/OrderBundle/Form/Type/OrderType.php new file mode 100644 index 0000000000..65c832d1f4 --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Form/Type/OrderType.php @@ -0,0 +1,49 @@ +add('items', CollectionType::class, [ + 'entry_type' => OrderItemType::class, + 'entry_options' => [ + 'allow_zero_quantity' => $options['allow_zero_quantity'], + ], + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + parent::configureOptions($resolver); + + $resolver->setDefaults([ + 'csrf_protection' => false, + 'allow_zero_quantity' => false, + ]); + } +} diff --git a/src/CoreShop/Bundle/OrderBundle/Form/Type/Rule/Condition/VoucherConfigurationType.php b/src/CoreShop/Bundle/OrderBundle/Form/Type/Rule/Condition/VoucherConfigurationType.php index b846334219..916ec9204b 100644 --- a/src/CoreShop/Bundle/OrderBundle/Form/Type/Rule/Condition/VoucherConfigurationType.php +++ b/src/CoreShop/Bundle/OrderBundle/Form/Type/Rule/Condition/VoucherConfigurationType.php @@ -37,6 +37,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('maxUsagePerCode', NumberType::class) + ->add('maxUsagePerUser', NumberType::class) ->add('onlyOnePerCart', CheckboxType::class) ; } diff --git a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php index ef3089f35e..3fbc637fda 100644 --- a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php +++ b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php @@ -38,18 +38,26 @@ public function __construct( public function persist(StorageListInterface $storageList): void { + /** + * @var OrderInterface $storageList + */ Assert::isInstanceOf($storageList, OrderInterface::class); $this->persistCart($storageList); } - public function persistCart(OrderInterface $cart): void + public function persistCart(OrderInterface $cart/*, array $params = []*/): void { $cartsFolder = $this->folderCreationService->createFolderForResource($cart, [ 'suffix' => date('Y/m/d'), 'path' => 'cart', ]); + $params = []; + if (func_num_args() === 2) { + $params = func_get_arg(1) ?? []; + } + VersionHelper::useVersioning(function () use ($cart, $cartsFolder) { if (!$cart->getId()) { $tempItems = $cart->getItems(); @@ -78,22 +86,32 @@ public function persistCart(OrderInterface $cart): void ['prefix' => $cart->getFullPath()], ), ); - //$item->setPath($cart->getFullPath()); + $item->setKey(uniqid(sprintf('%s.', $index + 1), true)); $item->setPublished(true); - $item->setKey((string) ((int) $index + 1)); $item->save(); } + /** + * The CartProcessor might add new Items to the Cart (eg. Gift Products) + * so we need to set the Parent and Key after the CartProcessor has been processed + */ $this->cartProcessor->process($cart); /** - * @var OrderItemInterface $cartItem + * @var OrderItemInterface $item */ - foreach ($cart->getItems() as $cartItem) { - $cartItem->save(); + foreach ($cart->getItems() as $index => $item) { + $item->setParent( + $this->folderCreationService->createFolderForResource( + $item, + ['prefix' => $cart->getFullPath()], + ), + ); + $item->setKey(uniqid(sprintf('%s.', ((int) $index + 1)), true)); + $item->save(); } $cart->save(); - }, false); + }, $params['enable_versioning'] ?? false); } } diff --git a/src/CoreShop/Bundle/OrderBundle/Pimcore/Repository/OrderRepository.php b/src/CoreShop/Bundle/OrderBundle/Pimcore/Repository/OrderRepository.php index 185fd670f4..5e9595a093 100644 --- a/src/CoreShop/Bundle/OrderBundle/Pimcore/Repository/OrderRepository.php +++ b/src/CoreShop/Bundle/OrderBundle/Pimcore/Repository/OrderRepository.php @@ -166,7 +166,7 @@ public function findByCustomer(CustomerInterface $customer): array { $list = $this->getList(); $list->setCondition('customer__id = ?', [$customer->getId()]); - $list->setOrderKey('o_id'); + $list->setOrderKey('id'); $list->setOrder('DESC'); $list->load(); @@ -186,7 +186,7 @@ public function findExpiredOrders(int $days): array $daysTimestamp = Carbon::now(); $daysTimestamp->subDays($days); - $conditions = ['creationDate < ? AND saleState = ? AND orderState IN (?, ?, ?) AND paymentState <> ?']; + $conditions = ['IFNULL(orderDate,creationDate) < ? AND saleState = ? AND orderState IN (?, ?, ?) AND paymentState <> ?']; $params = []; $params[] = $daysTimestamp->getTimestamp(); $params[] = OrderSaleStates::STATE_ORDER; diff --git a/src/CoreShop/Bundle/OrderBundle/README.md b/src/CoreShop/Bundle/OrderBundle/README.md index 0ec6618482..4e9128f4ee 100644 --- a/src/CoreShop/Bundle/OrderBundle/README.md +++ b/src/CoreShop/Bundle/OrderBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/OrderBundle/Renderer/Pdf/WkHtmlToPdf.php b/src/CoreShop/Bundle/OrderBundle/Renderer/Pdf/WkHtmlToPdf.php index 33ab3844ff..857acd103e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Renderer/Pdf/WkHtmlToPdf.php +++ b/src/CoreShop/Bundle/OrderBundle/Renderer/Pdf/WkHtmlToPdf.php @@ -207,11 +207,11 @@ private function unlinkFile(?string $file): void private function getWkHtmlToPdfBinary(): string { - return Console::getExecutable('wkhtmltopdf', true); + return (string) Console::getExecutable('wkhtmltopdf', true); } private function getXvfbBinary(): string { - return Console::getExecutable('xvfb-run'); + return (string) Console::getExecutable('xvfb-run'); } } diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/doctrine/model/CartPriceRuleVoucherCodeCustomer.orm.xml b/src/CoreShop/Bundle/OrderBundle/Resources/config/doctrine/model/CartPriceRuleVoucherCodeCustomer.orm.xml new file mode 100644 index 0000000000..6b6dbccae4 --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/doctrine/model/CartPriceRuleVoucherCodeCustomer.orm.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/routing.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/routing.yml index 8905c27fe3..4e08508371 100755 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/routing.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/routing.yml @@ -8,6 +8,11 @@ coreshop_admin_cart_price_rule: action: getConfig methods: - GET + listVoucherRules: + path: list-voucher-rules + action: listVoucherRules + methods: + - GET cartItemConfig: path: get-cart-item-config action: getCartItemConfig @@ -71,6 +76,13 @@ coreshop_admin_order_get_order: options: expose: true +coreshop_admin_order_update: + path: /%coreshop.admin.route.base%/order/update/{id} + defaults: { _controller: 'coreshop.pimcore_controller.order::updateAction'} + methods: POST + options: + expose: true + coreshop_admin_order_find: path: /%coreshop.admin.route.base%/order/find defaults: { _controller: 'coreshop.pimcore_controller.order::findOrderAction'} @@ -131,6 +143,8 @@ coreshop_admin_order_comments_add: coreshop_admin_order_comments_delete: path: /%coreshop.admin.route.base%/order-comment/delete defaults: { _controller: 'coreshop.pimcore_controller.order_comment::deleteAction'} + options: + expose: true ##### ORDER SHIPMENT coreshop_admin_order_shipment_get_processable_items: diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_order_sales_type.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_order_sales_type.yml index eb35bf3783..9d857cfc28 100755 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_order_sales_type.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_order_sales_type.yml @@ -37,3 +37,7 @@ core_shop_workflow: on: ['order', 'quote'] do: ['@CoreShop\Bundle\WorkflowBundle\History\StateHistoryLoggerInterface', 'log'] args: ['object', 'event'] + immutability: + on: ['order'] + do: ['@CoreShop\Component\Order\Modifier\ImmutabilityModifierInterface', 'makeImmutable'] + args: ['object'] diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_payment.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_payment.yml index b2a209443a..3a0f808401 100755 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_payment.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/pimcore/workflow/coreshop_payment.yml @@ -4,7 +4,7 @@ core_shop_workflow: callbacks: after: resolve_state: - on: ['complete', 'refund', 'authorize'] + on: ['complete', 'process', 'refund', 'authorize'] do: ['@CoreShop\Bundle\OrderBundle\StateResolver\OrderPaymentStateResolver', 'resolve'] args: ['object.getOrder()'] add_to_history: diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.Adjustment.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.Adjustment.yml index 272475bd76..6754dc631e 100755 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.Adjustment.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.Adjustment.yml @@ -2,12 +2,6 @@ CoreShop\Component\Order\Model\Adjustment: exclusion_policy: ALL xml_root_name: cart_price_rule virtual_properties: - id: - serialized_name: id - exp: object.getId() - type: integer - xml_attribute: true - groups: [List, Detailed] amountNet: serialized_name: amountNet exp: object.getAmount(false) diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.OrderShipment.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.OrderShipment.yml index 7db250a44a..6ae8816ae9 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.OrderShipment.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/serializer/Model.OrderShipment.yml @@ -25,7 +25,7 @@ CoreShop\Component\Order\Model\OrderShipment: trackingCode: serialized_name: trackingCode exp: object.getTrackingCode() - type: integer + type: string groups: [Detailed] items: serialized_name: items diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml index 61efb2f77a..4041c868c2 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml @@ -19,6 +19,8 @@ imports: - { resource: services/payment.yml } - { resource: services/forms.yml } - { resource: services/checkout_listener.yml } + - { resource: services/controller.yml } + - { resource: services/order_edit.yml } services: _defaults: @@ -97,6 +99,8 @@ services: arguments: - '@CoreShop\Component\Order\Factory\AdjustmentFactory.inner' + CoreShop\Component\Order\Factory\CartPriceRuleVoucherCodeCustomerFactoryInterface: '@coreshop.factory.cart_price_rule_voucher_code_customer' + CoreShop\Component\Order\Factory\OrderItemFactory: decorates: coreshop.factory.order_item decoration_priority: 256 diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart-price-rules.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart-price-rules.yml index 2d40a6aaeb..d664f8e0d9 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart-price-rules.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart-price-rules.yml @@ -151,6 +151,7 @@ services: CoreShop\Component\Order\Cart\Rule\Condition\VoucherConditionChecker: arguments: - '@coreshop.repository.cart_price_rule_voucher_code' + - '@coreshop.repository.cart_price_rule_voucher_code_customer' tags: - { name: coreshop.cart_price_rule.condition, type: voucher, form-type: CoreShop\Bundle\OrderBundle\Form\Type\Rule\Condition\VoucherConfigurationType } @@ -222,4 +223,6 @@ services: arguments: - '@doctrine.orm.default_entity_manager' - '@coreshop.repository.cart_price_rule_voucher_code' + - '@coreshop.repository.cart_price_rule_voucher_code_customer' + - '@coreshop.factory.cart_price_rule_voucher_code_customer' diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart.yml index 0b20e9657c..958742105c 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/cart.yml @@ -29,6 +29,11 @@ services: - '@coreshop.cart_item.quantity_modifier' - '@coreshop.form.data_mapper.cart_item_quantity.property_mapper' + CoreShop\Bundle\OrderBundle\Form\DataMapper\BackendCartItemQuantityDataMapper: + arguments: + - '@coreshop.cart_item.quantity_modifier.backend' + - '@coreshop.form.data_mapper.cart_item_quantity.property_mapper' + CoreShop\Bundle\OrderBundle\Form\Type\CartItemType: arguments: - '%coreshop.model.order_item.class%' diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/controller.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/controller.yml new file mode 100644 index 0000000000..2967bc94ea --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/controller.yml @@ -0,0 +1,5 @@ +services: + CoreShop\Bundle\OrderBundle\Controller\OrderDocumentPrintController: + public: true + tags: [ 'controller.service_arguments', 'container.service_subscriber' ] + diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/order_edit.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/order_edit.yml new file mode 100644 index 0000000000..a370d84170 --- /dev/null +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/order_edit.yml @@ -0,0 +1,21 @@ +services: + CoreShop\Component\Order\OrderEditPossibleInterface: '@CoreShop\Component\Order\OrderEditPossible' + CoreShop\Component\Order\OrderEditPossible: + arguments: + - '%coreshop.order.allow_edit%' + + CoreShop\Bundle\OrderBundle\Form\Type\OrderType: + arguments: + - '%coreshop.model.order.class%' + - '%coreshop.form.type.cart.validation_groups%' + tags: + - { name: form.type } + + CoreShop\Bundle\OrderBundle\Form\Type\OrderItemType: + arguments: + - '%coreshop.model.order_item.class%' + - '%coreshop.form.type.cart_item.validation_groups%' + - '@CoreShop\Bundle\OrderBundle\Form\DataMapper\CartItemQuantityDataMapper' + - '@CoreShop\Bundle\OrderBundle\Form\DataMapper\BackendCartItemQuantityDataMapper' + tags: + - { name: form.type } diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/workflow.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/workflow.yml index 55d82f7e4f..2163af941e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/services/workflow.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services/workflow.yml @@ -1,10 +1,10 @@ parameters: - _defaults: - public: true - coreshop.workflow.include_invoice_state_to_complete_order: false services: + _defaults: + public: true + CoreShop\Bundle\OrderBundle\StateResolver\OrderStateResolver: public: true arguments: @@ -119,3 +119,6 @@ services: class: CoreShop\Bundle\WorkflowBundle\MarkingStore\PimcorePersistentMarkingStore arguments: - '@coreshop.state_machine.marking_store.single_state.invoice_state' + + CoreShop\Component\Order\Modifier\ImmutabilityModifierInterface: '@CoreShop\Component\Order\Modifier\ImmutabilityModifier' + CoreShop\Component\Order\Modifier\ImmutabilityModifier: ~ \ No newline at end of file diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/CartPriceRuleVoucherGenerator.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/CartPriceRuleVoucherGenerator.yml index 2b665abff6..a57ca7887e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/CartPriceRuleVoucherGenerator.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/CartPriceRuleVoucherGenerator.yml @@ -8,4 +8,4 @@ CoreShop\Component\Order\Model\CartPriceRuleVoucherGenerator: - Range: { min: 1, minMessage: coreshop.cart_price_rule_voucher_generator.amount.min, groups: coreshop } length: - NotBlank: { message: coreshop.cart_price_rule_voucher_generator.length.not_blank, groups: coreshop } - - Range: { min: 1, minMessage: coreshop.cart_price_rule_voucher_generator.length.min, max: 40, maxMessage: coreshop.cart_price_rule_voucher_generator.length.max, groups: coreshop } + - Range: { min: 1, max: 40, notInRangeMessage: coreshop.cart_price_rule_voucher_generator.length.range, groups: coreshop } diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/Order.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/Order.yml index 9a85e83441..7c655fb40b 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/Order.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/validation/Order.yml @@ -1,6 +1,6 @@ CoreShop\Component\Order\Model\Order: constraints: - - \CoreShop\Bundle\OrderBundle\Validator\Constraints\CartPriceRule: { groups: ['coreshop'] } + - \CoreShop\Bundle\OrderBundle\Validator\Constraints\CartPriceRule: { groups: ['coreshop', 'coreshop_revise'] } getters: items: diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrder.json b/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrder.json index a9415368e7..d870209dd6 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrder.json +++ b/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrder.json @@ -143,7 +143,7 @@ "columnLength": 190, "phpdocType": "string", "regex": "", - "unique": false, + "unique": true, "showCharCount": null, "name": "token", "title": "coreshop.order.token", @@ -3096,6 +3096,41 @@ "invisible": false, "visibleGridView": false, "visibleSearch": false + }, + { + "name": "immutable", + "title": "coreshop.order.immutable", + "tooltip": "", + "mandatory": false, + "noteditable": true, + "index": false, + "locked": false, + "style": "", + "permissions": null, + "datatype": "data", + "fieldtype": "booleanSelect", + "relationType": false, + "invisible": false, + "visibleGridView": false, + "visibleSearch": false, + "yesLabel": "yes", + "noLabel": "no", + "emptyLabel": "null", + "options": [ + { + "key": "no", + "value": 0 + }, + { + "key": "yes", + "value": 1 + }, + { + "key": "null", + "value": -1 + } + ], + "width": "" } ], "locked": false, diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrderItem.json b/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrderItem.json index 1ad8eaed14..bb8cd2cce2 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrderItem.json +++ b/src/CoreShop/Bundle/OrderBundle/Resources/install/pimcore/classes/CoreShopOrderItem.json @@ -373,6 +373,41 @@ "documentTypes": [], "stack": "coreshop.order", "returnConcrete": false + }, + { + "name": "immutable", + "title": "coreshop.order_item.immutable", + "tooltip": "", + "mandatory": false, + "noteditable": true, + "index": false, + "locked": false, + "style": "", + "permissions": null, + "datatype": "data", + "fieldtype": "booleanSelect", + "relationType": false, + "invisible": false, + "visibleGridView": false, + "visibleSearch": false, + "yesLabel": "yes", + "noLabel": "no", + "emptyLabel": "null", + "options": [ + { + "key": "no", + "value": 0 + }, + { + "key": "yes", + "value": 1 + }, + { + "key": "null", + "value": -1 + } + ], + "width": "" } ], "locked": false diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/css/order.css b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/css/order.css index 939fb60b6b..391e56f7cd 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/css/order.css +++ b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/css/order.css @@ -335,3 +335,7 @@ body.pimcore_version_11 .coreshop-detail-grid .x-column-header { .coreshop-order-create-revise-link { font-weight: bold; } + +.coreshop_preview_mode { + background-color: #ff9e81; +} \ No newline at end of file diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/cart/pricerules/conditions/voucher.js b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/cart/pricerules/conditions/voucher.js index 0e45b38422..e21b973902 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/cart/pricerules/conditions/voucher.js +++ b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/cart/pricerules/conditions/voucher.js @@ -22,6 +22,11 @@ coreshop.cart.pricerules.conditions.voucher = Class.create(coreshop.rules.condit xtype: 'numberfield', name: 'maxUsagePerCode', value: this.data.maxUsagePerCode + },{ + fieldLabel: t('coreshop_action_voucher_max_usage_per_user'), + xtype: 'numberfield', + name: 'maxUsagePerUser', + value: this.data.maxUsagePerUser }, { fieldLabel: t('coreshop_action_voucher_only_one_per_cart'), diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/abstractBlock.js b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/abstractBlock.js index d2557b0a54..6ad0798765 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/abstractBlock.js +++ b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/abstractBlock.js @@ -58,5 +58,9 @@ coreshop.order.order.detail.abstractBlock = Class.create({ var me = this; return me.getPanel(); + }, + + getUpdateValues: function() { + return {}; } }); diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/blocks/detail.js b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/blocks/detail.js index 8c7c86e36a..29f61d7a1d 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/blocks/detail.js +++ b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/blocks/detail.js @@ -29,6 +29,7 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de margin: '0 0 20 0', iconCls: 'coreshop_icon_product', }); + }, getPriority: function () { @@ -52,7 +53,7 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de this.detailsInfo.removeAll(); - detailItems = [this.generateItemGrid(), this.generateSummaryGrid()]; + detailItems = [this.generateItemGridObject(), this.generateSummaryGrid()]; if (this.sale.priceRule) { detailItems.splice(1, 0, this.generatePriceRuleItem(this.sale.priceRule)); @@ -61,8 +62,22 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de this.detailsInfo.add(detailItems); }, - generateItemGrid: function () { + onRowEditingFinished: function(editor, context, eOpts) { + var qty = editor.editor.form.findField('quantity'); + + context.record.set('quantity', qty.getValue()); + }, + generateItemGridObject: function () { + var cartPanelGrid = Ext.create(this.generateItemGrid()); + cartPanelGrid.on('edit', function (editor, context, eOpts) { + this.onRowEditingFinished(editor, context, eOpts); + }.bind(this)); + + return cartPanelGrid; + }, + + generateItemGrid: function() { var _ = this, hasAdditionalData = false; @@ -75,42 +90,27 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de }) } - return { - xtype: 'grid', - margin: '0 0 15 0', - cls: 'coreshop-detail-grid', - store: this.detailsStore, - listeners: { - viewready: function (grid) { - if (hasAdditionalData === true) { - var view = grid.getView(), - rowExpander = grid.findPlugin('rowexpander'), - store = grid.getStore(), item; - for (var i = 0; i <= store.getCount(); i++) { - item = store.getAt(i); - if (item) { - rowExpander.toggleRow(i, item); - } - } - // remove toggle icon - view.getHeaderAtIndex(0).hide(); - } - } - }, - plugins: hasAdditionalData === true ? [{ + var plugins = []; + + if (this.sale.editable) { + plugins.push(Ext.create('Ext.grid.plugin.RowEditing')); + } + + if (hasAdditionalData) { + plugins.push({ ptype: 'rowexpander', expandOnDblClick: false, rowBodyTpl: new Ext.XTemplate( '
- -{{ currency.format(priceRule.getDiscount(true), order.currency.isoCode) }} + {{ currency.format(priceRule.getDiscount(true), order.currency.isoCode) }} - -{{ currency.format(priceRule.getDiscount(false), order.currency.isoCode) }} + {{ currency.format(priceRule.getDiscount(false), order.currency.isoCode) }}
+ class="text-right cart-total-price" {{ coreshop_test_html_attribute('order-total') }}> {{ currency.format(order.convertedTotal, order.currency.isoCode) }}
', - '', - '', - '', - '', - '', - '', - '', + '', + '', + '', + '', + '', + '', + '', '
', - '{[ this.formatData(values) ]}', - '
', + '{[ this.formatData(values) ]}', + '
', { formatData: function (row) { @@ -131,7 +131,32 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de } } ) - }] : [], + }); + } + + return { + xtype: 'grid', + margin: '0 0 15 0', + cls: 'coreshop-detail-grid', + store: this.detailsStore, + listeners: { + viewready: function (grid) { + if (hasAdditionalData === true) { + var view = grid.getView(), + rowExpander = grid.findPlugin('rowexpander'), + store = grid.getStore(), item; + for (var i = 0; i <= store.getCount(); i++) { + item = store.getAt(i); + if (item) { + rowExpander.toggleRow(i, item); + } + } + // remove toggle icon + view.getHeaderAtIndex(0).hide(); + } + } + }, + plugins: plugins, columns: [ { xtype: 'gridcolumn', @@ -146,10 +171,10 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de width: 150, align: 'right', renderer: coreshop.util.format.currency.bind(this, this.sale.baseCurrency.isoCode), - field: { - xtype: 'numberfield', - decimalPrecision: pimcore.globalmanager.get('coreshop.currency.decimal_precision') - } + // field: { + // xtype: 'numberfield', + // decimalPrecision: pimcore.globalmanager.get('coreshop.currency.decimal_precision') + // } }, { xtype: 'gridcolumn', @@ -296,8 +321,7 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de }, generateActions: function () { - - return [ + var actions = [ { iconCls: 'pimcore_icon_open', tooltip: t('open'), @@ -308,5 +332,21 @@ coreshop.order.order.detail.blocks.detail = Class.create(coreshop.order.order.de } } ]; - } + + return actions; + }, + + getUpdateValues: function () { + return { + items: this.getCartProducts() + }; + }, + + getCartProducts: function () { + return this.detailsStore.getRange().map(function (record) { + return { + quantity: record.get('quantity'), + }; + }); + }, }); diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/panel.js b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/panel.js index 83de67f3d1..0b06d57a0e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/panel.js +++ b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/order/detail/panel.js @@ -15,12 +15,15 @@ coreshop.order.order.detail.panel = Class.create({ modules: {}, eventManager: null, blocks: {}, + previewMode: false, sale: null, objectData: null, layoutId: null, type: 'order', iconCls: '', + previewButton: null, + saveButton: null, borderStyle: { borderStyle: 'solid', @@ -62,9 +65,69 @@ coreshop.order.order.detail.panel = Class.create({ if (res.success) { me.updateSale(res.sale); } else { - Ext.Msg.alert(t('open_target'), t('problem_opening_new_target')); + Ext.Msg.alert(t('error'), t('error')); } + me.setPreviewMode(false); + + me.layout.setLoading(false); + }.bind(this) + }); + }, + + save: function () { + var me = this; + + me.layout.setLoading(t('loading')); + + var data = {}; + + Ext.Object.each(me.blocks, function(id, block) { + data = Ext.apply({}, data, block.getUpdateValues()); + }); + + Ext.Ajax.request({ + url: Routing.generate('coreshop_admin_order_update', {id: me.sale.id}), + jsonData: data, + method: 'post', + success: function (response) { + var res = Ext.decode(response.responseText); + + if (res.success) { + me.updateSale(res.sale); + } + + me.setPreviewMode(false); + + me.layout.setLoading(false); + }.bind(this) + }); + }, + + preview: function () { + var me = this; + + me.layout.setLoading(t('loading')); + + var data = {}; + + Ext.Object.each(me.blocks, function(id, block) { + data = Ext.apply({}, data, block.getUpdateValues()); + }); + + Ext.Ajax.request({ + url: Routing.generate('coreshop_admin_order_update', {id: me.sale.id, preview: true}), + jsonData: data, + method: 'post', + success: function (response) { + var res = Ext.decode(response.responseText); + + if (res.success) { + me.updateSale(res.sale); + } + + me.setPreviewMode(true); + me.layout.setLoading(false); }.bind(this) }); @@ -74,6 +137,16 @@ coreshop.order.order.detail.panel = Class.create({ var me = this; me.sale = sale; + + if (me.sale.editable) { + me.saveButton.show(); + me.previewButton.show(); + } + else { + me.saveButton.hide(); + me.previewButton.hide(); + } + Ext.Object.each(me.blocks, function(id, block) { block.setSale(sale); }); @@ -92,7 +165,7 @@ coreshop.order.order.detail.panel = Class.create({ getLayout: function () { if (!this.layout) { - + var me = this; var buttons = [{ iconCls: 'pimcore_icon_reload', text: t('reload'), @@ -103,6 +176,28 @@ coreshop.order.order.detail.panel = Class.create({ var items = this.getItems(); buttons = buttons.concat(this.getTopButtons()); + me.previewButton = Ext.create({ + xtype: 'button', + iconCls: 'pimcore_icon_seemode', + text: t('preview'), + hidden: !this.sale.editable, + handler: function () { + this.preview(); + }.bind(this) + }); + me.saveButton = Ext.create({ + xtype: 'button', + iconCls: 'pimcore_icon_save', + text: t('save'), + hidden: !this.sale.editable, + handler: function () { + this.save(); + }.bind(this) + }); + + buttons.push(me.previewButton); + buttons.push(me.saveButton); + // create new panel this.layout = new Ext.panel.Panel({ id: this.layoutId, @@ -145,6 +240,19 @@ coreshop.order.order.detail.panel = Class.create({ return coreshop.order.order.detail.blocks; }, + setPreviewMode: function(previewMode) { + this.previewMode = previewMode; + + var toolbar = this.layout.getDockedItems('toolbar[dock="top"]'); + + if (this.previewMode) { + toolbar[0].addCls('coreshop_preview_mode'); + } + else { + toolbar[0].removeCls('coreshop_preview_mode'); + } + }, + getPanel: function () { var me = this, defaults = { diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/resource.js b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/resource.js index 284013c774..f8492b1acf 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/resource.js +++ b/src/CoreShop/Bundle/OrderBundle/Resources/public/pimcore/js/resource.js @@ -14,6 +14,7 @@ pimcore.registerNS('coreshop.order.resource'); coreshop.order.resource = Class.create(coreshop.resource, { initialize: function () { coreshop.global.addStoreWithRoute('coreshop_cart_price_rules', 'coreshop_cart_price_rule_list'); + coreshop.global.addStoreWithRoute('coreshop_cart_price_voucher_rules', 'coreshop_cart_price_rule_listVoucherRules'); Ext.Ajax.request({ url: Routing.generate('coreshop_admin_order_get_states'), diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.de.yml b/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.de.yml index 343376bc2a..d58827d4ae 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.de.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.de.yml @@ -17,6 +17,7 @@ coreshop_action_discount_apply_on: 'Anwenden auf' coreshop_action_discount_apply_on_total: 'Gesamtsumme' coreshop_action_discount_apply_on_subtotal: 'Zwischensumme' coreshop_action_voucher_max_usage_per_code: 'Maximale Verwendung pro Code' +coreshop_action_voucher_max_usage_per_user: 'Maximale Verwendung pro User' coreshop_action_voucher_only_one_per_cart: 'Nur ein Gutscheincode pro Warenkorb erlauben' coreshop_is_voucher_rule: 'Ist Gutschein Regel' coreshop_priceRule: 'Preis Regel' @@ -470,4 +471,7 @@ coreshop.order_item.converted_custom_item_price: 'Umgerechnet kundenspezifischer coreshop.order.converted_payment_total: 'Umgerechnet Zahlungsbetrag' coreshop.order.payment_total: 'Zahlungsbetrag' coreshop.order.carrier: 'Versanddienst' -coreshop.order.weight: 'Gewicht' \ No newline at end of file +coreshop.order.weight: 'Gewicht' +coreshop_custom_item_discount: 'Eigener Item Rabatt' +coreshop_custom_item_price: 'Eigener Item Preis' +coreshop_order_create_base: 'Einstellungen' \ No newline at end of file diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.en.yml b/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.en.yml index c9ab2425eb..668fb9cfd6 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.en.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.en.yml @@ -16,6 +16,7 @@ coreshop_action_discount_apply_on: 'Apply On' coreshop_action_discount_apply_on_total: 'Total' coreshop_action_discount_apply_on_subtotal: 'Subtotal' coreshop_action_voucher_max_usage_per_code: 'Max. Usage per Code' +coreshop_action_voucher_max_usage_per_user: 'Max. Usage per User' coreshop_action_voucher_only_one_per_cart: 'Allow only one Voucher per Cart' coreshop_is_voucher_rule: 'Is Voucher Rule' coreshop_priceRule: 'Cart Price Rule' @@ -473,3 +474,6 @@ coreshop.order.converted_payment_total: 'Converted Payment Total' coreshop.order.payment_total: 'Payment Total' coreshop.order.carrier: 'Carrier' coreshop.order.weight: 'Weight' +coreshop_custom_item_discount: 'Custom Item Discount' +coreshop_custom_item_price: 'Custom Item Price' +coreshop_order_create_base: 'Settings' \ No newline at end of file diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.it.yml b/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.it.yml index 7caca9f1d8..b79a11d766 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.it.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/translations/admin.it.yml @@ -16,6 +16,7 @@ coreshop_action_discount_apply_on: 'Applica su' coreshop_action_discount_apply_on_total: 'Totale' coreshop_action_discount_apply_on_subtotal: 'Totale parziale' coreshop_action_voucher_max_usage_per_code: 'Utilizzo massimo per codice' +coreshop_action_voucher_max_usage_per_user: 'Utilizzo massimo per utente' coreshop_action_voucher_only_one_per_cart: 'Consenti un solo voucher per carrello' coreshop_priceRule: 'Regola di prezzo del carrello' coreshop_carrier_based_on_order: 'Il corriere "{0}" è stato selezionato nell''ordine ed è preselezionato.' diff --git a/src/CoreShop/Bundle/OrderBundle/StateResolver/OrderPaymentStateResolver.php b/src/CoreShop/Bundle/OrderBundle/StateResolver/OrderPaymentStateResolver.php index 6a6f9b4d94..e9886f3f31 100644 --- a/src/CoreShop/Bundle/OrderBundle/StateResolver/OrderPaymentStateResolver.php +++ b/src/CoreShop/Bundle/OrderBundle/StateResolver/OrderPaymentStateResolver.php @@ -24,7 +24,7 @@ use CoreShop\Component\Order\StateResolver\StateResolverInterface; use CoreShop\Component\Payment\Model\PaymentInterface; use CoreShop\Component\Payment\Repository\PaymentRepositoryInterface; -use Symfony\Component\Workflow\Workflow; +use Symfony\Component\Workflow\WorkflowInterface; final class OrderPaymentStateResolver implements StateResolverInterface { @@ -44,7 +44,7 @@ public function resolve(OrderInterface $order): void } } - private function applyTransition(Workflow $workflow, OrderInterface $subject, string $transition): void + private function applyTransition(WorkflowInterface $workflow, OrderInterface $subject, string $transition): void { if ($workflow->can($subject, $transition)) { $workflow->apply($subject, $transition); @@ -100,6 +100,18 @@ private function getTargetTransition(OrderInterface $order): ?string return OrderPaymentTransitions::TRANSITION_PARTIALLY_AUTHORIZE; } + // Processing payments + $processingPaymentTotal = 0; + $processingPayments = $this->getPaymentsWithState($order, PaymentInterface::STATE_PROCESSING); + + foreach ($processingPayments as $payment) { + $processingPaymentTotal += $payment->getTotalAmount(); + } + + if (count($processingPayments) > 0 && $processingPaymentTotal >= $order->getPaymentTotal()) { + return OrderPaymentTransitions::TRANSITION_REQUEST_PAYMENT; + } + return null; } diff --git a/src/CoreShop/Bundle/PaymentBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/PaymentBundle/DependencyInjection/Configuration.php index dbd348680f..2bcc01336b 100644 --- a/src/CoreShop/Bundle/PaymentBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/PaymentBundle/DependencyInjection/Configuration.php @@ -22,6 +22,7 @@ use CoreShop\Bundle\PaymentBundle\Doctrine\ORM\PaymentProviderRepository; use CoreShop\Bundle\PaymentBundle\Doctrine\ORM\PaymentRepository; use CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderRuleGroupType; +use CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderRuleTranslationType; use CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderRuleType; use CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderTranslationType; use CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderType; @@ -36,6 +37,8 @@ use CoreShop\Component\Payment\Model\PaymentProviderRuleGroup; use CoreShop\Component\Payment\Model\PaymentProviderRuleGroupInterface; use CoreShop\Component\Payment\Model\PaymentProviderRuleInterface; +use CoreShop\Component\Payment\Model\PaymentProviderRuleTranslation; +use CoreShop\Component\Payment\Model\PaymentProviderRuleTranslationInterface; use CoreShop\Component\Payment\Model\PaymentProviderTranslation; use CoreShop\Component\Payment\Model\PaymentProviderTranslationInterface; use CoreShop\Component\Resource\Factory\Factory; @@ -75,6 +78,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('payment_provider')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -90,6 +99,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -136,6 +151,22 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->scalarNode('form')->defaultValue(PaymentProviderRuleType::class)->cannotBeEmpty()->end() ->end() ->end() + ->arrayNode('translation') + ->addDefaultsIfNotSet() + ->children() + ->variableNode('options')->end() + ->arrayNode('classes') + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('model')->defaultValue(PaymentProviderRuleTranslation::class)->cannotBeEmpty()->end() + ->scalarNode('interface')->defaultValue(PaymentProviderRuleTranslationInterface::class)->cannotBeEmpty()->end() + ->scalarNode('repository')->cannotBeEmpty()->end() + ->scalarNode('factory')->defaultValue(Factory::class)->end() + ->scalarNode('form')->defaultValue(PaymentProviderRuleTranslationType::class)->cannotBeEmpty()->end() + ->end() + ->end() + ->end() + ->end() ->end() ->end() ->arrayNode('payment_provider_rule_group') diff --git a/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleTranslationType.php b/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleTranslationType.php new file mode 100644 index 0000000000..7599aa1758 --- /dev/null +++ b/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleTranslationType.php @@ -0,0 +1,38 @@ +add('label', TextType::class) + ; + } + + public function getBlockPrefix(): string + { + return 'coreshop_payment_provider_rule_translation'; + } +} diff --git a/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleType.php b/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleType.php index 824da3ec28..bf66c166bb 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleType.php +++ b/src/CoreShop/Bundle/PaymentBundle/Form/Type/PaymentProviderRuleType.php @@ -18,6 +18,7 @@ namespace CoreShop\Bundle\PaymentBundle\Form\Type; +use CoreShop\Bundle\ResourceBundle\Form\Type\ResourceTranslationsType; use CoreShop\Bundle\RuleBundle\Form\Type\RuleType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; @@ -28,6 +29,9 @@ final class PaymentProviderRuleType extends RuleType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder + ->add('translations', ResourceTranslationsType::class, [ + 'entry_type' => PaymentProviderRuleTranslationType::class, + ]) ->add('name', TextareaType::class) ->add('active', CheckboxType::class) ->add('conditions', PaymentProviderRuleConditionCollectionType::class) diff --git a/src/CoreShop/Bundle/PaymentBundle/Form/Type/Rule/Common/PaymentProviderRuleConfigurationType.php b/src/CoreShop/Bundle/PaymentBundle/Form/Type/Rule/Common/PaymentProviderRuleConfigurationType.php index e375592b25..44feff84aa 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Form/Type/Rule/Common/PaymentProviderRuleConfigurationType.php +++ b/src/CoreShop/Bundle/PaymentBundle/Form/Type/Rule/Common/PaymentProviderRuleConfigurationType.php @@ -38,24 +38,24 @@ public function __construct( public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->add('paymentproviderRule', PaymentProviderRuleChoiceType::class, [ + ->add('paymentProviderRule', PaymentProviderRuleChoiceType::class, [ 'constraints' => [ new NotBlank(['groups' => $this->validationGroups]), ], ]) ; - $builder->get('paymentproviderRule')->addModelTransformer(new CallbackTransformer( - function (mixed $paymentproviderRule) { - if ($paymentproviderRule instanceof PaymentProviderRuleInterface) { - return $paymentproviderRule->getId(); + $builder->get('paymentProviderRule')->addModelTransformer(new CallbackTransformer( + function (mixed $paymentProviderRule) { + if ($paymentProviderRule instanceof PaymentProviderRuleInterface) { + return $paymentProviderRule->getId(); } return null; }, - function (mixed $paymentproviderRule) { - if ($paymentproviderRule instanceof PaymentProviderRuleInterface) { - return $paymentproviderRule->getId(); + function (mixed $paymentProviderRule) { + if ($paymentProviderRule instanceof PaymentProviderRuleInterface) { + return $paymentProviderRule->getId(); } return null; diff --git a/src/CoreShop/Bundle/PaymentBundle/README.md b/src/CoreShop/Bundle/PaymentBundle/README.md index dc67f3db14..474fcd21de 100644 --- a/src/CoreShop/Bundle/PaymentBundle/README.md +++ b/src/CoreShop/Bundle/PaymentBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/doctrine/model/PaymentProviderRuleTranslation.orm.xml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/doctrine/model/PaymentProviderRuleTranslation.orm.xml new file mode 100644 index 0000000000..cf59815035 --- /dev/null +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/doctrine/model/PaymentProviderRuleTranslation.orm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/pimcore/admin.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/pimcore/admin.yml index 01033905b0..67a5c19b3d 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/config/pimcore/admin.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/pimcore/admin.yml @@ -16,6 +16,7 @@ core_shop_payment: payment_provider_rule_conditions_paymentProviderRule: '/bundles/coreshoppayment/pimcore/js/paymentproviderrule/conditions/paymentProviderRule.js' payment_provider_rule_actions_addition_percent: '/bundles/coreshoppayment/pimcore/js/paymentproviderrule/actions/additionPercent.js' payment_provider_rule_actions_discount_percent: '/bundles/coreshoppayment/pimcore/js/paymentproviderrule/actions/discountPercent.js' + payment_provider_rule_actions_paymentProviderRule: '/bundles/coreshoppayment/pimcore/js/paymentproviderrule/actions/paymentProviderRule.js' payment_gateway_abstract: '/bundles/coreshoppayment/pimcore/js/provider/gateways/abstract.js' diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRule.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRule.yml index 8633bdf192..b2933fb02b 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRule.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRule.yml @@ -22,4 +22,8 @@ CoreShop\Component\Payment\Model\PaymentProviderRule: actions: expose: true type: ArrayCollection - groups: [Detailed] \ No newline at end of file + groups: [Detailed] + translations: + expose: true + type: ArrayCollection + groups: [Detailed] diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRuleTranslation.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRuleTranslation.yml new file mode 100644 index 0000000000..3681f9389f --- /dev/null +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/serializer/Model.PaymentProviderRuleTranslation.yml @@ -0,0 +1,8 @@ +CoreShop\Component\Payment\Model\PaymentProviderRuleTranslation: + exclusion_policy: ALL + xml_root_name: payment_provider_rule_translation + properties: + label: + expose: true + type: string + groups: [Detailed] diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/services.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/services.yml index 1b96d2d23d..08de08b90b 100755 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/services.yml @@ -16,6 +16,8 @@ services: tags: - { name: coreshop.registry, type_hint: paymentPriceCalculators } + CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculatorInterface: '@CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculator' + CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculator: arguments: - '@CoreShop\Component\Payment\Checker\PaymentProviderRuleCheckerInterface' diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/form.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/form.yml index 28f0f61bda..aa683e7220 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/form.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/form.yml @@ -3,6 +3,7 @@ parameters: coreshop.form.type.payment_provider_translation.validation_groups: [coreshop] coreshop.form.type.payment_provider_rule.validation_groups: [coreshop] coreshop.form.type.payment_provider_rule_group.validation_groups: [coreshop] + coreshop.form.type.payment_provider_rule_translation.validation_groups: [ coreshop ] coreshop.form.type.payment_provider_rule.action.addition_percent.validation_groups: [ coreshop ] coreshop.form.type.payment_provider_rule.action.discount_percent.validation_groups: [ coreshop ] coreshop.form.type.payment_provider_rule.rule.validation_groups: [coreshop] @@ -71,6 +72,13 @@ services: tags: - { name: form.type } + CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderRuleTranslationType: + arguments: + - '%coreshop.model.payment_provider_rule_translation.class%' + - '%coreshop.form.type.payment_provider_rule_translation.validation_groups%' + tags: + - { name: form.type } + CoreShop\Bundle\PaymentBundle\Form\Type\PaymentProviderRuleConditionCollectionType: arguments: - '@coreshop.registry.payment_provider_rule.conditions' diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/paymentprovider-rules.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/paymentprovider-rules.yml index 4a2fe9c6cc..47789eefb8 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/paymentprovider-rules.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/config/services/paymentprovider-rules.yml @@ -13,7 +13,6 @@ services: coreshop.form_registry.payment_provider_rule.conditions: class: CoreShop\Bundle\ResourceBundle\Form\Registry\FormTypeRegistry - coreshop.registry.payment_provider_rule.actions: class: CoreShop\Component\Registry\ServiceRegistry arguments: @@ -46,6 +45,12 @@ services: tags: - { name: coreshop.payment_provider_rule.condition, type: amount, form-type: CoreShop\Bundle\PaymentBundle\Form\Type\Rule\Condition\AmountConfigurationType } + CoreShop\Component\Payment\Rule\Condition\PaymentProviderRuleConditionChecker: + arguments: + - '@coreshop.payment_provider_rule.processor' + - '@coreshop.repository.payment_provider_rule' + tags: + - { name: coreshop.payment_provider_rule.condition, type: paymentProviderRule, form-type: CoreShop\Bundle\PaymentBundle\Form\Type\Rule\Common\PaymentProviderRuleConfigurationType } coreshop.payment_provider_rule.condition.nested: class: CoreShop\Component\Rule\Condition\NestedConditionChecker diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/css/payment.css b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/css/payment.css index 7dee7f948b..307f09ac68 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/css/payment.css +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/css/payment.css @@ -29,7 +29,10 @@ body.pimcore_version_11 .coreshop_nav_icon_payment_provider { background: url(../img/payment-provider-rule.svg) center center no-repeat !important; } -body.pimcore_version_11 .coreshop_nav_icon_payment_provider_rule { +body.pimcore_version_11 .coreshop_nav_icon_payment_provider_rule, +.coreshop_rule_icon_action_paymentProviderRule, +.coreshop_rule_icon_condition_paymentProviderRule { +>>>>>>> 3.2 background: url(../img/payment-provider-rule_white.svg) center center no-repeat !important; } diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/actions/paymentProviderRule.js b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/actions/paymentProviderRule.js new file mode 100644 index 0000000000..e61e6458d8 --- /dev/null +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/actions/paymentProviderRule.js @@ -0,0 +1,53 @@ +/* + * CoreShop. + * + * This source file is subject to the GNU General Public License version 3 (GPLv3) + * For the full copyright and license information, please view the LICENSE.md and gpl-3.0.txt + * files that are distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + +pimcore.registerNS('coreshop.paymentproviderrule.actions.paymentProviderRule'); + +coreshop.paymentproviderrule.actions.paymentProviderRule = Class.create(coreshop.rules.conditions.abstract, { + type: 'paymentProviderRule', + + getForm: function () { + var me = this; + + var rule = { + xtype: 'combo', + fieldLabel: t('coreshop_action_paymentProviderRule'), + typeAhead: true, + listWidth: 100, + width: 500, + store: { + type: 'coreshop_payment_provider_rules' + }, + displayField: 'name', + valueField: 'id', + forceSelection: true, + multiselect: true, + triggerAction: 'all', + name: 'paymentProviderRule', + maxHeight: 400, + delimiter: false, + value: me.data.paymentProviderRule + }; + + if (this.data && this.data.paymentProviderRule) { + rule.value = this.data.paymentProviderRule; + } + + this.form = new Ext.form.Panel({ + items: [ + rule + ] + }); + + return this.form; + } +}); diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/conditions/paymentProviderRule.js b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/conditions/paymentProviderRule.js index a158072a96..2549177268 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/conditions/paymentProviderRule.js +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/conditions/paymentProviderRule.js @@ -10,37 +10,36 @@ * */ -pimcore.registerNS('coreshop.paymentproviderrule.conditions.paymentproviderRule'); +pimcore.registerNS('coreshop.paymentproviderrule.conditions.paymentProviderRule'); -coreshop.paymentproviderrule.conditions.paymentproviderRule = Class.create(coreshop.rules.conditions.abstract, { - type: 'paymentproviderRule', +coreshop.paymentproviderrule.conditions.paymentProviderRule = Class.create(coreshop.rules.conditions.abstract, { + type: 'paymentProviderRule', getForm: function () { var me = this; - var store = pimcore.globalmanager.get(''); var rule = { xtype: 'combo', - fieldLabel: t('coreshop_condition_paymentproviderRule'), + fieldLabel: t('coreshop_condition_paymentProviderRule'), typeAhead: true, listWidth: 100, width: 500, store: { - type: 'coreshop_paymentprovider_rules' + type: 'coreshop_payment_provider_rules' }, displayField: 'name', valueField: 'id', forceSelection: true, multiselect: true, triggerAction: 'all', - name: 'paymentproviderRule', + name: 'paymentProviderRule', maxHeight: 400, delimiter: false, - value: me.data.paymentproviderRule + value: me.data.paymentProviderRule }; - if (this.data && this.data.paymentproviderRule) { - rule.value = this.data.paymentproviderRule; + if (this.data && this.data.paymentProviderRule) { + rule.value = this.data.paymentProviderRule; } this.form = new Ext.form.Panel({ diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/item.js b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/item.js index 2f70dc736a..8d2af74563 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/item.js +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/paymentproviderrule/item.js @@ -42,7 +42,25 @@ coreshop.paymentproviderrule.item = Class.create(coreshop.rules.item, { }, getSettings: function () { - var data = this.data; + var data = this.data, + langTabs = []; + + Ext.each(pimcore.settings.websiteLanguages, function (lang) { + var tab = { + title: pimcore.available_languages[lang], + iconCls: 'pimcore_icon_language_' + lang.toLowerCase(), + layout: 'form', + items: [{ + xtype: 'textfield', + name: 'translations.' + lang + '.label', + fieldLabel: t('coreshop_payment_provider_rule_label'), + width: 400, + value: data.translations && data.translations[lang] ? data.translations[lang].label : '' + }] + }; + + langTabs.push(tab); + }); this.settingsForm = Ext.create('Ext.form.Panel', { iconCls: 'coreshop_icon_settings', @@ -61,6 +79,15 @@ coreshop.paymentproviderrule.item = Class.create(coreshop.rules.item, { name: 'active', fieldLabel: t('active'), checked: data.active + }, { + xtype: 'tabpanel', + activeTab: 0, + defaults: { + autoHeight: true, + bodyStyle: 'padding:10px;' + }, + width: '100%', + items: langTabs }] }); diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/provider/item.js b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/provider/item.js index e23ee61f82..5a7ee8e754 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/provider/item.js +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/public/pimcore/js/provider/item.js @@ -186,7 +186,7 @@ coreshop.provider.item = Class.create(coreshop.resource.item, { this.paymentProviderRuleGroupsGrid = Ext.create('Ext.grid.Panel', { columns: [ { - header: t('coreshop_carriers_payment_provider_rule'), + header: t('coreshop_payment_provider_rule'), flex: 2, dataIndex: 'paymentProviderRule', editor: new Ext.form.ComboBox({ diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.de.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.de.yml index da8ad99645..e1ea2a727a 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.de.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.de.yml @@ -15,3 +15,6 @@ coreshop_payment_sofort_config_key: 'Konfigurationsschlüssel' coreshop_paypal_sandbox: 'Sandbox' coreshop_logo: 'Logo' coreshop_payment_provider_rule: 'Zahlungsanbieterregel' +coreshop_action_paymentProviderRule: 'Zahlungsanbieterregel' +coreshop_condition_paymentProviderRule: 'Zahlungsanbieterregel' +coreshop_payment_provider_rule_label: 'Bezeichnung' diff --git a/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.en.yml b/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.en.yml index 291314f2d7..3338ed5c90 100644 --- a/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.en.yml +++ b/src/CoreShop/Bundle/PaymentBundle/Resources/translations/admin.en.yml @@ -14,4 +14,7 @@ coreshop_payment_sofort_config_key: 'Config Key' coreshop_paypal_sandbox: 'Sandbox' coreshop_logo: 'Logo' coreshop_payment_provider_rule: 'Payment Provider Rules' -coreshop_payment_provider_main_panel: 'Main' \ No newline at end of file +coreshop_payment_provider_main_panel: 'Main' +coreshop_action_paymentProviderRule: 'Payment Provider Rule' +coreshop_condition_paymentProviderRule: 'Payment Provider Rule' +coreshop_payment_provider_rule_label: 'Label' diff --git a/src/CoreShop/Bundle/PayumBundle/Action/ConfirmOrderAction.php b/src/CoreShop/Bundle/PayumBundle/Action/ConfirmOrderAction.php index eee4cf6525..20ae57bb94 100644 --- a/src/CoreShop/Bundle/PayumBundle/Action/ConfirmOrderAction.php +++ b/src/CoreShop/Bundle/PayumBundle/Action/ConfirmOrderAction.php @@ -37,7 +37,8 @@ public function execute($request): void $payment = $request->getFirstModel(); $order = $payment->getOrder(); if ($payment->getState() === PaymentInterface::STATE_COMPLETED || - $payment->getState() === PaymentInterface::STATE_AUTHORIZED + $payment->getState() === PaymentInterface::STATE_AUTHORIZED || + $payment->getState() === PaymentInterface::STATE_PROCESSING ) { $this->stateMachineApplier->apply($order, OrderTransitions::IDENTIFIER, OrderTransitions::TRANSITION_CONFIRM); diff --git a/src/CoreShop/Bundle/PayumBundle/Action/ResolveNextRouteAction.php b/src/CoreShop/Bundle/PayumBundle/Action/ResolveNextRouteAction.php index c1a982312f..573b84a7af 100644 --- a/src/CoreShop/Bundle/PayumBundle/Action/ResolveNextRouteAction.php +++ b/src/CoreShop/Bundle/PayumBundle/Action/ResolveNextRouteAction.php @@ -42,7 +42,8 @@ public function execute($request): void ]); if ($payment->getState() === PaymentInterface::STATE_COMPLETED || - $payment->getState() === PaymentInterface::STATE_AUTHORIZED + $payment->getState() === PaymentInterface::STATE_AUTHORIZED || + $payment->getState() === PaymentInterface::STATE_PROCESSING ) { $request->setRouteName('coreshop_checkout_thank_you'); $request->setRouteParameters([ diff --git a/src/CoreShop/Bundle/PayumBundle/Extension/UpdateOrderStateExtension.php b/src/CoreShop/Bundle/PayumBundle/Extension/UpdateOrderStateExtension.php index 41b3cb6027..813be9e076 100644 --- a/src/CoreShop/Bundle/PayumBundle/Extension/UpdateOrderStateExtension.php +++ b/src/CoreShop/Bundle/PayumBundle/Extension/UpdateOrderStateExtension.php @@ -92,7 +92,8 @@ public function onPostExecute(Context $context): void } if ($value === PaymentInterface::STATE_COMPLETED || - $value === PaymentInterface::STATE_AUTHORIZED + $value === PaymentInterface::STATE_AUTHORIZED || + $value === PaymentInterface::STATE_PROCESSING ) { $order = $payment->getOrder(); $this->confirmOrderState($order); diff --git a/src/CoreShop/Bundle/PayumBundle/README.md b/src/CoreShop/Bundle/PayumBundle/README.md index 0a2abc50cf..1377046e0a 100644 --- a/src/CoreShop/Bundle/PayumBundle/README.md +++ b/src/CoreShop/Bundle/PayumBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PayumPaymentBundle/README.md b/src/CoreShop/Bundle/PayumPaymentBundle/README.md index 1d98e15b57..ce352935d1 100644 --- a/src/CoreShop/Bundle/PayumPaymentBundle/README.md +++ b/src/CoreShop/Bundle/PayumPaymentBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://www.coreshop.org/docs/2.1.0/Bundles/PayumPayment_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PimcoreBundle/README.md b/src/CoreShop/Bundle/PimcoreBundle/README.md index 1eeff93926..3261795ba3 100644 --- a/src/CoreShop/Bundle/PimcoreBundle/README.md +++ b/src/CoreShop/Bundle/PimcoreBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PimcoreBundle/Resources/config/services.yml b/src/CoreShop/Bundle/PimcoreBundle/Resources/config/services.yml index c9e442de87..969df8cc66 100644 --- a/src/CoreShop/Bundle/PimcoreBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/PimcoreBundle/Resources/config/services.yml @@ -25,6 +25,7 @@ services: CoreShop\Component\Pimcore\DataObject\NoteService: arguments: - '@event_dispatcher' + - '@monolog.logger.pimcore' CoreShop\Component\Pimcore\DataObject\ObjectClonerInterface: '@CoreShop\Component\Pimcore\DataObject\ObjectCloner' CoreShop\Component\Pimcore\DataObject\ObjectCloner: ~ @@ -36,6 +37,8 @@ services: coreshop.expression_language: class: Symfony\Component\ExpressionLanguage\ExpressionLanguage + arguments: + - '@cache.system' CoreShop\Component\Pimcore\ExpressionLanguage\PimcoreLanguageProvider: tags: diff --git a/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductSpecificPriceRules.php b/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductSpecificPriceRules.php index 2ff800affc..0ef7efd6f9 100644 --- a/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductSpecificPriceRules.php +++ b/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductSpecificPriceRules.php @@ -107,7 +107,7 @@ public function preGetData(mixed $object, array $params = []): mixed } } - return $data; + return $data ?? []; } public function createDataCopy(Concrete $object, mixed $data): mixed diff --git a/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinition.php b/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinition.php index 21c6f7fff1..42b75b1ce4 100644 --- a/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinition.php +++ b/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinition.php @@ -250,7 +250,7 @@ public function isEmpty(mixed $data): bool public function getVersionPreview(mixed $data, Concrete $object = null, array $params = []): string { - return $data; + return (string) $data; } public function getForCsvExport(Concrete|\Pimcore\Model\DataObject\Objectbrick\Data\AbstractData|\Pimcore\Model\DataObject\Fieldcollection\Data\AbstractData|\Pimcore\Model\DataObject\Localizedfield $object, array $params = []): string diff --git a/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinitions.php b/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinitions.php index 4ae5999b8b..763f426c81 100644 --- a/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinitions.php +++ b/src/CoreShop/Bundle/ProductBundle/CoreExtension/ProductUnitDefinitions.php @@ -366,7 +366,7 @@ public function save(Concrete|Model\DataObject\Objectbrick\Data\AbstractData|Mod $productUnitDefinitions->setProduct($object); $this->getEntityManager()->persist($productUnitDefinitions); - $this->getEntityManager()->flush($productUnitDefinitions); + $this->getEntityManager()->flush(); } } @@ -457,9 +457,12 @@ public function getVersionPreview(mixed $data, Concrete $object = null, array $p $defaultUnit = $data->getDefaultUnitDefinition() instanceof ProductUnitDefinitionInterface && $data->getDefaultUnitDefinition()->getUnit() instanceof ProductUnitInterface ? $data->getDefaultUnitDefinition()->getUnit()->getName() : '--'; return sprintf( - 'Default Unit: %s, additional units: %d', + 'Default Unit: %s, additional units: %d (%s)', $defaultUnit, $data->getAdditionalUnitDefinitions()->count(), + implode(', ', array_map(static function(ProductUnitDefinitionInterface $unitDefinition) { + return sprintf('%s: %s %s', $unitDefinition->getId(), $unitDefinition->getConversionRate(), $unitDefinition->getUnitName()); + }, $data->getUnitDefinitions()->toArray())) ); } @@ -537,7 +540,7 @@ private function getEntityManager() */ private function getFormFactory() { - return \Pimcore::getContainer()->get('form.factory'); + return \Pimcore::getContainer()->get('coreshop.form.factory'); } /** diff --git a/src/CoreShop/Bundle/ProductBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/ProductBundle/DependencyInjection/Configuration.php index c966d89ab4..8d0be12e85 100644 --- a/src/CoreShop/Bundle/ProductBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/ProductBundle/DependencyInjection/Configuration.php @@ -171,6 +171,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('product_unit')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -186,6 +192,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -204,6 +216,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -220,6 +238,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -235,6 +259,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() diff --git a/src/CoreShop/Bundle/ProductBundle/EventListener/ClearCachedPriceRulesListener.php b/src/CoreShop/Bundle/ProductBundle/EventListener/ClearCachedPriceRulesListener.php deleted file mode 100644 index 4ece138df7..0000000000 --- a/src/CoreShop/Bundle/ProductBundle/EventListener/ClearCachedPriceRulesListener.php +++ /dev/null @@ -1,40 +0,0 @@ -getSubject(); - - if ($rule instanceof ProductPriceRuleInterface || $rule instanceof ProductSpecificPriceRuleInterface) { - Cache::clearTag('product_price_rule'); - } - } -} diff --git a/src/CoreShop/Bundle/ProductBundle/README.md b/src/CoreShop/Bundle/ProductBundle/README.md index 80747034f9..846271f037 100644 --- a/src/CoreShop/Bundle/ProductBundle/README.md +++ b/src/CoreShop/Bundle/ProductBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductSpecificPriceRule.orm.xml b/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductSpecificPriceRule.orm.xml index 9bf69543e6..44ba5bb55b 100644 --- a/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductSpecificPriceRule.orm.xml +++ b/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductSpecificPriceRule.orm.xml @@ -32,7 +32,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinition.orm.xml b/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinition.orm.xml index eef54c91ea..760b332680 100644 --- a/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinition.orm.xml +++ b/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinition.orm.xml @@ -15,17 +15,10 @@ - - - - - - - diff --git a/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml b/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml index a8e09f36bf..10df707018 100644 --- a/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml +++ b/src/CoreShop/Bundle/ProductBundle/Resources/config/doctrine/model/ProductUnitDefinitionPrice.orm.xml @@ -12,7 +12,6 @@ - diff --git a/src/CoreShop/Bundle/ProductBundle/Resources/config/services.yml b/src/CoreShop/Bundle/ProductBundle/Resources/config/services.yml index ac8fba4630..6b29e0e166 100755 --- a/src/CoreShop/Bundle/ProductBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/ProductBundle/Resources/config/services.yml @@ -114,13 +114,6 @@ services: - '@CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface' - '@CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface' - CoreShop\Bundle\ProductBundle\EventListener\ClearCachedPriceRulesListener: - tags: - - { name: kernel.event_listener, event: coreshop.product_price_rule.post_save, method: clearCachedRules } - - { name: kernel.event_listener, event: coreshop.product_specific_price_rule.post_save, method: clearCachedRules } - - { name: kernel.event_listener, event: coreshop.product_price_rule.post_delete, method: clearCachedRules } - - { name: kernel.event_listener, event: coreshop.product_specific_price_rule.post_delete, method: clearCachedRules } - CoreShop\Bundle\ProductBundle\EventListener\CategoryPersistEventListener: tags: - { name: kernel.event_listener, event: pimcore.dataobject.preUpdate, method: onPreUpdate } diff --git a/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md b/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md index 37af807c3f..b94f9c93bb 100644 --- a/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md +++ b/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/Resources/config/doctrine/model/ProductQuantityPriceRule.orm.xml b/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/Resources/config/doctrine/model/ProductQuantityPriceRule.orm.xml index 8ebd2678fe..9cda09e054 100644 --- a/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/Resources/config/doctrine/model/ProductQuantityPriceRule.orm.xml +++ b/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/Resources/config/doctrine/model/ProductQuantityPriceRule.orm.xml @@ -42,9 +42,11 @@ target-entity="CoreShop\Component\ProductQuantityPriceRules\Model\QuantityRangeInterface" mapped-by="rule" orphan-removal="true" fetch="LAZY"> - - + + + + diff --git a/src/CoreShop/Bundle/ResourceBundle/Cache/CoreCacheHandlerDecorator.php b/src/CoreShop/Bundle/ResourceBundle/Cache/CoreCacheHandlerDecorator.php new file mode 100644 index 0000000000..1acf5d21d5 --- /dev/null +++ b/src/CoreShop/Bundle/ResourceBundle/Cache/CoreCacheHandlerDecorator.php @@ -0,0 +1,54 @@ +getClass(); + + foreach ($class->getFieldDefinitions() as $fd) { + if (!$fd instanceof CacheMarshallerInterface) { + continue; + } + + $data->setObjectVar( + $fd->getName(), + $fd->unmarshalForCache($data, $data->getObjectVar($fd->getName())), + ); + } + } + + return $data; + } +} diff --git a/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelation.php b/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelation.php index 08373b4f50..93ed4a96f3 100644 --- a/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelation.php +++ b/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelation.php @@ -31,6 +31,10 @@ class CoreShopRelation extends Data\ManyToOneRelation public bool $returnConcrete = false; + public bool $objectsAllowed = true; + + public array $classes = []; + public function getFieldType(): string { return 'coreShopRelation'; @@ -106,28 +110,12 @@ public function setClasses(array $classes): static return $this; } - public function getObjectsAllowed(): bool + public static function __set_state(array $data): static { - return true; - } + $obj = parent::__set_state($data); + $obj->classes = $obj->getClasses(); + $obj->objectsAllowed = true; - public function getDocumentsAllowed(): bool - { - return false; - } - - public function getDocumentTypes(): array - { - return []; - } - - public function getAssetsAllowed(): bool - { - return false; - } - - public function getAssetTypes(): array - { - return []; + return $obj; } } diff --git a/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelations.php b/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelations.php index ae08e8b286..f753613cc6 100644 --- a/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelations.php +++ b/src/CoreShop/Bundle/ResourceBundle/CoreExtension/CoreShopRelations.php @@ -27,6 +27,10 @@ class CoreShopRelations extends Data\ManyToManyRelation { public string|null $stack; + public bool $objectsAllowed = true; + + public array $classes = []; + public function getFieldType(): string { return 'coreShopRelations'; @@ -102,28 +106,12 @@ public function getClasses(): array return $return; } - public function getObjectsAllowed(): bool + public static function __set_state(array $data): static { - return true; - } + $obj = parent::__set_state($data); + $obj->classes = $obj->getClasses(); + $obj->objectsAllowed = true; - public function getDocumentsAllowed(): bool - { - return false; - } - - public function getDocumentTypes(): array - { - return []; - } - - public function getAssetsAllowed(): bool - { - return false; - } - - public function getAssetTypes(): array - { - return []; + return $obj; } } diff --git a/src/CoreShop/Bundle/ResourceBundle/CoreExtension/Document/Select.php b/src/CoreShop/Bundle/ResourceBundle/CoreExtension/Document/Select.php index 554d06d40a..f2cc6886e2 100644 --- a/src/CoreShop/Bundle/ResourceBundle/CoreExtension/Document/Select.php +++ b/src/CoreShop/Bundle/ResourceBundle/CoreExtension/Document/Select.php @@ -27,7 +27,7 @@ */ class Select extends Editable { - public ResourceInterface|null $resource; + public string|int|null $resource = null; public function __construct( protected string $repositoryName, @@ -46,7 +46,7 @@ public function frontend(): string return ''; } - public function getData(): ?ResourceInterface + public function getData(): int|string|null { return $this->resource; } diff --git a/src/CoreShop/Bundle/ResourceBundle/CoreShopResourceBundle.php b/src/CoreShop/Bundle/ResourceBundle/CoreShopResourceBundle.php index 0d85f23707..fc3456d320 100644 --- a/src/CoreShop/Bundle/ResourceBundle/CoreShopResourceBundle.php +++ b/src/CoreShop/Bundle/ResourceBundle/CoreShopResourceBundle.php @@ -20,7 +20,6 @@ use Composer\InstalledVersions; use CoreShop\Bundle\ResourceBundle\DependencyInjection\Compiler\DoctrineTargetEntitiesResolverPass; -use CoreShop\Bundle\ResourceBundle\DependencyInjection\Compiler\PimcoreCachePass; use CoreShop\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterInstallersPass; use CoreShop\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterPimcoreRepositoriesPass; use CoreShop\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterPimcoreResourcesPass; @@ -62,7 +61,6 @@ public function build(ContainerBuilder $container): void $container->addCompilerPass(new StackRepositoryPass()); $container->addCompilerPass(new RegisterPimcoreRepositoriesPass()); $container->addCompilerPass(new ValidatorAutoMappingFixPass()); - $container->addCompilerPass(new PimcoreCachePass()); } public static function registerDependentBundles(BundleCollection $collection): void diff --git a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Compiler/PimcoreCachePass.php b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Compiler/PimcoreCachePass.php deleted file mode 100644 index bc4de611a2..0000000000 --- a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Compiler/PimcoreCachePass.php +++ /dev/null @@ -1,38 +0,0 @@ -hasDefinition('pimcore.cache.adapter.doctrine_dbal') || $container->hasAlias('pimcore.cache.adapter.doctrine_dbal')) { - $container->findDefinition('pimcore.cache.adapter.doctrine_dbal')->setArgument(4, []); - $container->findDefinition('pimcore.cache.adapter.doctrine_dbal')->setArgument( - 5, - new Reference(CacheResourceMarshaller::class), - ); - } - } -} diff --git a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Configuration.php index e5307693cc..136ece474d 100644 --- a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Configuration.php @@ -61,7 +61,7 @@ private function addResourcesSection(ArrayNodeDefinition $node): void ->children() ->scalarNode('model')->isRequired()->cannotBeEmpty()->end() ->scalarNode('interface')->cannotBeEmpty()->end() - ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() + ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() ->scalarNode('repository')->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(Factory::class)->end() ->end() diff --git a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php index 5ad09c38d1..78d56d7649 100644 --- a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php +++ b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php @@ -65,6 +65,8 @@ public function load(array $configs, ContainerBuilder $container): void $loader->load('services/data_hub.yml'); } + $container->setParameter('coreshop.resources', []); + $this->loadPersistence($configs['drivers'], $configs['resources'], $loader); $this->loadResources($configs['resources'], $container); $this->loadPimcoreModels($configs['pimcore'], $container); @@ -76,7 +78,6 @@ public function load(array $configs, ContainerBuilder $container): void 'priority' => 10, ]); - $container->setParameter('coreshop.resources', []); $container->setDefinition('coreshop.body_listener', $bodyListener); $container diff --git a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Driver/Pimcore/PimcoreDriver.php b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Driver/Pimcore/PimcoreDriver.php index ccd4bba6b0..18d06067a1 100644 --- a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Driver/Pimcore/PimcoreDriver.php +++ b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/Driver/Pimcore/PimcoreDriver.php @@ -18,6 +18,7 @@ namespace CoreShop\Bundle\ResourceBundle\DependencyInjection\Driver\Pimcore; +use CoreShop\Bundle\ResourceBundle\Controller\AdminController; use CoreShop\Bundle\ResourceBundle\Controller\ViewHandlerInterface; use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle; use CoreShop\Bundle\ResourceBundle\DependencyInjection\Driver\AbstractDriver; @@ -26,6 +27,7 @@ use CoreShop\Component\Resource\Factory\PimcoreRepositoryFactory; use CoreShop\Component\Resource\Metadata\MetadataInterface; use Symfony\Component\DependencyInjection\Alias; +use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; @@ -75,7 +77,14 @@ protected function addDefaultPimcoreController(ContainerBuilder $container, Meta protected function addPimcoreController(ContainerBuilder $container, MetadataInterface $metadata, string $classValue, string $suffix = null): void { - $definition = new Definition($classValue); + $parents = array_values(class_parents($classValue)); + + if (in_array(AdminController::class, $parents, true)) { + $definition = new ChildDefinition(AdminController::class); + } else { + $definition = new Definition(); + } + $definition ->setClass($classValue) ->setPublic(true) diff --git a/src/CoreShop/Bundle/ResourceBundle/Doctrine/ORM/EntityMerger.php b/src/CoreShop/Bundle/ResourceBundle/Doctrine/ORM/EntityMerger.php index 25da08f40a..44605eaf94 100644 --- a/src/CoreShop/Bundle/ResourceBundle/Doctrine/ORM/EntityMerger.php +++ b/src/CoreShop/Bundle/ResourceBundle/Doctrine/ORM/EntityMerger.php @@ -60,12 +60,8 @@ private function doMerge($entity, array &$visited): void } $visited[$oid] = $entity; // mark visited - - if ($entity instanceof Proxy && !$entity->__isInitialized()) { - $entity->__load(); - } - $class = $this->em->getClassMetadata($entity::class); + $entity = $this->loadEntity($entity); if ($this->em->getUnitOfWork()->getEntityState($entity, UnitOfWork::STATE_DETACHED) !== UnitOfWork::STATE_MANAGED) { $id = $class->getIdentifierValues($entity); @@ -92,6 +88,8 @@ private function doMerge($entity, array &$visited): void $this->cascadeMerge($entity, $visited); $this->em->getUnitOfWork()->persist($entity); } else { + $managedCopy = $this->loadEntity($managedCopy); + $this->checkAssociations($entity, $managedCopy, $visited); $this->em->getUnitOfWork()->removeFromIdentityMap($managedCopy); $this->em->getUnitOfWork()->registerManaged($entity, $id, $this->getData($managedCopy)); @@ -102,6 +100,24 @@ private function doMerge($entity, array &$visited): void $this->cascadeMerge($entity, $visited); } + protected function loadEntity($entity) + { + $class = $this->em->getClassMetadata($entity::class); + + if ($entity instanceof Proxy && !$entity->__isInitialized()) { + $id = $class->getIdentifierValues($entity); + $uwEntity = $this->em->getUnitOfWork()->tryGetById($id, $class->getName()); + + if ($uwEntity) { + $this->em->getUnitOfWork()->removeFromIdentityMap($uwEntity); + } + + $entity->__load(); + } + + return $entity; + } + /** * @param object $entity * @param object $managedCopy @@ -278,7 +294,62 @@ private function cascadeMerge($entity, array &$visited): void { $class = $this->em->getClassMetadata($entity::class); - foreach ($class->associationMappings as $assoc) { + $associationMappings = array_filter( + $class->associationMappings, + static function ($assoc) { + return $assoc['isCascadeMerge']; + } + ); + $noMergeAssociationMappings = array_filter( + $class->associationMappings, + static function ($assoc) { + return !$assoc['isCascadeMerge']; + } + ); + + /** + * Restore managed entities to their original state + */ + foreach ($noMergeAssociationMappings as $assoc) { + $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); + + if (!$relatedEntities) { + continue; + } + + if ($relatedEntities instanceof Collection) { + //Reset Collection + $pColl = new PersistentCollection($this->em, $assoc['targetEntity'], new ArrayCollection()); + $pColl->setOwner($entity, $assoc); + $pColl->setInitialized(false); + + $class->reflFields[$assoc['fieldName']]->setValue($entity, $pColl); + } else { + //Reset "tmp" entity with managed entity + $relatedEntityClass = $this->em->getClassMetadata($assoc['targetEntity']); + $id = $relatedEntityClass->getIdentifierValues($relatedEntities); + + if (!$id) { + continue; + } + + $uwEntity = $this->em->getUnitOfWork()->tryGetById($id, $relatedEntityClass->getName()); + + //Entity might not be loaded and managed yet, try to load it + if (!$uwEntity) { + $uwEntity = $this->em->find($relatedEntityClass->getName(), $id); + } + + if ($uwEntity) { + $class->reflFields[$assoc['fieldName']]->setValue($entity, $uwEntity); + } + } + } + + /** + * Merge related entities to the new state + */ + foreach ($associationMappings as $assoc) { $relatedEntities = $class->reflFields[$assoc['fieldName']]->getValue($entity); if ($relatedEntities instanceof Collection) { diff --git a/src/CoreShop/Bundle/ResourceBundle/EventListener/DeepCopySubscriber.php b/src/CoreShop/Bundle/ResourceBundle/EventListener/DeepCopySubscriber.php index 2071af18ee..5e3fb9e848 100644 --- a/src/CoreShop/Bundle/ResourceBundle/EventListener/DeepCopySubscriber.php +++ b/src/CoreShop/Bundle/ResourceBundle/EventListener/DeepCopySubscriber.php @@ -18,10 +18,13 @@ namespace CoreShop\Bundle\ResourceBundle\EventListener; +use CoreShop\Bundle\ResourceBundle\Pimcore\CacheMarshallerInterface; use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; use DeepCopy\Matcher\PropertyTypeMatcher; +use DeepCopy\TypeMatcher\TypeMatcher; use Pimcore\Event\SystemEvents; +use Pimcore\Model\DataObject\Concrete; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\GenericEvent; @@ -38,17 +41,65 @@ public function addDoctrineCollectionFilter(GenericEvent $event): void { $context = $event->getArgument('context'); + /** + * @var DeepCopy $copier + */ + $copier = $event->getArgument('copier'); + //Only add if not already been added if (!($context['defaultFilters'] ?? false)) { - /** - * @var DeepCopy $copier - */ - $copier = $event->getArgument('copier'); $copier->addFilter( new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection'), ); $event->setArgument('copier', $copier); } + + if (($context['source'] ?? false) === 'Pimcore\Cache\Core\CoreCacheHandler::storeCacheData') { + /** + * This honestly absolutely sucks: + * + * Pimcore's cache marshalling is quite inconsistent: + * - for marshalling they use DeepCopy + * - for unmarshalling they use default symfony behaviour + * WHY??? + * Why not simply use one for all and make it easier to extend or overwrite + * + * The Idea behind this is: this marshall's (sort of) the information for caching + * (We don't want to serialize all doctrine entities into cache, too slow, too much unnecessary queries) + * + * The CoreShop\Bundle\ResourceBundle\Cache\CoreCacheHandlerDecorator then + * is responsible for unmarshalling the data again + * + * We have to do it in this order since Pimcore first does the DeepCopy and then + * Pimcore CoreCacheHandler Marshalling, meaning for us, we cannot simply do it in one place either + */ + /** @psalm-suppress MissingClosureParamType */ + $copier->addTypeFilter( + new \DeepCopy\TypeFilter\ReplaceFilter( + function ($currentValue) { + if (!$currentValue instanceof Concrete) { + return $currentValue; + } + + $class = $currentValue->getClass(); + + foreach ($class->getFieldDefinitions() as $fd) { + if (!$fd instanceof CacheMarshallerInterface) { + continue; + } + + $currentValue->setObjectVar( + $fd->getName(), + $fd->marshalForCache($currentValue, $currentValue->getObjectVar($fd->getName())), + ); + } + + return $currentValue; + }, + ), + new TypeMatcher(Concrete::class), + ); + } } } diff --git a/src/CoreShop/Bundle/ResourceBundle/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php b/src/CoreShop/Bundle/ResourceBundle/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php deleted file mode 100644 index 89343891c0..0000000000 --- a/src/CoreShop/Bundle/ResourceBundle/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php +++ /dev/null @@ -1,120 +0,0 @@ -serverParams = $serverParams ?: new ServerParams(); - } - - public function handleRequest(FormInterface $form, mixed $request = null) - { - if (!$request instanceof Request) { - throw new UnexpectedTypeException($request, 'Symfony\Component\HttpFoundation\Request'); - } - - $name = $form->getName(); - $method = $request->getMethod(); - - // For request methods that must not have a request body we fetch data - // from the query string. Otherwise we look for data in the request body. - if ('GET' === $method || 'HEAD' === $method || 'TRACE' === $method) { - if ('' === $name) { - $data = $request->query->all(); - } else { - // Don't submit GET requests if the form's name does not exist - // in the request - if (!$request->query->has($name)) { - return; - } - - $data = $request->query->get($name); - } - } else { - // Mark the form with an error if the uploaded size was too large - // This is done here and not in FormValidator because $_POST is - // empty when that error occurs. Hence the form is never submitted. - if ($this->serverParams->hasPostMaxSizeBeenExceeded()) { - // Submit the form, but don't clear the default values - $form->submit(null, false); - - $form->addError(new FormError( - call_user_func($form->getConfig()->getOption('upload_max_size_message')), - null, - ['{{ max }}' => $this->serverParams->getNormalizedIniPostMaxSize()], - )); - - return; - } - - if ('' === $name) { - $params = $request->request->all(); - $files = $request->files->all(); - } elseif ($request->request->has($name) || $request->files->has($name)) { - /** @psalm-var array|null $default */ - $default = $form->getConfig()->getCompound() ? [] : null; - - if ($request->request->has($name)) { - $params = $request->request->all($name); - } else { - $params = $default; - } - - $files = $request->files->get($name, $default); - } else { - // Don't submit the form if it is not present in the request - return; - } - - if (is_array($params) && is_array($files)) { - $data = array_replace_recursive($params, $files); - } else { - $data = $params ?: $files; - } - } - /** @psalm-suppress InvalidScalarArgument */ - $form->submit($data, 'PATCH' !== $method); - } - - public function isFileUpload(mixed $data): bool - { - return $data instanceof File; - } -} diff --git a/src/CoreShop/Bundle/ResourceBundle/Form/Helper/ErrorSerializer.php b/src/CoreShop/Bundle/ResourceBundle/Form/Helper/ErrorSerializer.php index 48a7d13adf..51d62e1b62 100644 --- a/src/CoreShop/Bundle/ResourceBundle/Form/Helper/ErrorSerializer.php +++ b/src/CoreShop/Bundle/ResourceBundle/Form/Helper/ErrorSerializer.php @@ -48,7 +48,7 @@ public function serializeErrorFromHandledForm(FormInterface $handledForm): array if ($e->getOrigin()->getConfig()->getName()) { $errors[] = sprintf('%s: %s', $e->getOrigin()->getConfig()->getName(), $errorMessageTemplate); } else { - $errors[] = sprintf($errorMessageTemplate); + $errors[] = $errorMessageTemplate; } } } diff --git a/src/CoreShop/Bundle/ResourceBundle/Installer/PimcoreDocumentsInstaller.php b/src/CoreShop/Bundle/ResourceBundle/Installer/PimcoreDocumentsInstaller.php index ce5f675cf1..7ea35a97e5 100644 --- a/src/CoreShop/Bundle/ResourceBundle/Installer/PimcoreDocumentsInstaller.php +++ b/src/CoreShop/Bundle/ResourceBundle/Installer/PimcoreDocumentsInstaller.php @@ -108,7 +108,7 @@ public function installResources(OutputInterface $output, string $applicationNam if (!$languageDocument instanceof Document) { $languageDocument = new Document\Page(); $languageDocument->setParent($rootDocument); - $languageDocument->setProperty('language', 'text', $language); + $languageDocument->setProperty('language', 'text', $language, false, true); $languageDocument->setKey(Service::getValidKey($language, 'document')); $languageDocument->save(); } @@ -163,7 +163,6 @@ private function installDocument(Document $rootDocument, string $language, array ); $document->setKey(Service::getValidKey($properties['key'], 'document')); - $document->setProperty('language', $language, 'text', true); if ($document instanceof Document\PageSnippet) { if ($document instanceof Document\Page && isset($properties['title'])) { diff --git a/src/CoreShop/Bundle/ResourceBundle/Pimcore/CacheResourceMarshaller.php b/src/CoreShop/Bundle/ResourceBundle/Pimcore/CacheResourceMarshaller.php deleted file mode 100644 index 67afc87707..0000000000 --- a/src/CoreShop/Bundle/ResourceBundle/Pimcore/CacheResourceMarshaller.php +++ /dev/null @@ -1,78 +0,0 @@ -defaultMarshaller = $defaultMarshaller ?? new DefaultMarshaller(); - } - - public function marshall(array $values, ?array &$failed): array - { - foreach ($values as $data) { - if ($data instanceof Concrete) { - $class = $data->getClass(); - - foreach ($class->getFieldDefinitions() as $fd) { - if (!$fd instanceof CacheMarshallerInterface) { - continue; - } - - $data->setObjectVar( - $fd->getName(), - $fd->marshalForCache($data, $data->getObjectVar($fd->getName())), - ); - } - } - } - - return $this->defaultMarshaller->marshall($values, $failed); - } - - public function unmarshall(string $value): mixed - { - $data = $this->defaultMarshaller->unmarshall($value); - - if ($data instanceof Concrete) { - $class = $data->getClass(); - - foreach ($class->getFieldDefinitions() as $fd) { - if (!$fd instanceof CacheMarshallerInterface) { - continue; - } - - $data->setObjectVar( - $fd->getName(), - $fd->unmarshalForCache($data, $data->getObjectVar($fd->getName())), - ); - } - } - - return $data; - } -} diff --git a/src/CoreShop/Bundle/ResourceBundle/README.md b/src/CoreShop/Bundle/ResourceBundle/README.md index 6d9d273106..9847b4a366 100644 --- a/src/CoreShop/Bundle/ResourceBundle/README.md +++ b/src/CoreShop/Bundle/ResourceBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ResourceBundle/Resources/config/services.yml b/src/CoreShop/Bundle/ResourceBundle/Resources/config/services.yml index 9a55dc58bc..ad3bf7696c 100755 --- a/src/CoreShop/Bundle/ResourceBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/ResourceBundle/Resources/config/services.yml @@ -56,13 +56,10 @@ services: tags: - { name: jms_serializer.handler, type: carbon, direction: serialization, format: json, method: serializeRelation } - CoreShop\Bundle\ResourceBundle\Form\Extension\HttpFoundation\HttpFoundationRequestHandler: - decorates: form.type_extension.form.request_handler - decoration_priority: 256 - public: false - CoreShop\Bundle\ResourceBundle\Controller\AdminController: abstract: true + calls: + - [ 'setTokenResolver', [ '@Pimcore\Security\User\TokenStorageUserResolver' ] ] arguments: - '@service_container' - '@CoreShop\Bundle\ResourceBundle\Controller\ViewHandlerInterface' @@ -100,12 +97,6 @@ services: - '@CoreShop\Component\Resource\Metadata\RegistryInterface' - '@CoreShop\Component\Pimcore\DataObject\ObjectServiceInterface' - CoreShop\Bundle\ResourceBundle\Pimcore\CacheResourceMarshaller: - decorates: 'cache.default_marshaller' - decoration_priority: 100 - arguments: - - '@CoreShop\Bundle\ResourceBundle\Pimcore\CacheResourceMarshaller.inner' - CoreShop\Bundle\ResourceBundle\Slug\ResourceConfigurationSlugGenerator: decorates: 'CoreShop\Component\Pimcore\Slug\DataObjectSlugGeneratorInterface' arguments: @@ -116,4 +107,13 @@ services: decorates: 'CoreShop\Component\Pimcore\Slug\SluggableLinkGenerator' arguments: - '@CoreShop\Component\Resource\Pimcore\ResourceSlugLinkGenerator.inner' - - '@CoreShop\Component\Resource\Metadata\RegistryInterface' \ No newline at end of file + - '@CoreShop\Component\Resource\Metadata\RegistryInterface' + + CoreShop\Bundle\ResourceBundle\Cache\CoreCacheHandlerDecorator: + decorates: 'Pimcore\Cache\Core\CoreCacheHandler' + arguments: + - '@pimcore.cache.pool' + - '@Pimcore\Cache\Core\WriteLock' + - '@event_dispatcher' + calls: + - [ setLogger, [ '@logger' ] ] diff --git a/src/CoreShop/Bundle/RuleBundle/README.md b/src/CoreShop/Bundle/RuleBundle/README.md index 220551301e..6eca990fce 100644 --- a/src/CoreShop/Bundle/RuleBundle/README.md +++ b/src/CoreShop/Bundle/RuleBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/SEOBundle/README.md b/src/CoreShop/Bundle/SEOBundle/README.md index d19c988b5e..b4f8d01adc 100644 --- a/src/CoreShop/Bundle/SEOBundle/README.md +++ b/src/CoreShop/Bundle/SEOBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/SequenceBundle/README.md b/src/CoreShop/Bundle/SequenceBundle/README.md index f8f0bea6e0..85627eeb47 100644 --- a/src/CoreShop/Bundle/SequenceBundle/README.md +++ b/src/CoreShop/Bundle/SequenceBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ShippingBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/ShippingBundle/DependencyInjection/Configuration.php index 41d44f9502..4db41a4031 100644 --- a/src/CoreShop/Bundle/ShippingBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/ShippingBundle/DependencyInjection/Configuration.php @@ -71,6 +71,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('carrier')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() @@ -86,6 +92,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() diff --git a/src/CoreShop/Bundle/ShippingBundle/README.md b/src/CoreShop/Bundle/ShippingBundle/README.md index 87dbb42f77..07afe33506 100644 --- a/src/CoreShop/Bundle/ShippingBundle/README.md +++ b/src/CoreShop/Bundle/ShippingBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/Configuration.php index a4fe2ea8f4..7ef6d7138f 100644 --- a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/Configuration.php @@ -53,12 +53,14 @@ private function addStorageListSection(ArrayNodeDefinition $node): void ->useAttributeAsKey('name') ->arrayPrototype() ->children() + ->booleanNode('disable_caching')->defaultFalse()->end() ->arrayNode('context') ->addDefaultsIfNotSet() ->children() ->scalarNode('interface')->defaultValue(StorageListContextInterface::class)->end() ->scalarNode('composite')->defaultValue(CompositeStorageListContext::class)->end() ->scalarNode('tag')->cannotBeEmpty()->end() + ->booleanNode('restore_customer_list_only_on_login')->defaultFalse()->end() ->end() ->end() ->arrayNode('services') diff --git a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php index a5238e22c4..70e2e953e6 100644 --- a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php +++ b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php @@ -39,6 +39,7 @@ use CoreShop\Component\Store\Context\StoreContextInterface; use CoreShop\Component\Store\Model\StoreAwareInterface; use Pimcore\Http\Request\Resolver\PimcoreContextResolver; +use Pimcore\Http\RequestHelper; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -112,13 +113,15 @@ public function load(array $configs, ContainerBuilder $container): void $container->setDefinition('coreshop.storage_list.session_subscriber.' . $name, $sessionSubscriber); } - $cacheSubscriber = new Definition(CacheListener::class, [ - new Reference(PimcoreContextResolver::class), - new Reference($contextCompositeServiceName), - ]); - $cacheSubscriber->addTag('kernel.event_subscriber'); + if ($list['disable_caching']) { + $cacheSubscriber = new Definition(CacheListener::class, [ + new Reference($list['resource']['repository']), + new Reference($list['resource']['item_repository']), + ]); - $container->setDefinition('coreshop.storage_list.cache_subscriber.' . $name, $cacheSubscriber); + $cacheSubscriber->addTag('kernel.event_subscriber'); + $container->setDefinition('coreshop.storage_list.cache_subscriber.' . $name, $cacheSubscriber); + } if ($list['controller']['enabled']) { $class = $list['controller']['class']; @@ -171,13 +174,15 @@ public function load(array $configs, ContainerBuilder $container): void $customerAndStoreBasedContextDefinition->setArgument('$customerContext', new Reference(CustomerContextInterface::class)); $customerAndStoreBasedContextDefinition->setArgument('$storeContext', new Reference(StoreContextInterface::class)); $customerAndStoreBasedContextDefinition->setArgument('$repository', new Reference($list['resource']['repository'])); + $customerAndStoreBasedContextDefinition->setArgument('$requestHelper', new Reference(RequestHelper::class)); + $customerAndStoreBasedContextDefinition->setArgument('$restoreCustomerStorageListOnlyOnLogin', $list['context']['restore_customer_list_only_on_login']); $customerAndStoreBasedContextDefinition->addTag($list['context']['tag'], ['priority' => -777]); $container->setDefinition('coreshop.storage_list.context.customer_and_store_based.' . $name, $customerAndStoreBasedContextDefinition); if ($list['services']['enable_default_store_based_decorator']) { $storeBasedContextDefinition = new Definition(StoreBasedStorageListContext::class); - $storeBasedContextDefinition->setDecoratedService($contextCompositeServiceName); + $storeBasedContextDefinition->setDecoratedService('coreshop.storage_list.context.factory.' . $name); $storeBasedContextDefinition->setArgument( '$context', new Reference('coreshop.storage_list.context.store_based.' . $name . '.inner'), diff --git a/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php b/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php index 60c150bf37..82fdd38b60 100644 --- a/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php +++ b/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php @@ -18,20 +18,17 @@ namespace CoreShop\Bundle\StorageListBundle\EventListener; -use CoreShop\Component\StorageList\Context\StorageListContextInterface; -use CoreShop\Component\StorageList\Context\StorageListNotFoundException; +use CoreShop\Component\Resource\Repository\PimcoreRepositoryInterface; use Pimcore\Cache; -use Pimcore\Http\Request\Resolver\PimcoreContextResolver; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; final class CacheListener implements EventSubscriberInterface { public function __construct( - private PimcoreContextResolver $pimcoreContext, - private StorageListContextInterface $context, + private PimcoreRepositoryInterface $storageListRepository, + private PimcoreRepositoryInterface $storageListItemRepository, ) { } @@ -44,41 +41,7 @@ public static function getSubscribedEvents(): array public function onKernelResponse(ResponseEvent $event): void { - if ($this->pimcoreContext->matchesPimcoreContext($event->getRequest(), PimcoreContextResolver::CONTEXT_ADMIN)) { - return; - } - - if (!$event->isMainRequest()) { - return; - } - - if ($event->getRequest()->attributes->get('_route') === '_wdt') { - return; - } - - /** @var Request $request */ - $request = $event->getRequest(); - - if (!$request->hasSession()) { - return; - } - - try { - $list = $this->context->getStorageList(); - } catch (StorageListNotFoundException) { - return; - } - - if ($list->getId()) { - foreach ($list->getItems() as $item) { - if (!$item->getId()) { - continue; - } - - Cache::addIgnoredTagOnSave('object_' . $item->getId()); - } - - Cache::addIgnoredTagOnSave('object_' . $list->getId()); - } + Cache::addIgnoredTagOnSave(sprintf('class_%s', $this->storageListRepository->getClassId())); + Cache::addIgnoredTagOnSave(sprintf('class_%s', $this->storageListItemRepository->getClassId())); } } diff --git a/src/CoreShop/Bundle/StorageListBundle/README.md b/src/CoreShop/Bundle/StorageListBundle/README.md index bb9d6771e9..04ddfae696 100644 --- a/src/CoreShop/Bundle/StorageListBundle/README.md +++ b/src/CoreShop/Bundle/StorageListBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/StorageListBundle/Resources/config/services.yml b/src/CoreShop/Bundle/StorageListBundle/Resources/config/services.yml index e9a7eec9e7..014bdf4da8 100644 --- a/src/CoreShop/Bundle/StorageListBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/StorageListBundle/Resources/config/services.yml @@ -10,7 +10,6 @@ services: CoreShop\Component\StorageList\Manager\StorageListPimcoreModelManager: arguments: - '@CoreShop\Component\Resource\Service\FolderCreationServiceInterface' - - '@doctrine.dbal.default_connection' CoreShop\Component\StorageList\StorageListItemResolverInterface: '@CoreShop\Component\StorageList\StorageListItemResolver' CoreShop\Component\StorageList\StorageListItemResolver: ~ diff --git a/src/CoreShop/Bundle/StoreBundle/Collector/StoreCollector.php b/src/CoreShop/Bundle/StoreBundle/Collector/StoreCollector.php index 2775e04b56..10fca9cde2 100644 --- a/src/CoreShop/Bundle/StoreBundle/Collector/StoreCollector.php +++ b/src/CoreShop/Bundle/StoreBundle/Collector/StoreCollector.php @@ -29,15 +29,13 @@ final class StoreCollector extends DataCollector { public function __construct( - StoreRepositoryInterface $storeRepository, + private StoreRepositoryInterface $storeRepository, private StoreContextInterface $storeContext, private PimcoreContextResolver $pimcoreContext, - $storeChangeSupport = false, + private $storeChangeSupport = false, ) { $this->data = [ 'store' => null, - 'stores' => $storeRepository->findAll(), - 'store_change_support' => $storeChangeSupport, ]; } @@ -68,7 +66,11 @@ public function collect(Request $request, Response $response, \Throwable $except } try { - $this->data['store'] = $this->storeContext->getStore(); + $this->data = [ + 'store' => $this->storeContext->getStore(), + 'stores' => $this->storeRepository->findAll(), + 'store_change_support' => $this->storeChangeSupport, + ]; } catch (\Exception) { //If some goes wrong, we just ignore it } diff --git a/src/CoreShop/Bundle/StoreBundle/DependencyInjection/Configuration.php b/src/CoreShop/Bundle/StoreBundle/DependencyInjection/Configuration.php index 8a788bbf04..8f279eb4fe 100644 --- a/src/CoreShop/Bundle/StoreBundle/DependencyInjection/Configuration.php +++ b/src/CoreShop/Bundle/StoreBundle/DependencyInjection/Configuration.php @@ -54,6 +54,12 @@ private function addModelsSection(ArrayNodeDefinition $node): void ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('store')->cannotBeOverwritten()->end() + ->arrayNode('graphql') + ->addDefaultsIfNotSet() + ->children() + ->booleanNode('enabled')->defaultTrue()->end() + ->end() + ->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() diff --git a/src/CoreShop/Bundle/StoreBundle/README.md b/src/CoreShop/Bundle/StoreBundle/README.md index 238a8370e0..55cf54f6ac 100644 --- a/src/CoreShop/Bundle/StoreBundle/README.md +++ b/src/CoreShop/Bundle/StoreBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/TaxationBundle/README.md b/src/CoreShop/Bundle/TaxationBundle/README.md index bd53ab1209..a2965f3d2a 100644 --- a/src/CoreShop/Bundle/TaxationBundle/README.md +++ b/src/CoreShop/Bundle/TaxationBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/TestBundle/README.md b/src/CoreShop/Bundle/TestBundle/README.md index ee29feabff..070f7e9437 100644 --- a/src/CoreShop/Bundle/TestBundle/README.md +++ b/src/CoreShop/Bundle/TestBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ThemeBundle/README.md b/src/CoreShop/Bundle/ThemeBundle/README.md index 5221e84fd9..4ab7ac1dff 100644 --- a/src/CoreShop/Bundle/ThemeBundle/README.md +++ b/src/CoreShop/Bundle/ThemeBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/TrackingBundle/README.md b/src/CoreShop/Bundle/TrackingBundle/README.md index 7b12b0a58d..dab79a5928 100644 --- a/src/CoreShop/Bundle/TrackingBundle/README.md +++ b/src/CoreShop/Bundle/TrackingBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/UserBundle/README.md b/src/CoreShop/Bundle/UserBundle/README.md index c069392757..6654580346 100644 --- a/src/CoreShop/Bundle/UserBundle/README.md +++ b/src/CoreShop/Bundle/UserBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://www.coreshop.org/docs/2.1.0/Bundles/User_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/VariantBundle/README.md b/src/CoreShop/Bundle/VariantBundle/README.md index 8cdfd45379..5ad6be7bd1 100644 --- a/src/CoreShop/Bundle/VariantBundle/README.md +++ b/src/CoreShop/Bundle/VariantBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php b/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php index ac92fdb974..9772c50015 100644 --- a/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php +++ b/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php @@ -33,7 +33,7 @@ public function findExpiredStorageLists(int $days, array $params = []): array $queryParams = [$daysTimestamp->getTimestamp()]; $list = $this->getList(); - $list->setCondition('o_modificationDate < ?', $queryParams); + $list->setCondition('modificationDate < ?', $queryParams); /** * @var StorageListInterface[] $result diff --git a/src/CoreShop/Bundle/WishlistBundle/README.md b/src/CoreShop/Bundle/WishlistBundle/README.md index 2841d19fa5..e18103e308 100644 --- a/src/CoreShop/Bundle/WishlistBundle/README.md +++ b/src/CoreShop/Bundle/WishlistBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/WorkflowBundle/History/StateHistoryLogger.php b/src/CoreShop/Bundle/WorkflowBundle/History/StateHistoryLogger.php index bcd124e6da..6d778fc5b1 100644 --- a/src/CoreShop/Bundle/WorkflowBundle/History/StateHistoryLogger.php +++ b/src/CoreShop/Bundle/WorkflowBundle/History/StateHistoryLogger.php @@ -62,7 +62,11 @@ public function log(Concrete $object, Event $event): void $note->addData('workflow', 'text', $event->getWorkflowName()); $note->addData('transition', 'text', $transition->getName()); - $this->noteService->storeNote($note); + try { + $this->noteService->storeNote($note); + } catch (\Exception) { + //We simply ignore this, if the note cannot be saved, we don't want to break the workflow + } } private function getFrom(array $froms) diff --git a/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManager.php b/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManager.php index fc0801b4bf..1e2a8df24b 100644 --- a/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManager.php +++ b/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManager.php @@ -20,7 +20,7 @@ use Symfony\Component\Workflow\Registry; use Symfony\Component\Workflow\Transition; -use Symfony\Component\Workflow\Workflow; +use Symfony\Component\Workflow\WorkflowInterface; final class StateMachineManager implements StateMachineManagerInterface { @@ -29,12 +29,12 @@ public function __construct( ) { } - public function get(object $subject, string $workflowName = null): Workflow + public function get(object $subject, string $workflowName = null): WorkflowInterface { return $this->registry->get($subject, $workflowName); } - public function getTransitionFromState(Workflow $workflow, object $subject, string $fromState): ?string + public function getTransitionFromState(WorkflowInterface $workflow, object $subject, string $fromState): ?string { /** @var Transition $transition */ foreach ($workflow->getEnabledTransitions($subject) as $transition) { @@ -46,7 +46,7 @@ public function getTransitionFromState(Workflow $workflow, object $subject, stri return null; } - public function getTransitionToState(Workflow $workflow, object $subject, string $toState): ?string + public function getTransitionToState(WorkflowInterface $workflow, object $subject, string $toState): ?string { /** @var Transition $transition */ foreach ($workflow->getEnabledTransitions($subject) as $transition) { diff --git a/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManagerInterface.php b/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManagerInterface.php index 08b6a0a457..d4571a2bc7 100644 --- a/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManagerInterface.php +++ b/src/CoreShop/Bundle/WorkflowBundle/Manager/StateMachineManagerInterface.php @@ -18,13 +18,13 @@ namespace CoreShop\Bundle\WorkflowBundle\Manager; -use Symfony\Component\Workflow\Workflow; +use Symfony\Component\Workflow\WorkflowInterface; interface StateMachineManagerInterface { - public function get(object $subject, string $workflowName = null): Workflow; + public function get(object $subject, string $workflowName = null): WorkflowInterface; - public function getTransitionFromState(Workflow $workflow, object $subject, string $fromState): ?string; + public function getTransitionFromState(WorkflowInterface $workflow, object $subject, string $fromState): ?string; - public function getTransitionToState(Workflow $workflow, object $subject, string $toState): ?string; + public function getTransitionToState(WorkflowInterface $workflow, object $subject, string $toState): ?string; } diff --git a/src/CoreShop/Bundle/WorkflowBundle/README.md b/src/CoreShop/Bundle/WorkflowBundle/README.md index 0e7058ec71..b7e3a360fc 100644 --- a/src/CoreShop/Bundle/WorkflowBundle/README.md +++ b/src/CoreShop/Bundle/WorkflowBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/WorkflowBundle/Resources/config/services.yml b/src/CoreShop/Bundle/WorkflowBundle/Resources/config/services.yml index 2cbaf4dc87..77add43703 100644 --- a/src/CoreShop/Bundle/WorkflowBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/WorkflowBundle/Resources/config/services.yml @@ -8,7 +8,7 @@ services: CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManagerInterface: '@CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManager' CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManager: arguments: - - '@.workflow.registry' + - '@workflow.registry' CoreShop\Bundle\WorkflowBundle\Applier\StateMachineApplierInterface: '@CoreShop\Bundle\WorkflowBundle\Applier\StateMachineApplier' CoreShop\Bundle\WorkflowBundle\Applier\StateMachineApplier: diff --git a/src/CoreShop/Component/Address/README.md b/src/CoreShop/Component/Address/README.md index e6c48385e0..89450a7d5d 100644 --- a/src/CoreShop/Component/Address/README.md +++ b/src/CoreShop/Component/Address/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Configuration/README.md b/src/CoreShop/Component/Configuration/README.md index 31f0bc684b..e954b75939 100644 --- a/src/CoreShop/Component/Configuration/README.md +++ b/src/CoreShop/Component/Configuration/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Core/Cart/Rule/Action/GiftProductActionProcessor.php b/src/CoreShop/Component/Core/Cart/Rule/Action/GiftProductActionProcessor.php index 788d361917..ce2f9cb06a 100644 --- a/src/CoreShop/Component/Core/Cart/Rule/Action/GiftProductActionProcessor.php +++ b/src/CoreShop/Component/Core/Cart/Rule/Action/GiftProductActionProcessor.php @@ -19,6 +19,7 @@ namespace CoreShop\Component\Core\Cart\Rule\Action; use CoreShop\Bundle\ResourceBundle\Pimcore\Repository\StackRepositoryInterface; +use CoreShop\Component\Core\Model\ProductInterface; use CoreShop\Component\Order\Cart\Rule\Action\CartPriceRuleActionProcessorInterface; use CoreShop\Component\Order\Factory\AdjustmentFactoryInterface; use CoreShop\Component\Order\Factory\OrderItemFactoryInterface; @@ -27,6 +28,7 @@ use CoreShop\Component\Order\Model\OrderItemInterface; use CoreShop\Component\Order\Model\PriceRuleItemInterface; use CoreShop\Component\Order\Model\PurchasableInterface; +use CoreShop\Component\Product\Model\ProductUnitDefinitionInterface; use CoreShop\Component\Rule\Model\ActionInterface; final class GiftProductActionProcessor implements CartPriceRuleActionProcessorInterface @@ -66,10 +68,23 @@ public function applyRule(OrderInterface $cart, array $configuration, PriceRuleI $this->removeCartItem($cart, $cartItem); } + /** + * @var \CoreShop\Component\Core\Model\OrderItemInterface $item + */ $item = $this->cartItemFactory->createWithCart($cart, $product); $item->setQuantity(1); $item->setIsGiftItem(true); + if ( + $product instanceof ProductInterface && + $product->hasUnitDefinitions() && + $product->getUnitDefinitions()?->getDefaultUnitDefinition() instanceof ProductUnitDefinitionInterface + ) { + $item->setUnitDefinition($product->getUnitDefinitions()?->getDefaultUnitDefinition()); + } + + $item->setDefaultUnitQuantity(1); + $adjustment = $this->adjustmentFactory->createWithData( $key, $cartPriceRuleItem->getCartPriceRule()->getName(), diff --git a/src/CoreShop/Component/Core/Cart/Rule/Applier/CartRuleApplier.php b/src/CoreShop/Component/Core/Cart/Rule/Applier/CartRuleApplier.php index 8704aabb2a..c432e497d0 100644 --- a/src/CoreShop/Component/Core/Cart/Rule/Applier/CartRuleApplier.php +++ b/src/CoreShop/Component/Core/Cart/Rule/Applier/CartRuleApplier.php @@ -58,6 +58,20 @@ protected function apply(OrderInterface $cart, PriceRuleItemInterface $cartPrice $totalAmount = []; $totalDiscountPossible = 0; + $discountableItems = []; + + foreach ($cart->getItems() as $item) { + if ($item->getTotal() <= 0) { + continue; + } + + $discountableItems[] = $item; + } + + if (count($discountableItems) === 0) { + return; + } + foreach ($cart->getItems() as $item) { $totalAmount[] = $item->getTotal(false); $totalDiscountPossible += $item->getTotal($withTax); @@ -186,11 +200,20 @@ protected function apply(OrderInterface $cart, PriceRuleItemInterface $cartPrice } } + /* + * https://github.com/coreshop/CoreShop/issues/2572 + * + * Since we are applying the discount to the cart, + * we add the adjustment to the cart-item as neutral. + * + * we need this adjustment so we know how much to refund or credit. + */ $item->addAdjustment($this->adjustmentFactory->createWithData( AdjustmentInterface::CART_PRICE_RULE, $cartPriceRuleItem->getCartPriceRule()->getName(), $positive ? $amountGross : (-1 * $amountGross), $positive ? $amountNet : (-1 * $amountNet), + true, )); } diff --git a/src/CoreShop/Component/Core/Cart/Rule/Condition/GuestConditionChecker.php b/src/CoreShop/Component/Core/Cart/Rule/Condition/GuestConditionChecker.php new file mode 100644 index 0000000000..088368ac15 --- /dev/null +++ b/src/CoreShop/Component/Core/Cart/Rule/Condition/GuestConditionChecker.php @@ -0,0 +1,39 @@ +getCustomer(); + + if (!$customer instanceof CustomerInterface) { + return true; + } + + return null === $customer->getUser(); + } +} diff --git a/src/CoreShop/Component/Core/Cart/Rule/Condition/ProductsConditionChecker.php b/src/CoreShop/Component/Core/Cart/Rule/Condition/ProductsConditionChecker.php index d1404a2d5f..fe6ff18d8d 100644 --- a/src/CoreShop/Component/Core/Cart/Rule/Condition/ProductsConditionChecker.php +++ b/src/CoreShop/Component/Core/Cart/Rule/Condition/ProductsConditionChecker.php @@ -40,7 +40,12 @@ public function __construct( public function isCartRuleValid(OrderInterface $cart, CartPriceRuleInterface $cartPriceRule, ?CartPriceRuleVoucherCodeInterface $voucher, array $configuration): bool { - $productIdsToCheck = $this->getProductsToCheck($configuration['products'], $cart->getStore(), $configuration['include_variants'] ?: false); + $productIdsToCheck = $this->getProductsToCheck( + $configuration['products'], + $cart->getStore(), + $configuration['include_variants'] ?: false, + [sprintf('cs_rule_%s', $cartPriceRule->getId())], + ); foreach ($cart->getItems() as $item) { if ($item->getIsGiftItem()) { diff --git a/src/CoreShop/Component/Core/CartItem/Rule/Action/DiscountPercentActionProcessor.php b/src/CoreShop/Component/Core/CartItem/Rule/Action/DiscountPercentActionProcessor.php index 993e233539..8aa7a85a2e 100644 --- a/src/CoreShop/Component/Core/CartItem/Rule/Action/DiscountPercentActionProcessor.php +++ b/src/CoreShop/Component/Core/CartItem/Rule/Action/DiscountPercentActionProcessor.php @@ -41,7 +41,7 @@ public function applyRule( */ $store = $orderItem->getOrder()->getStore(); - $discount = $this->getDiscount($orderItem, $configuration); + $discount = $this->getDiscount($orderItem, $configuration, $store->getUseGrossPrice()); if ($discount <= 0) { return false; diff --git a/src/CoreShop/Component/Core/CartItem/Rule/Applier/CartItemRuleApplier.php b/src/CoreShop/Component/Core/CartItem/Rule/Applier/CartItemRuleApplier.php index 8e3cb7d153..b8015835f2 100644 --- a/src/CoreShop/Component/Core/CartItem/Rule/Applier/CartItemRuleApplier.php +++ b/src/CoreShop/Component/Core/CartItem/Rule/Applier/CartItemRuleApplier.php @@ -72,12 +72,19 @@ protected function apply( $discount = min($discount, $totalDiscountPossible); + /* + * Cart Item Rules are always applied to the cart-item, but as neutral adjustments + * So to know how much our "virtual" total is, we need to get these cart-price rules values + * otherwise, we might end up with a negative total + */ if ($withTax) { - $discount = min($discount, $orderItem->getTotal()); + $total = $orderItem->getTotal() + $orderItem->getNeutralAdjustmentsTotal(AdjustmentInterface::CART_PRICE_RULE); } else { - $discount = min($discount, $orderItem->getTotal(false)); + $total = $orderItem->getTotal(false) + $orderItem->getNeutralAdjustmentsTotal(AdjustmentInterface::CART_PRICE_RULE, false); } + $discount = min($discount, $total); + if (0 === $discount) { return; } diff --git a/src/CoreShop/Component/Core/CartItem/Rule/Condition/ProductsConditionChecker.php b/src/CoreShop/Component/Core/CartItem/Rule/Condition/ProductsConditionChecker.php index 85343ab687..50f3e33dce 100644 --- a/src/CoreShop/Component/Core/CartItem/Rule/Condition/ProductsConditionChecker.php +++ b/src/CoreShop/Component/Core/CartItem/Rule/Condition/ProductsConditionChecker.php @@ -48,6 +48,7 @@ public function isValidForOrderItem( $configuration['products'], $orderItem->getOrder()->getStore(), $configuration['include_variants'] ?: false, + [sprintf('cs_rule_variant_%s', $cartPriceRule->getId())], ); if ($orderItem->getIsGiftItem()) { diff --git a/src/CoreShop/Component/Core/Index/Extensions/ProductClassExtension.php b/src/CoreShop/Component/Core/Index/Extensions/ProductClassExtension.php index 6b6e374ce0..be5ba0405f 100644 --- a/src/CoreShop/Component/Core/Index/Extensions/ProductClassExtension.php +++ b/src/CoreShop/Component/Core/Index/Extensions/ProductClassExtension.php @@ -72,10 +72,15 @@ public function getIndexColumns(IndexableInterface $indexable): array } } + /** + * @psalm-suppress InvalidArgument + */ + $stores = @implode(',', $indexable->getStores() ?? []); + return [ 'categoryIds' => ',' . implode(',', $categoryIds) . ',', 'parentCategoryIds' => ',' . implode(',', $parentCategoryIds) . ',', - 'stores' => ',' . @implode(',', $indexable->getStores()) . ',', + 'stores' => ',' . $stores . ',', ]; } diff --git a/src/CoreShop/Component/Core/Notification/Rule/Condition/Order/BackendUpdateChecker.php b/src/CoreShop/Component/Core/Notification/Rule/Condition/Order/BackendUpdateChecker.php new file mode 100644 index 0000000000..cfdc557fcf --- /dev/null +++ b/src/CoreShop/Component/Core/Notification/Rule/Condition/Order/BackendUpdateChecker.php @@ -0,0 +1,36 @@ +getQuantity(); - if (0 >= $targetQuantity || $currentQuantity === $targetQuantity) { + if ((!$this->allowZeroQuantity && 0 >= $targetQuantity) || $currentQuantity === $targetQuantity) { return; } @@ -44,9 +49,9 @@ public function modify(StorageListItemInterface $item, float $targetQuantity): v $item->setQuantity($cleanTargetQuantity); if ($item->hasUnitDefinition()) { - $item->setDefaultUnitQuantity($item->getUnitDefinition()->getConversionRate() * $item->getQuantity()); + $item->setDefaultUnitQuantity(($item->getUnitDefinition()?->getConversionRate() ?? 1.0) * $item->getQuantity()); } else { - $item->setDefaultUnitQuantity($item->getQuantity()); + $item->setDefaultUnitQuantity($item->getQuantity() ?? 1.0); } } diff --git a/src/CoreShop/Component/Core/Order/Processor/CartAdjustmentClearer.php b/src/CoreShop/Component/Core/Order/Processor/CartAdjustmentClearer.php index e280965fc5..e58af820fd 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartAdjustmentClearer.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartAdjustmentClearer.php @@ -26,6 +26,10 @@ final class CartAdjustmentClearer implements CartProcessorInterface { public function process(OrderInterface $cart): void { + if ($cart->isImmutable()) { + return; + } + $cart->removeAdjustmentsRecursively(AdjustmentInterface::CART_PRICE_RULE); $cart->removeAdjustmentsRecursively(AdjustmentInterface::SHIPPING); $cart->removeAdjustmentsRecursively(AdjustmentInterface::PAYMENT); diff --git a/src/CoreShop/Component/Core/Order/Processor/CartCurrencyConversionProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartCurrencyConversionProcessor.php index 8bf6b55742..b7c0058b1f 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartCurrencyConversionProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartCurrencyConversionProcessor.php @@ -53,12 +53,14 @@ public function process(OrderInterface $cart): void $itemRetailPrice = $item->getItemRetailPrice($withTax); $itemDiscountPrice = $item->getItemDiscountPrice($withTax); $itemDiscount = $item->getItemDiscount($withTax); - $itemPrice = $item->getTotal($withTax); - $total = $item->getItemPrice($withTax); + $total = $item->getTotal($withTax); + $itemPrice = $item->getItemPrice($withTax); + $subtotal = $item->getSubtotal($withTax); $item->setConvertedItemRetailPrice($this->convert($itemRetailPrice, $cart), $withTax); - $item->setConvertedTotal($this->convert($itemPrice, $cart), $withTax); - $item->setConvertedItemPrice($this->convert($total, $cart), $withTax); + $item->setConvertedTotal($this->convert($total, $cart), $withTax); + $item->setConvertedSubtotal($this->convert($subtotal, $cart), $withTax); + $item->setConvertedItemPrice($this->convert($itemPrice, $cart), $withTax); $item->setConvertedItemDiscount($this->convert($itemDiscount, $cart), $withTax); $item->setConvertedItemDiscountPrice($this->convert($itemDiscountPrice, $cart), $withTax); } diff --git a/src/CoreShop/Component/Core/Order/Processor/CartItemsImmutableProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartItemsImmutableProcessor.php new file mode 100644 index 0000000000..8a9a7a3004 --- /dev/null +++ b/src/CoreShop/Component/Core/Order/Processor/CartItemsImmutableProcessor.php @@ -0,0 +1,80 @@ +isImmutable()) { + return; + } + + $context = $this->cartContextResolver->resolveCartContext($cart); + + /** + * @var StoreInterface $store + */ + $store = $context['store']; + + /** + * @var OrderItemInterface $item + */ + foreach ($cart->getItems() as $item) { + if (!$item->isImmutable()) { + continue; + } + + $itemPrice = $item->getItemPrice($store->getUseGrossPrice()); + $itemRetailPrice = $item->getItemRetailPrice($store->getUseGrossPrice()); + $itemDiscountPrice = $item->getItemDiscountPrice($store->getUseGrossPrice()); + $itemDiscount = $item->getItemDiscount($store->getUseGrossPrice()); + + $this->cartItemProcessor->processCartItem( + $item, + $itemPrice, + $itemRetailPrice, + $itemDiscountPrice, + $itemDiscount, + $context, + ); + + /* + * https://github.com/coreshop/CoreShop/issues/2572 + * + * Since we are recalculating the items-total, we also need to respect the adjustments and + * re-add them to the item total as well. + */ + $item->recalculateAdjustmentsTotal(); + } + } +} diff --git a/src/CoreShop/Component/Core/Order/Processor/CartItemsProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartItemsProcessor.php index 92f505531a..1301fcb53b 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartItemsProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartItemsProcessor.php @@ -48,6 +48,10 @@ public function process(OrderInterface $cart): void * @var OrderItemInterface $item */ foreach ($cart->getItems() as $item) { + if ($item->isImmutable()) { + continue; + } + if ($item->getIsGiftItem()) { $this->cartItemProcessor->processCartItem( $item, @@ -86,8 +90,7 @@ public function process(OrderInterface $cart): void $itemPrice, $context, ); - } catch (NoRuleFoundException) { - } catch (NoPriceFoundException) { + } catch (NoRuleFoundException|NoPriceFoundException) { } } diff --git a/src/CoreShop/Component/Core/Order/Processor/CartItemsWholesaleProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartItemsWholesaleProcessor.php index e822fb078e..5d4bce676a 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartItemsWholesaleProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartItemsWholesaleProcessor.php @@ -35,12 +35,20 @@ public function __construct( public function process(OrderInterface $cart): void { + if ($cart->isImmutable()) { + return; + } + $context = $this->cartContextResolver->resolveCartContext($cart); /** * @var OrderItemInterface $item */ foreach ($cart->getItems() as $item) { + if ($item->isImmutable()) { + continue; + } + $product = $item->getProduct(); try { diff --git a/src/CoreShop/Component/Core/Order/Processor/CartPaymentProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartPaymentProcessor.php index a76eeb38b7..255fce06af 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartPaymentProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartPaymentProcessor.php @@ -23,16 +23,20 @@ use CoreShop\Component\Order\Model\AdjustmentInterface; use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Processor\CartProcessorInterface; -use CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculator; +use CoreShop\Component\Payment\Calculator\PaymentProviderRulePriceCalculatorInterface; +use CoreShop\Component\Payment\Checker\PaymentProviderRuleCheckerInterface; +use Pimcore\Translation\Translator; final class CartPaymentProcessor implements CartProcessorInterface { public function __construct( private int $decimalFactor, private int $decimalPrecision, - protected PaymentProviderRulePriceCalculator $priceCalculator, + protected PaymentProviderRulePriceCalculatorInterface $priceCalculator, private CartContextResolverInterface $cartContextResolver, private AdjustmentFactoryInterface $adjustmentFactory, + protected PaymentProviderRuleCheckerInterface $paymentProviderRuleChecker, + protected Translator $translator, ) { } @@ -41,20 +45,31 @@ public function process(OrderInterface $cart): void $cart->setPaymentTotal( (int) round((round($cart->getTotal() / $this->decimalFactor, $this->decimalPrecision) * 100), 0), ); + $paymentProvider = $cart->getPaymentProvider(); - if ($cart->getPaymentProvider()) { + if ($cart->isImmutable()) { + return; + } + + if ( + $paymentProvider + && $validRule = $this->paymentProviderRuleChecker->findValidPaymentProviderRule($paymentProvider, $cart) + ) { $context = $this->cartContextResolver->resolveCartContext($cart); $price = $this->priceCalculator->getPrice( - $cart->getPaymentProvider(), + $paymentProvider, $cart, $context, ); + $ruleLabel = $validRule->getLabel($cart->getLocaleCode()); + $defaultRuleLabel = $this->translator->trans('coreshop.paymentprovider.rule.label'); + $cart->addAdjustment( $this->adjustmentFactory->createWithData( AdjustmentInterface::PAYMENT, - 'PaymentProvider fee', + !empty($ruleLabel) ? $ruleLabel : $defaultRuleLabel, $price, $price, ), diff --git a/src/CoreShop/Component/Core/Order/Processor/CartPriceRuleVoucherProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartPriceRuleVoucherProcessor.php index d096ad1c90..6916023689 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartPriceRuleVoucherProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartPriceRuleVoucherProcessor.php @@ -40,6 +40,10 @@ public function __construct( public function process(OrderInterface $cart): void { + if ($cart->isImmutable()) { + return; + } + $priceRuleItems = $cart->getPriceRuleItems(); if (!$priceRuleItems instanceof Fieldcollection) { diff --git a/src/CoreShop/Component/Core/Order/Processor/CartRuleAutoProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartRuleAutoProcessor.php index 0cbed727a1..7c6c8f1990 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartRuleAutoProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartRuleAutoProcessor.php @@ -36,6 +36,10 @@ public function __construct( public function process(OrderInterface $cart): void { + if ($cart->isImmutable()) { + return; + } + $eligibleRules = $this->cartPriceRuleRepository->findNonVoucherRules(); /** diff --git a/src/CoreShop/Component/Core/Order/Processor/CartShippingProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartShippingProcessor.php index 0b2fb635ad..55610e9a6a 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartShippingProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartShippingProcessor.php @@ -48,6 +48,10 @@ public function __construct( public function process(OrderInterface $cart): void { + if ($cart->isImmutable()) { + return; + } + if (!$cart instanceof CoreOrderInterface) { return; } diff --git a/src/CoreShop/Component/Core/Order/Processor/CartSubtotalProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartSubtotalProcessor.php index e6f95656ca..948bfef513 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartSubtotalProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartSubtotalProcessor.php @@ -18,7 +18,6 @@ namespace CoreShop\Component\Core\Order\Processor; -use CoreShop\Component\Core\Model\OrderItemInterface; use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Processor\CartProcessorInterface; @@ -26,20 +25,7 @@ final class CartSubtotalProcessor implements CartProcessorInterface { public function process(OrderInterface $cart): void { - $subtotalGross = 0; - $subtotalNet = 0; - - /** - * @var OrderItemInterface $item - */ - foreach ($cart->getItems() as $item) { - $subtotalGross += $item->getTotal(true); - $subtotalNet += $item->getTotal(false); - } - - $cart->setSubtotal($subtotalGross, true); - $cart->setSubtotal($subtotalNet, false); - + $cart->recalculateSubtotal(); $cart->recalculateAdjustmentsTotal(); } } diff --git a/src/CoreShop/Component/Core/Order/Processor/CartTextProcessor.php b/src/CoreShop/Component/Core/Order/Processor/CartTextProcessor.php index 11efb37b1c..166629bb6c 100644 --- a/src/CoreShop/Component/Core/Order/Processor/CartTextProcessor.php +++ b/src/CoreShop/Component/Core/Order/Processor/CartTextProcessor.php @@ -34,10 +34,18 @@ public function __construct( public function process(OrderInterface $cart): void { + if ($cart->isImmutable()) { + return; + } + /** * @var OrderItemInterface $item */ foreach ($cart->getItems() as $item) { + if ($item->isImmutable()) { + continue; + } + $product = $item->getProduct(); if (!$product instanceof PurchasableInterface) { diff --git a/src/CoreShop/Component/Core/Payment/Rule/Condition/GuestConditionChecker.php b/src/CoreShop/Component/Core/Payment/Rule/Condition/GuestConditionChecker.php new file mode 100644 index 0000000000..c50fedf1e2 --- /dev/null +++ b/src/CoreShop/Component/Core/Payment/Rule/Condition/GuestConditionChecker.php @@ -0,0 +1,46 @@ +getCustomer(); + + if (!$customer instanceof CustomerInterface) { + return true; + } + + return null === $customer->getUser(); + } +} diff --git a/src/CoreShop/Component/Core/Payment/Rule/Condition/ProductsConditionChecker.php b/src/CoreShop/Component/Core/Payment/Rule/Condition/ProductsConditionChecker.php index 7478f6908b..c70702c6dc 100644 --- a/src/CoreShop/Component/Core/Payment/Rule/Condition/ProductsConditionChecker.php +++ b/src/CoreShop/Component/Core/Payment/Rule/Condition/ProductsConditionChecker.php @@ -30,6 +30,8 @@ class ProductsConditionChecker extends AbstractConditionChecker { + public const PAYMENT_PROVIDER_RULE_RECURSIVE_VARIANT_CACHE_TAG = 'cs_payment_provider_rule_recursive_variant'; + use ProductVariantsCheckerTrait { ProductVariantsCheckerTrait::__construct as private __traitConstruct; } @@ -53,6 +55,7 @@ public function isPaymentProviderRuleValid( $configuration['products'], $payable->getStore(), $configuration['include_variants'] ?: false, + [self::PAYMENT_PROVIDER_RULE_RECURSIVE_VARIANT_CACHE_TAG], ); if (!$payable instanceof OrderInterface) { diff --git a/src/CoreShop/Component/Core/Product/Cloner/ProductQuantityPriceRulesCloner.php b/src/CoreShop/Component/Core/Product/Cloner/ProductQuantityPriceRulesCloner.php index a611242951..53a0f06a97 100644 --- a/src/CoreShop/Component/Core/Product/Cloner/ProductQuantityPriceRulesCloner.php +++ b/src/CoreShop/Component/Core/Product/Cloner/ProductQuantityPriceRulesCloner.php @@ -47,6 +47,11 @@ public function clone( } $quantityPriceRules = $referenceProduct->getQuantityPriceRules(); + $hasQuantityPriceRules = count($product->getQuantityPriceRules()) > 0; + + if ($hasQuantityPriceRules === true && $resetExistingData === false) { + return; + } /** * @var Concrete&ProductInterface $referenceProduct diff --git a/src/CoreShop/Component/Core/Product/Rule/Condition/GuestConditionChecker.php b/src/CoreShop/Component/Core/Product/Rule/Condition/GuestConditionChecker.php new file mode 100644 index 0000000000..7455d3c856 --- /dev/null +++ b/src/CoreShop/Component/Core/Product/Rule/Condition/GuestConditionChecker.php @@ -0,0 +1,40 @@ +getUser(); + } +} diff --git a/src/CoreShop/Component/Core/Product/Rule/Condition/NotCombinableWithCartPriceRuleVoucherConditionChecker.php b/src/CoreShop/Component/Core/Product/Rule/Condition/NotCombinableWithCartPriceRuleVoucherConditionChecker.php new file mode 100644 index 0000000000..3665eddfc1 --- /dev/null +++ b/src/CoreShop/Component/Core/Product/Rule/Condition/NotCombinableWithCartPriceRuleVoucherConditionChecker.php @@ -0,0 +1,63 @@ +getPriceRuleItems()?->getItems() ?: [] as $cartRule) { + if (!$cartRule instanceof PriceRuleItemInterface) { + continue; + } + + if (null === $cartRule->getCartPriceRule()) { + continue; + } + + if (in_array($cartRule->getCartPriceRule()->getId(), $notCombinableIds)) { + return false; + } + } + + return true; + } +} diff --git a/src/CoreShop/Component/Core/Product/Rule/Condition/ProductsConditionChecker.php b/src/CoreShop/Component/Core/Product/Rule/Condition/ProductsConditionChecker.php index 21ebdbf8ac..c6c485b112 100644 --- a/src/CoreShop/Component/Core/Product/Rule/Condition/ProductsConditionChecker.php +++ b/src/CoreShop/Component/Core/Product/Rule/Condition/ProductsConditionChecker.php @@ -55,6 +55,7 @@ public function isValid( $configuration['products'], $params['store'], $configuration['include_variants'] ?: false, + [sprintf('cs_rule_variant_%s', $rule->getId())], ); return in_array($subject->getId(), $productIdsToCheck); diff --git a/src/CoreShop/Component/Core/README.md b/src/CoreShop/Component/Core/README.md index b2d6f57adf..8bedf75bf2 100644 --- a/src/CoreShop/Component/Core/README.md +++ b/src/CoreShop/Component/Core/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Core/Repository/CategoryRepositoryInterface.php b/src/CoreShop/Component/Core/Repository/CategoryRepositoryInterface.php index 487139f66b..c390407ac9 100644 --- a/src/CoreShop/Component/Core/Repository/CategoryRepositoryInterface.php +++ b/src/CoreShop/Component/Core/Repository/CategoryRepositoryInterface.php @@ -44,6 +44,11 @@ public function findChildCategoriesForStore(CategoryInterface $category, StoreIn */ public function findRecursiveChildCategoryIdsForStore(CategoryInterface $category, StoreInterface $store): array; + /** + * @return int[] + */ + public function findRecursiveChildCategoryIdsForStoreByCategories(array $categories, StoreInterface $store): array; + /** * @return CategoryInterface[] */ diff --git a/src/CoreShop/Component/Core/Repository/ProductVariantRepositoryInterface.php b/src/CoreShop/Component/Core/Repository/ProductVariantRepositoryInterface.php index f7352a1cc3..348d3cdba5 100644 --- a/src/CoreShop/Component/Core/Repository/ProductVariantRepositoryInterface.php +++ b/src/CoreShop/Component/Core/Repository/ProductVariantRepositoryInterface.php @@ -30,4 +30,6 @@ interface ProductVariantRepositoryInterface extends BaseProductRepositoryInterfa public function findAllVariants(ProductInterface $product, bool $recursive = true): array; public function findRecursiveVariantIdsForProductAndStore(ProductInterface $product, StoreInterface $store): array|\Pimcore\Model\DataObject\Listing; + + public function findRecursiveVariantIdsForProductAndStoreByProducts(array $products, StoreInterface $store, array $cacheTags = []): array; } diff --git a/src/CoreShop/Component/Core/Rule/Condition/CategoriesConditionCheckerTrait.php b/src/CoreShop/Component/Core/Rule/Condition/CategoriesConditionCheckerTrait.php index eba899e2c3..ece769a27a 100644 --- a/src/CoreShop/Component/Core/Rule/Condition/CategoriesConditionCheckerTrait.php +++ b/src/CoreShop/Component/Core/Rule/Condition/CategoriesConditionCheckerTrait.php @@ -18,7 +18,6 @@ namespace CoreShop\Component\Core\Rule\Condition; -use CoreShop\Component\Core\Model\CategoryInterface; use CoreShop\Component\Core\Repository\CategoryRepositoryInterface; use CoreShop\Component\Store\Model\StoreInterface; @@ -37,21 +36,7 @@ protected function getCategoriesToCheck(array $categories, StoreInterface $store $categoryIdsToCheck = $categories; if ($recursive) { - foreach ($categories as $categoryId) { - $category = $this->categoryRepository->find($categoryId); - - if (!$category instanceof CategoryInterface) { - continue; - } - - $subCategories = $this->categoryRepository->findRecursiveChildCategoryIdsForStore($category, $store); - - foreach ($subCategories as $child) { - if (!in_array($child, $categoryIdsToCheck)) { - $categoryIdsToCheck[] = $child; - } - } - } + $categoryIdsToCheck = $this->categoryRepository->findRecursiveChildCategoryIdsForStoreByCategories($categories, $store); } return $categoryIdsToCheck; diff --git a/src/CoreShop/Component/Core/Rule/Condition/ProductVariantsCheckerTrait.php b/src/CoreShop/Component/Core/Rule/Condition/ProductVariantsCheckerTrait.php index 96d7b38da0..a593e14b62 100644 --- a/src/CoreShop/Component/Core/Rule/Condition/ProductVariantsCheckerTrait.php +++ b/src/CoreShop/Component/Core/Rule/Condition/ProductVariantsCheckerTrait.php @@ -18,7 +18,6 @@ namespace CoreShop\Component\Core\Rule\Condition; -use CoreShop\Component\Core\Model\ProductInterface; use CoreShop\Component\Core\Repository\ProductVariantRepositoryInterface; use CoreShop\Component\Store\Model\StoreInterface; @@ -32,25 +31,16 @@ public function __construct( $this->productRepository = $productRepository; } - protected function getProductsToCheck(array $products, StoreInterface $store, bool $includeVariants): array + protected function getProductsToCheck(array $products, StoreInterface $store, bool $includeVariants, array $cacheTags = []): array { $productIdsToCheck = $products; if ($includeVariants) { - foreach ($products as $productId) { - $product = $this->productRepository->find($productId); - - if (!$product instanceof ProductInterface) { - continue; - } - $variants = $this->productRepository->findRecursiveVariantIdsForProductAndStore($product, $store); - - foreach ($variants as $variant) { - if (!in_array($variant, $productIdsToCheck)) { - $productIdsToCheck[] = $variant; - } - } - } + $productIdsToCheck = $this->productRepository->findRecursiveVariantIdsForProductAndStoreByProducts( + $products, + $store, + $cacheTags, + ); } return $productIdsToCheck; diff --git a/src/CoreShop/Component/Core/Shipping/Rule/Condition/GuestConditionChecker.php b/src/CoreShop/Component/Core/Shipping/Rule/Condition/GuestConditionChecker.php new file mode 100644 index 0000000000..ec967a9eca --- /dev/null +++ b/src/CoreShop/Component/Core/Shipping/Rule/Condition/GuestConditionChecker.php @@ -0,0 +1,48 @@ +getCustomer(); + + if (!$customer instanceof CustomerInterface) { + return true; + } + + return null === $customer->getUser(); + } +} diff --git a/src/CoreShop/Component/Core/Shipping/Rule/Condition/ProductsConditionChecker.php b/src/CoreShop/Component/Core/Shipping/Rule/Condition/ProductsConditionChecker.php index 4c7bed6f22..9f531e7432 100644 --- a/src/CoreShop/Component/Core/Shipping/Rule/Condition/ProductsConditionChecker.php +++ b/src/CoreShop/Component/Core/Shipping/Rule/Condition/ProductsConditionChecker.php @@ -30,6 +30,8 @@ class ProductsConditionChecker extends AbstractConditionChecker { + public const SHIPPING_RULE_RECURSIVE_VARIANT_CACHE_TAG = 'cs_shipping_rule_recursive_variant'; + use ProductVariantsCheckerTrait { ProductVariantsCheckerTrait::__construct as private __traitConstruct; } @@ -54,6 +56,7 @@ public function isShippingRuleValid( $configuration['products'], $shippable->getStore(), $configuration['include_variants'] ?: false, + [self::SHIPPING_RULE_RECURSIVE_VARIANT_CACHE_TAG], ); $cartItems = $shippable->getItems(); diff --git a/src/CoreShop/Component/Currency/README.md b/src/CoreShop/Component/Currency/README.md index bcd61ccae2..98f4405029 100644 --- a/src/CoreShop/Component/Currency/README.md +++ b/src/CoreShop/Component/Currency/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Customer/README.md b/src/CoreShop/Component/Customer/README.md index 8f123bffac..a502a88b50 100644 --- a/src/CoreShop/Component/Customer/README.md +++ b/src/CoreShop/Component/Customer/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Index/Filter/CategoryMultiSelectConditionProcessor.php b/src/CoreShop/Component/Index/Filter/CategoryMultiSelectConditionProcessor.php index 5d19064ad6..1740905fab 100644 --- a/src/CoreShop/Component/Index/Filter/CategoryMultiSelectConditionProcessor.php +++ b/src/CoreShop/Component/Index/Filter/CategoryMultiSelectConditionProcessor.php @@ -90,7 +90,7 @@ public function addCondition(FilterConditionInterface $condition, FilterInterfac $field = 'parentCategoryIds'; } - $values = $parameterBag->get($field); + $values = $parameterBag->all($field); if (empty($values)) { $values = $condition->getConfiguration()['preSelects']; diff --git a/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionFromMultiselectProcessor.php b/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionFromMultiselectProcessor.php index 79ec534cef..3570ea4613 100644 --- a/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionFromMultiselectProcessor.php +++ b/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionFromMultiselectProcessor.php @@ -71,7 +71,7 @@ public function prepareValuesForRendering(FilterConditionInterface $condition, F public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, array $currentFilter, ParameterBag $parameterBag, bool $isPrecondition = false): array { $field = $condition->getConfiguration()['field']; - $values = $parameterBag->get($field); + $values = $parameterBag->all($field); if (empty($values)) { $values = $condition->getConfiguration()['preSelects']; diff --git a/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionProcessor.php b/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionProcessor.php index d4c6564c17..7704e7b3a3 100644 --- a/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionProcessor.php +++ b/src/CoreShop/Component/Index/Filter/MultiselectFilterConditionProcessor.php @@ -45,7 +45,7 @@ public function prepareValuesForRendering(FilterConditionInterface $condition, F public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, array $currentFilter, ParameterBag $parameterBag, bool $isPrecondition = false): array { $field = $condition->getConfiguration()['field']; - $values = $parameterBag->get($field); + $values = $parameterBag->all($field); if (empty($values) && isset($condition->getConfiguration()['preSelects'])) { $values = $condition->getConfiguration()['preSelects']; diff --git a/src/CoreShop/Component/Index/Filter/RelationalMultiselectConditionProcessor.php b/src/CoreShop/Component/Index/Filter/RelationalMultiselectConditionProcessor.php index 4c244d82de..6ce0507456 100644 --- a/src/CoreShop/Component/Index/Filter/RelationalMultiselectConditionProcessor.php +++ b/src/CoreShop/Component/Index/Filter/RelationalMultiselectConditionProcessor.php @@ -57,7 +57,7 @@ public function addCondition(FilterConditionInterface $condition, FilterInterfac { $field = $condition->getConfiguration()['field']; - $values = $parameterBag->get($field); + $values = $parameterBag->all($field); if (empty($values) && isset($condition->getConfiguration()['preSelects'])) { $values = $condition->getConfiguration()['preSelects']; diff --git a/src/CoreShop/Component/Index/Interpreter/ObjectInterpreter.php b/src/CoreShop/Component/Index/Interpreter/ObjectInterpreter.php index 3aa2ede636..20111cdda9 100644 --- a/src/CoreShop/Component/Index/Interpreter/ObjectInterpreter.php +++ b/src/CoreShop/Component/Index/Interpreter/ObjectInterpreter.php @@ -21,6 +21,7 @@ use CoreShop\Component\Index\Model\IndexableInterface; use CoreShop\Component\Index\Model\IndexColumnInterface; use Pimcore\Model\DataObject\AbstractObject; +use Pimcore\Model\DataObject\Data\ObjectMetadata; class ObjectInterpreter implements RelationInterpreterInterface { @@ -30,6 +31,9 @@ public function interpretRelational(mixed $value, IndexableInterface $indexable, if (is_array($value)) { foreach ($value as $v) { + if ($v instanceof ObjectMetadata) { + $v = $v->getObject(); + } if ($v instanceof AbstractObject) { $result[] = new RelationalValue($v->getId(), 'object'); } @@ -47,6 +51,9 @@ public function interpret(mixed $value, IndexableInterface $indexable, IndexColu if (is_array($value)) { foreach ($value as $v) { + if ($v instanceof ObjectMetadata) { + $v = $v->getObject(); + } if ($v instanceof AbstractObject) { $result[] = $v->getId(); } diff --git a/src/CoreShop/Component/Index/Model/Filter.php b/src/CoreShop/Component/Index/Model/Filter.php index 35ac9a014d..a6c54cc080 100644 --- a/src/CoreShop/Component/Index/Model/Filter.php +++ b/src/CoreShop/Component/Index/Model/Filter.php @@ -53,7 +53,7 @@ class Filter extends AbstractResource implements FilterInterface /** * @var string */ - protected $orderKey = 'id'; + protected $orderKey = 'o_id'; /** * @var IndexInterface diff --git a/src/CoreShop/Component/Index/README.md b/src/CoreShop/Component/Index/README.md index 636997a8ac..9ebf2ce627 100644 --- a/src/CoreShop/Component/Index/README.md +++ b/src/CoreShop/Component/Index/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Inventory/README.md b/src/CoreShop/Component/Inventory/README.md index 456450144f..16f94b83df 100644 --- a/src/CoreShop/Component/Inventory/README.md +++ b/src/CoreShop/Component/Inventory/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Locale/README.md b/src/CoreShop/Component/Locale/README.md index 18e8cd6012..84df064536 100644 --- a/src/CoreShop/Component/Locale/README.md +++ b/src/CoreShop/Component/Locale/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Notification/README.md b/src/CoreShop/Component/Notification/README.md index 262afd69a7..aa2b9e9430 100644 --- a/src/CoreShop/Component/Notification/README.md +++ b/src/CoreShop/Component/Notification/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php b/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php index 2e1e21654f..d2ca99520d 100644 --- a/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php +++ b/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php @@ -115,6 +115,7 @@ public function applyRule(OrderInterface $cart, array $configuration, PriceRuleI $cartPriceRuleItem->getCartPriceRule()->getName(), $cartPriceRuleItem->getDiscount(true), $cartPriceRuleItem->getDiscount(false), + true, ), ); diff --git a/src/CoreShop/Component/Order/Cart/Rule/Condition/VoucherConditionChecker.php b/src/CoreShop/Component/Order/Cart/Rule/Condition/VoucherConditionChecker.php index 768655c714..2eee590586 100644 --- a/src/CoreShop/Component/Order/Cart/Rule/Condition/VoucherConditionChecker.php +++ b/src/CoreShop/Component/Order/Cart/Rule/Condition/VoucherConditionChecker.php @@ -18,26 +18,34 @@ namespace CoreShop\Component\Order\Cart\Rule\Condition; +use CoreShop\Component\Customer\Model\CustomerInterface; use CoreShop\Component\Order\Model\CartPriceRuleInterface; use CoreShop\Component\Order\Model\CartPriceRuleVoucherCodeInterface; use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Order\Model\PriceRuleItemInterface; +use CoreShop\Component\Order\Repository\CartPriceRuleVoucherCodeCustomerRepositoryInterface; use CoreShop\Component\Order\Repository\CartPriceRuleVoucherRepositoryInterface; class VoucherConditionChecker extends AbstractConditionChecker { public function __construct( private CartPriceRuleVoucherRepositoryInterface $voucherCodeRepository, + private CartPriceRuleVoucherCodeCustomerRepositoryInterface $codePerUserRepository, ) { } - public function isCartRuleValid(OrderInterface $cart, CartPriceRuleInterface $cartPriceRule, ?CartPriceRuleVoucherCodeInterface $voucher, array $configuration): bool - { - if (null === $voucher) { + public function isCartRuleValid( + OrderInterface $cart, + CartPriceRuleInterface $cartPriceRule, + ?CartPriceRuleVoucherCodeInterface $voucher, + array $configuration, + ): bool { + if ($voucher === null) { return false; } $maxUsagePerCode = $configuration['maxUsagePerCode']; + $maxUsagePerUser = $configuration['maxUsagePerUser'] ?? null; $onlyOnePerCart = $configuration['onlyOnePerCart']; $storedCode = $this->voucherCodeRepository->findByCode($voucher->getCode()); @@ -53,13 +61,30 @@ public function isCartRuleValid(OrderInterface $cart, CartPriceRuleInterface $ca } } + // max usage per user condition + if (is_numeric($maxUsagePerUser)) { + $customer = $cart->getCustomer(); + + if (!$customer instanceof CustomerInterface) { + return false; + } + + $usesObject = $this->codePerUserRepository->findUsesByCustomer($customer, $voucher); + $uses = $usesObject?->getUses() ?? 0; + + if ($maxUsagePerUser !== 0 && $uses >= $maxUsagePerUser) { + return false; + } + } + // only once per cart condition if ($onlyOnePerCart === true) { $valid = true; if ($cart->hasPriceRules()) { foreach ($cart->getPriceRuleItems() as $rule) { if ($rule instanceof PriceRuleItemInterface) { - if ($rule->getCartPriceRule()->getIsVoucherRule() && $rule->getVoucherCode() !== $storedCode->getCode()) { + if ($rule->getCartPriceRule()->getIsVoucherRule() && $rule->getVoucherCode( + ) !== $storedCode->getCode()) { $valid = false; break; diff --git a/src/CoreShop/Component/Order/Factory/CartPriceRuleVoucherCodeCustomerFactory.php b/src/CoreShop/Component/Order/Factory/CartPriceRuleVoucherCodeCustomerFactory.php new file mode 100644 index 0000000000..37596a2ae4 --- /dev/null +++ b/src/CoreShop/Component/Order/Factory/CartPriceRuleVoucherCodeCustomerFactory.php @@ -0,0 +1,52 @@ +className(); + } + + public function createWithInitialData(CustomerInterface $customer, CartPriceRuleVoucherCodeInterface $voucherCode): CartPriceRuleVoucherCodeCustomerInterface + { + /** + * @var CartPriceRuleVoucherCodeCustomerInterface $voucherCodeCustomer + */ + $voucherCodeCustomer = $this->createNew(); + $voucherCodeCustomer->setCustomerId($customer->getId()); + $voucherCodeCustomer->setUses(1); + $voucherCodeCustomer->setVoucherCode($voucherCode); + + return $voucherCodeCustomer; + } +} diff --git a/src/CoreShop/Component/Order/Factory/CartPriceRuleVoucherCodeCustomerFactoryInterface.php b/src/CoreShop/Component/Order/Factory/CartPriceRuleVoucherCodeCustomerFactoryInterface.php new file mode 100644 index 0000000000..52a758f7e2 --- /dev/null +++ b/src/CoreShop/Component/Order/Factory/CartPriceRuleVoucherCodeCustomerFactoryInterface.php @@ -0,0 +1,29 @@ +cartItemFactory->createNew(); @@ -37,13 +40,14 @@ public function createNew() public function createWithCart(OrderInterface $cart, PurchasableInterface $purchasable): OrderItemInterface { - $item = $this->cartItemFactory->createNew(); + $item = $this->createNew(); $item->setKey(uniqid()); $item->setParent($cart); $item->setQuantity(0); $item->setProduct($purchasable); $item->setPublished(true); $item->setOrder($cart); + $item->setImmutable(false); $cart->addItem($item); @@ -52,11 +56,12 @@ public function createWithCart(OrderInterface $cart, PurchasableInterface $purch public function createWithPurchasable(PurchasableInterface $purchasable): OrderItemInterface { - $item = $this->cartItemFactory->createNew(); + $item = $this->createNew(); $item->setKey(uniqid()); $item->setQuantity(0); $item->setProduct($purchasable); $item->setPublished(true); + $item->setImmutable(false); return $item; } diff --git a/src/CoreShop/Component/Order/Generator/CartPriceRuleVoucherCodeGenerator.php b/src/CoreShop/Component/Order/Generator/CartPriceRuleVoucherCodeGenerator.php index 31789d1848..036b6ea0ac 100644 --- a/src/CoreShop/Component/Order/Generator/CartPriceRuleVoucherCodeGenerator.php +++ b/src/CoreShop/Component/Order/Generator/CartPriceRuleVoucherCodeGenerator.php @@ -51,6 +51,7 @@ public function generateCodes(CartPriceRuleVoucherGeneratorInterface $generator) $code = $this->generateCode($lettersToUse, $generator->getLength(), $generator->getPrefix(), $generator->getSuffix(), $generatedVouchers); if ($generator->getHyphensOn() > 0) { + /** @psalm-suppress ArgumentTypeCoercion */ $hyphens = str_split($code, $generator->getHyphensOn()); if (false !== $hyphens) { diff --git a/src/CoreShop/Component/Order/Manager/CartManagerInterface.php b/src/CoreShop/Component/Order/Manager/CartManagerInterface.php index b4fea469ae..96da863e63 100644 --- a/src/CoreShop/Component/Order/Manager/CartManagerInterface.php +++ b/src/CoreShop/Component/Order/Manager/CartManagerInterface.php @@ -22,5 +22,5 @@ interface CartManagerInterface { - public function persistCart(OrderInterface $cart): void; + public function persistCart(OrderInterface $cart/*, array $params = []*/): void; } diff --git a/src/CoreShop/Component/Order/Model/AdjustableInterface.php b/src/CoreShop/Component/Order/Model/AdjustableInterface.php index 98fd7d75af..5864271e37 100644 --- a/src/CoreShop/Component/Order/Model/AdjustableInterface.php +++ b/src/CoreShop/Component/Order/Model/AdjustableInterface.php @@ -31,6 +31,8 @@ public function removeAdjustment(AdjustmentInterface $adjustment); public function getAdjustmentsTotal(?string $type = null, bool $withTax = true): int; + public function getNeutralAdjustmentsTotal(?string $type = null, bool $withTax = true): int; + public function removeAdjustments(string $type = null); public function removeAdjustmentsRecursively(string $type = null); diff --git a/src/CoreShop/Component/Order/Model/AdjustableTrait.php b/src/CoreShop/Component/Order/Model/AdjustableTrait.php index 9725af1edb..6ee1149bdf 100644 --- a/src/CoreShop/Component/Order/Model/AdjustableTrait.php +++ b/src/CoreShop/Component/Order/Model/AdjustableTrait.php @@ -189,6 +189,26 @@ public function getAdjustmentsTotal(?string $type = null, bool $withTax = true): return $total; } + public function getNeutralAdjustmentsTotal(?string $type = null, bool $withTax = true): int + { + if (null === $type) { + if ($withTax) { + return $this->getPimcoreAdjustmentTotalGross() ?: 0; + } + + return $this->getPimcoreAdjustmentTotalNet() ?: 0; + } + + $total = 0; + foreach ($this->getAdjustments($type) as $adjustment) { + if ($adjustment->getNeutral()) { + $total += $adjustment->getAmount($withTax); + } + } + + return $total; + } + public function recalculateAdjustmentsTotal() { $adjustmentsTotalGross = 0; diff --git a/src/CoreShop/Component/Order/Model/CartPriceRuleVoucherCodeCustomer.php b/src/CoreShop/Component/Order/Model/CartPriceRuleVoucherCodeCustomer.php new file mode 100644 index 0000000000..c9a520e4a2 --- /dev/null +++ b/src/CoreShop/Component/Order/Model/CartPriceRuleVoucherCodeCustomer.php @@ -0,0 +1,86 @@ +id; + } + + public function getVoucherCode(): CartPriceRuleVoucherCodeInterface + { + return $this->voucherCode; + } + + public function setVoucherCode($voucherCode): void + { + $this->voucherCode = $voucherCode; + } + + public function getUses(): int + { + return $this->uses; + } + + public function setUses(int $uses): void + { + $this->uses = $uses; + } + + public function incrementUses(): void + { + ++$this->uses; + } + + public function decrementUses(): void + { + --$this->uses; + } + + public function getCustomerId(): int + { + return $this->customerId; + } + + public function setCustomerId(int $customerId): void + { + $this->customerId = $customerId; + } +} diff --git a/src/CoreShop/Component/Order/Model/CartPriceRuleVoucherCodeCustomerInterface.php b/src/CoreShop/Component/Order/Model/CartPriceRuleVoucherCodeCustomerInterface.php new file mode 100644 index 0000000000..bc0ce3d136 --- /dev/null +++ b/src/CoreShop/Component/Order/Model/CartPriceRuleVoucherCodeCustomerInterface.php @@ -0,0 +1,40 @@ +getConvertedAdjustmentsTotal(AdjustmentInterface::PAYMENT, false); } + public function count(): int + { + return count($this->getItems() ?: []); + } + public function getTotalNet(): int { throw new ImplementedByPimcoreException(__CLASS__, __METHOD__); @@ -280,6 +287,23 @@ public function setConvertedTaxes(?Fieldcollection $taxes) throw new ImplementedByPimcoreException(__CLASS__, __METHOD__); } + public function recalculateSubtotal(): void + { + $subtotalGross = 0; + $subtotalNet = 0; + + /** + * @var OrderItemInterface $item + */ + foreach ($this->getItems() as $item) { + $subtotalGross += $item->getTotal(true); + $subtotalNet += $item->getTotal(false); + } + + $this->setSubtotal($subtotalGross, true); + $this->setSubtotal($subtotalNet, false); + } + protected function recalculateConvertedAfterAdjustmentChange(): void { $this->setConvertedTotal($this->getConvertedSubtotal(true) + $this->getConvertedAdjustmentsTotal(null, true), true); @@ -288,6 +312,8 @@ protected function recalculateConvertedAfterAdjustmentChange(): void protected function recalculateAfterAdjustmentChange(): void { + $this->recalculateSubtotal(); + $this->setTotal($this->getSubtotal(true) + $this->getAdjustmentsTotal(null, true), true); $this->setTotal($this->getSubtotal(false) + $this->getAdjustmentsTotal(null, false), false); } diff --git a/src/CoreShop/Component/Order/Model/OrderInterface.php b/src/CoreShop/Component/Order/Model/OrderInterface.php index 1f6c552381..0d183a7bd5 100644 --- a/src/CoreShop/Component/Order/Model/OrderInterface.php +++ b/src/CoreShop/Component/Order/Model/OrderInterface.php @@ -26,6 +26,7 @@ use CoreShop\Component\Locale\Model\LocaleAwareInterface; use CoreShop\Component\Payment\Model\PayableInterface; use CoreShop\Component\Payment\Model\PaymentProviderInterface; +use CoreShop\Component\Resource\Model\ImmutableInterface; use CoreShop\Component\Resource\Pimcore\Model\PimcoreModelInterface; use CoreShop\Component\StorageList\Model\StorageListInterface; use CoreShop\Component\Store\Model\StoreAwareInterface; @@ -41,7 +42,8 @@ interface OrderInterface extends ConvertedAdjustableInterface, CustomerAwareInterface, PayableInterface, - StorageListInterface + StorageListInterface, + ImmutableInterface { public function getId(): ?int; @@ -225,4 +227,6 @@ public function getPriceRuleByCartPriceRule( public function getPaymentProvider(): ?PaymentProviderInterface; public function setPaymentProvider(?PaymentProviderInterface $paymentProvider); + + public function recalculateSubtotal(): void; } diff --git a/src/CoreShop/Component/Order/Model/OrderItem.php b/src/CoreShop/Component/Order/Model/OrderItem.php index 68f6df021f..8ac91d50a4 100644 --- a/src/CoreShop/Component/Order/Model/OrderItem.php +++ b/src/CoreShop/Component/Order/Model/OrderItem.php @@ -19,6 +19,7 @@ namespace CoreShop\Component\Order\Model; use CoreShop\Component\Resource\Exception\ImplementedByPimcoreException; +use CoreShop\Component\Resource\Model\ImmutableTrait; use CoreShop\Component\Resource\Pimcore\Model\AbstractPimcoreModel; use CoreShop\Component\StorageList\Model\StorageListInterface; use CoreShop\Component\StorageList\Model\StorageListItemInterface; @@ -31,6 +32,7 @@ abstract class OrderItem extends AbstractPimcoreModel implements OrderItemInterf use AdjustableTrait; use ConvertedAdjustableTrait; use ProposalPriceRuleTrait; + use ImmutableTrait; public function equals(StorageListItemInterface $storageListItem): bool { diff --git a/src/CoreShop/Component/Order/Model/OrderItemInterface.php b/src/CoreShop/Component/Order/Model/OrderItemInterface.php index 02547f1991..ad21a1d7ae 100644 --- a/src/CoreShop/Component/Order/Model/OrderItemInterface.php +++ b/src/CoreShop/Component/Order/Model/OrderItemInterface.php @@ -18,6 +18,7 @@ namespace CoreShop\Component\Order\Model; +use CoreShop\Component\Resource\Model\ImmutableInterface; use CoreShop\Component\Resource\Pimcore\Model\PimcoreModelInterface; use CoreShop\Component\StorageList\Model\StorageListItemInterface; use Pimcore\Model\DataObject\Fieldcollection; @@ -26,7 +27,8 @@ interface OrderItemInterface extends PimcoreModelInterface, AdjustableInterface, ConvertedAdjustableInterface, - StorageListItemInterface + StorageListItemInterface, + ImmutableInterface { public function getId(): ?int; @@ -140,6 +142,8 @@ public function getConvertedTotalTax(): int; public function setConvertedTotal(int $total, bool $withTax = true); + public function setConvertedSubtotal(int $subtotal, bool $withTax = true); + public function getConvertedItemDiscountPrice(bool $withTax = true): int; public function setConvertedItemDiscountPrice(int $convertedItemDiscountPrice, bool $withTax = true); diff --git a/src/CoreShop/Component/Order/Modifier/ImmutabilityModifier.php b/src/CoreShop/Component/Order/Modifier/ImmutabilityModifier.php new file mode 100644 index 0000000000..b336991d01 --- /dev/null +++ b/src/CoreShop/Component/Order/Modifier/ImmutabilityModifier.php @@ -0,0 +1,35 @@ +setImmutable(true); + $order->save(); + + foreach ($order->getItems() as $item) { + $item->setImmutable(true); + $item->save(); + } + } +} diff --git a/src/CoreShop/Component/Order/Modifier/ImmutabilityModifierInterface.php b/src/CoreShop/Component/Order/Modifier/ImmutabilityModifierInterface.php new file mode 100644 index 0000000000..bd3f6a5850 --- /dev/null +++ b/src/CoreShop/Component/Order/Modifier/ImmutabilityModifierInterface.php @@ -0,0 +1,26 @@ +entityManager->persist($voucherCode); } + + $customer = $order->getCustomer(); + + if (!$customer) { + continue; + } + + foreach ($item->getCartPriceRule()?->getConditions() ?: [] as $conditions) { + if ($conditions->getType() === 'voucher') { + $maxUsagePerCustomer = $conditions->getConfiguration()['maxUsagePerUser'] ?? null; + + if ($maxUsagePerCustomer !== null) { + $perCustomerEntry = $this->codePerUserRepository->findUsesByCustomer($customer, $voucherCode); + + if ($perCustomerEntry instanceof CartPriceRuleVoucherCodeCustomerInterface) { + $perCustomerEntry->incrementUses(); + + $this->entityManager->persist($perCustomerEntry); + } + + if (null === $perCustomerEntry) { + $perCustomerEntry = $this->voucherCodeCustomerFactory->createWithInitialData($customer, $voucherCode); + + $this->entityManager->persist($perCustomerEntry); + } + } + } + } } $this->entityManager->flush(); @@ -94,6 +127,32 @@ public function decrement(OrderInterface $order): void $this->entityManager->persist($voucherCode); } } + + $customer = $order->getCustomer(); + + if (!$customer) { + continue; + } + + foreach ($item->getCartPriceRule()?->getConditions() ?: [] as $conditions) { + if ($conditions->getType() === 'voucher') { + $maxUsagePerCustomer = $conditions->getConfiguration()['maxUsagePerUser'] ?? null; + + if ($maxUsagePerCustomer !== null) { + $perCustomerEntry = $this->codePerUserRepository->findUsesByCustomer($customer, $voucherCode); + + if ($perCustomerEntry instanceof CartPriceRuleVoucherCodeCustomerInterface) { + $perCustomerEntry->decrementUses(); + + if ($perCustomerEntry->getUses() === 0) { + $this->entityManager->remove($perCustomerEntry); + } else { + $this->entityManager->persist($perCustomerEntry); + } + } + } + } + } } $this->entityManager->flush(); diff --git a/src/CoreShop/Component/Order/Notes.php b/src/CoreShop/Component/Order/Notes.php index 0a4c58f44b..d63705b32e 100644 --- a/src/CoreShop/Component/Order/Notes.php +++ b/src/CoreShop/Component/Order/Notes.php @@ -49,4 +49,9 @@ final class Notes * Note Identifier for order comments. */ public const NOTE_ORDER_COMMENT = 'order_comment'; + + /** + * Note Identifier for backend order updates. + */ + public const NOTE_ORDER_BACKEND_UPDATE_SAVE = 'order_backend_update_save'; } diff --git a/src/CoreShop/Component/Order/OrderEditPossible.php b/src/CoreShop/Component/Order/OrderEditPossible.php new file mode 100644 index 0000000000..068d766dc4 --- /dev/null +++ b/src/CoreShop/Component/Order/OrderEditPossible.php @@ -0,0 +1,56 @@ +orderEditEnabled) { + return false; + } + + if ($order->getSaleState() === OrderSaleStates::STATE_ORDER) { + /** + * Order that has been paid, cannot be edited anymore. Changing the order also + * means that the remaining amount has to be paid as well, that is currently not reflectable + * Allowing that, also means that we have to find a way to do further Payments to the Order + * Might come in the future + */ + if ($order->getPaymentState() === OrderPaymentStates::STATE_PAID) { + return false; + } + + if ($order->getOrderState() === OrderStates::STATE_CANCELLED) { + return false; + } + + return $order->getOrderState() !== OrderStates::STATE_COMPLETE; + } + + return true; + } +} diff --git a/src/CoreShop/Component/Order/OrderEditPossibleInterface.php b/src/CoreShop/Component/Order/OrderEditPossibleInterface.php new file mode 100644 index 0000000000..6be4c42d67 --- /dev/null +++ b/src/CoreShop/Component/Order/OrderEditPossibleInterface.php @@ -0,0 +1,26 @@ +paymentProviderRuleChecker->findValidPaymentProviderRule($paymentProvider, $payable); diff --git a/src/CoreShop/Component/Payment/Calculator/PaymentProviderRulePriceCalculatorInterface.php b/src/CoreShop/Component/Payment/Calculator/PaymentProviderRulePriceCalculatorInterface.php new file mode 100644 index 0000000000..b9dae5e3d3 --- /dev/null +++ b/src/CoreShop/Component/Payment/Calculator/PaymentProviderRulePriceCalculatorInterface.php @@ -0,0 +1,27 @@ +initializeRules(); + $this->initializeTranslationsCollection(); + } + public function getId(): ?int { return $this->id; } + + + public function getLabel(?string $language = null) + { + return $this->getTranslation($language)->getLabel(); + } + + public function setLabel(string $label, ?string $language = null) + { + $this->getTranslation($language)->setLabel($label); + } + + public function getTranslation(?string $locale = null, bool $useFallbackTranslation = true): PaymentProviderRuleTranslationInterface + { + /** @var PaymentProviderRuleTranslationInterface $translation */ + $translation = $this->doGetTranslation($locale, $useFallbackTranslation); + + return $translation; + } + + protected function createTranslation(): PaymentProviderRuleTranslationInterface + { + return new PaymentProviderRuleTranslation(); + } } diff --git a/src/CoreShop/Component/Payment/Model/PaymentProviderRuleInterface.php b/src/CoreShop/Component/Payment/Model/PaymentProviderRuleInterface.php index b82da3c17f..df17d80701 100644 --- a/src/CoreShop/Component/Payment/Model/PaymentProviderRuleInterface.php +++ b/src/CoreShop/Component/Payment/Model/PaymentProviderRuleInterface.php @@ -18,8 +18,12 @@ namespace CoreShop\Component\Payment\Model; +use CoreShop\Component\Resource\Model\TranslatableInterface; use CoreShop\Component\Rule\Model\RuleInterface; -interface PaymentProviderRuleInterface extends RuleInterface +interface PaymentProviderRuleInterface extends RuleInterface, TranslatableInterface { + public function getLabel(string $language = null); + + public function setLabel(string $label, string $language = null); } diff --git a/src/CoreShop/Component/Payment/Model/PaymentProviderRuleTranslation.php b/src/CoreShop/Component/Payment/Model/PaymentProviderRuleTranslation.php new file mode 100644 index 0000000000..6204d8eda4 --- /dev/null +++ b/src/CoreShop/Component/Payment/Model/PaymentProviderRuleTranslation.php @@ -0,0 +1,54 @@ +id; + } + + public function getLabel(): string + { + return $this->label; + } + + public function setLabel(string $label): static + { + $this->label = $label; + + return $this; + } +} diff --git a/src/CoreShop/Component/Payment/Model/PaymentProviderRuleTranslationInterface.php b/src/CoreShop/Component/Payment/Model/PaymentProviderRuleTranslationInterface.php new file mode 100644 index 0000000000..9ad82d0af9 --- /dev/null +++ b/src/CoreShop/Component/Payment/Model/PaymentProviderRuleTranslationInterface.php @@ -0,0 +1,30 @@ +paymentProviderRuleRepository->find($paymentProviderRuleId); + + if ($paymentProviderRule instanceof PaymentProviderRuleInterface) { + return $this->ruleValidationProcessor->isValid($paymentProvider, $paymentProviderRule, ['payable' => $payable]); + } + + return false; + } +} diff --git a/src/CoreShop/Component/PayumPayment/README.md b/src/CoreShop/Component/PayumPayment/README.md index b5b58a0ce5..bd945d20c8 100644 --- a/src/CoreShop/Component/PayumPayment/README.md +++ b/src/CoreShop/Component/PayumPayment/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://www.coreshop.org/docs/2.1.0/Components/Payment_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Pimcore/DataObject/NoteService.php b/src/CoreShop/Component/Pimcore/DataObject/NoteService.php index 6dcdac0627..22b4713d68 100644 --- a/src/CoreShop/Component/Pimcore/DataObject/NoteService.php +++ b/src/CoreShop/Component/Pimcore/DataObject/NoteService.php @@ -18,10 +18,12 @@ namespace CoreShop\Component\Pimcore\DataObject; +use Doctrine\DBAL\Exception\RetryableException; use Pimcore\Model\DataObject\Concrete; use Pimcore\Model\Document; use Pimcore\Model\Element\Note; use Pimcore\Model\Tool\Email\Log; +use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\GenericEvent; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -29,6 +31,7 @@ class NoteService implements NoteServiceInterface { public function __construct( protected EventDispatcherInterface $eventDispatcher, + protected LoggerInterface $pimcoreLogger, ) { } @@ -88,7 +91,50 @@ public function storeNoteForEmail(Note $note, Document\Email $emailDocument): No public function storeNote(Note $note, array $eventParams = []): Note { - $note->save(); + $maxRetries = 5; + for ($retries = 0; $retries < $maxRetries; ++$retries) { + try { + $note->beginTransaction(); + $note->save(); + $note->commit(); + + //the transaction was successfully completed, so we cancel the loop here -> no restart required + break; + } catch (\Exception $e) { + try { + $note->rollBack(); + } catch (\Exception $er) { + // PDO adapter throws exceptions if rollback fails + $this->pimcoreLogger->info((string) $er); + } + + if ($e instanceof RetryableException) { + // we try to start the transaction $maxRetries times again (deadlocks, ...) + if ($retries < ($maxRetries - 1)) { + $run = $retries + 1; + $waitTime = random_int(1, 5) * 100000; // microseconds + $this->pimcoreLogger->warning( + 'Unable to finish transaction (' . $run . ". run) because of the following reason '" . + $e->getMessage() . + "'. --> Retrying in " . $waitTime . ' microseconds ... (' . ($run + 1) . ' of ' . $maxRetries . ')', + ); + + usleep($waitTime); // wait specified time until we restart the transaction + } else { + $this->pimcoreLogger->error( + 'Finally giving up restarting the same transaction again and again, last message: ' . $e->getMessage( + ), + ); + + throw $e; + } + + continue; + } + + throw $e; + } + } $this->eventDispatcher->dispatch( new GenericEvent($note, $eventParams), diff --git a/src/CoreShop/Component/Pimcore/README.md b/src/CoreShop/Component/Pimcore/README.md index 64d000a2ff..a1888ef692 100644 --- a/src/CoreShop/Component/Pimcore/README.md +++ b/src/CoreShop/Component/Pimcore/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Product/Model/Category.php b/src/CoreShop/Component/Product/Model/Category.php index 5c2ea7a036..61f4882fbe 100644 --- a/src/CoreShop/Component/Product/Model/Category.php +++ b/src/CoreShop/Component/Product/Model/Category.php @@ -19,22 +19,18 @@ namespace CoreShop\Component\Product\Model; use CoreShop\Component\Resource\Pimcore\Model\AbstractPimcoreModel; +use Pimcore\Model\DataObject\Listing; abstract class Category extends AbstractPimcoreModel implements CategoryInterface { - public function getChildCategories(): array + public function getChildCategories(): Listing { - /** - * @var CategoryInterface[] $childs - */ - $childs = $this->getChildren(); - - return $childs; + return $this->getChildren(); } public function hasChildCategories(): bool { - return count($this->getChildren()) > 0; + return $this->getChildren()->getTotalCount() > 0; } public function getNameForSlug(string $language = null): ?string diff --git a/src/CoreShop/Component/Product/Model/CategoryInterface.php b/src/CoreShop/Component/Product/Model/CategoryInterface.php index 489fce57fb..fc1b8402da 100644 --- a/src/CoreShop/Component/Product/Model/CategoryInterface.php +++ b/src/CoreShop/Component/Product/Model/CategoryInterface.php @@ -21,6 +21,7 @@ use CoreShop\Component\Pimcore\Slug\KeyableSluggableInterface; use CoreShop\Component\Pimcore\Slug\SluggableInterface; use CoreShop\Component\Resource\Pimcore\Model\PimcoreModelInterface; +use Pimcore\Model\DataObject\Listing; interface CategoryInterface extends PimcoreModelInterface, SluggableInterface, KeyableSluggableInterface { @@ -38,10 +39,7 @@ public function getParentCategory(): ?self; public function setParentCategory(?self $parentCategory); - /** - * @return CategoryInterface[] - */ - public function getChildCategories(): array; + public function getChildCategories(): Listing; public function hasChildCategories(): bool; diff --git a/src/CoreShop/Component/Product/README.md b/src/CoreShop/Component/Product/README.md index ec162e179a..d343cbe0bd 100644 --- a/src/CoreShop/Component/Product/README.md +++ b/src/CoreShop/Component/Product/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/ProductQuantityPriceRules/Model/ProductQuantityPriceRule.php b/src/CoreShop/Component/ProductQuantityPriceRules/Model/ProductQuantityPriceRule.php index a81c124deb..f04b6592ce 100644 --- a/src/CoreShop/Component/ProductQuantityPriceRules/Model/ProductQuantityPriceRule.php +++ b/src/CoreShop/Component/ProductQuantityPriceRules/Model/ProductQuantityPriceRule.php @@ -111,6 +111,9 @@ public function hasConditions(): bool public function hasCondition(ConditionInterface $condition): bool { + /** + * @psalm-suppress InvalidArgument + */ return $this->conditions->contains($condition); } @@ -163,6 +166,9 @@ public function hasRanges() public function hasRange(QuantityRangeInterface $priceRange) { + /** + * @psalm-suppress InvalidArgument + */ return $this->ranges->contains($priceRange); } diff --git a/src/CoreShop/Component/ProductQuantityPriceRules/README.md b/src/CoreShop/Component/ProductQuantityPriceRules/README.md index a3e44ad252..faab994a21 100644 --- a/src/CoreShop/Component/ProductQuantityPriceRules/README.md +++ b/src/CoreShop/Component/ProductQuantityPriceRules/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Registry/README.md b/src/CoreShop/Component/Registry/README.md index e6c48385e0..89450a7d5d 100644 --- a/src/CoreShop/Component/Registry/README.md +++ b/src/CoreShop/Component/Registry/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Resource/DataHub/DoctrineProvider.php b/src/CoreShop/Component/Resource/DataHub/DoctrineProvider.php index 9a79ec2207..798fb31d5f 100644 --- a/src/CoreShop/Component/Resource/DataHub/DoctrineProvider.php +++ b/src/CoreShop/Component/Resource/DataHub/DoctrineProvider.php @@ -30,6 +30,7 @@ use CoreShop\Component\Resource\DataHub\Type\BigIntType; use CoreShop\Component\Resource\DataHub\Type\DateTimeType; use CoreShop\Component\Resource\DataHub\Type\JsonType; +use CoreShop\Component\Resource\Metadata\MetadataInterface; use CoreShop\Component\Resource\Metadata\RegistryInterface; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Mapping\ClassMetadataInfo; @@ -49,64 +50,32 @@ class DoctrineProvider public const ARRAY = 'Array'; /** @var Type[] */ - private static $standardTypes; - - /** - * @var array - */ - private $doctrineMetadata = []; - - /** - * @var array - */ - private $types = []; - - /** - * @var array - */ - private $typeClass = []; - - /** - * @var array - */ - private $doctrineToName = []; - - /** - * @var array - */ - private $inputTypes = []; - - /** - * @var array - */ - private $inputTypesToName = []; - - /** - * @var array - */ - private $inputQueryFilterTypes = []; - - /** - * @var array - */ - private $identifierFields = []; - - /** - * @var EntityManagerInterface - */ - private $em; - - private $metadataRegistry; + private static array|null $standardTypes = null; + + private array $doctrineMetadata = []; + + private array $types = []; + + private array $typeClass = []; + + private array $doctrineToName = []; + + private array $inputTypes = []; + + private array $inputTypesToName = []; + + private array $inputQueryFilterTypes = []; + + private array $identifierFields = []; + + private array $classMap = []; private $niceNameMap = []; public function __construct( - EntityManagerInterface $entityManager, - RegistryInterface $metadataRegistry, + private EntityManagerInterface $em, + private RegistryInterface $metadataRegistry, ) { - $this->em = $entityManager; - $this->metadataRegistry = $metadataRegistry; - $this->types[GraphPageInfo::NAME] = GraphPageInfo::getType(); $this->types[GraphSortField::NAME] = GraphSortField::getType(); $this->types[FilterString::NAME] = FilterString::getType(); @@ -114,11 +83,32 @@ public function __construct( $this->types[FilterDateTimeBetween::NAME] = FilterDateTimeBetween::getType($this->getType('datetime')); $this->types[FilterDateTime::NAME] = FilterDateTime::getType($this->getType('datetime'), $this->getType(FilterDateTimeBetween::NAME)); - foreach ($metadataRegistry->getAll() as $metadata) { + $this->initialize(); + } + + public function initialize() + { + /** + * @var MetadataInterface $metadata + */ + foreach ($this->metadataRegistry->getAll() as $metadata) { if ($metadata->getDriver() !== CoreShopResourceBundle::DRIVER_DOCTRINE_ORM) { continue; } + if (!$metadata->hasParameter('graphql')) { + continue; + } + + if (!$metadata->getParameter('graphql')['enabled'] ?? false) { + continue; + } + + $className = $metadata->getClass('model'); + $this->classMap[$className] = $metadata; + } + + foreach ($this->classMap as $className => $metadata) { $className = $metadata->getClass('model'); $niceName = ucfirst($metadata->getApplicationName()) . ucfirst(str_replace('_', '', ucwords($metadata->getName(), '_'))); @@ -214,6 +204,11 @@ public function initializeResource(ClassMetadataInfo $entityMetaType, string $ni foreach ($entityMetaType->getAssociationMappings() as $association) { $fieldName = $association['fieldName']; $doctrineClass = $association['targetEntity']; + + if (!array_key_exists($doctrineClass, $this->classMap)) { + continue; + } + $graphName = $this->getTypeName($doctrineClass); if (isset($this->doctrineMetadata[$graphName])) { @@ -377,6 +372,7 @@ private function mapFieldType($doctrineType) case 'json_array': return self::getStandardType(self::JSON); case 'array': + case 'json': return self::getStandardType(self::ARRAY); } diff --git a/src/CoreShop/Component/Resource/Model/ImmutableInterface.php b/src/CoreShop/Component/Resource/Model/ImmutableInterface.php new file mode 100644 index 0000000000..a3880e4d89 --- /dev/null +++ b/src/CoreShop/Component/Resource/Model/ImmutableInterface.php @@ -0,0 +1,28 @@ +immutable; + } + + public function setImmutable(?bool $immutable) + { + $this->immutable = $immutable; + } + + public function isImmutable(): bool + { + return (bool) $this->immutable; + } +} diff --git a/src/CoreShop/Component/Resource/README.md b/src/CoreShop/Component/Resource/README.md index ecf357bb28..b052377722 100644 --- a/src/CoreShop/Component/Resource/README.md +++ b/src/CoreShop/Component/Resource/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Rule/Condition/NestedConditionChecker.php b/src/CoreShop/Component/Rule/Condition/NestedConditionChecker.php index 06d4e1a84a..1f4d870d17 100644 --- a/src/CoreShop/Component/Rule/Condition/NestedConditionChecker.php +++ b/src/CoreShop/Component/Rule/Condition/NestedConditionChecker.php @@ -31,7 +31,7 @@ public function __construct( public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool { $operator = $configuration['operator']; - $valid = $operator === 'and'; + $valid = in_array($operator, ['and', 'not'], true); foreach ($configuration['conditions'] as $condition) { $conditionValid = $this->ruleConditionsValidationProcessor->isValid($subject, $rule, [$condition], $params); @@ -44,6 +44,14 @@ public function isValid(ResourceInterface $subject, RuleInterface $rule, array $ break 2; } + break; + case 'not': + if ($conditionValid) { + $valid = false; + + break 2; + } + break; case 'or': if ($conditionValid) { @@ -56,10 +64,6 @@ public function isValid(ResourceInterface $subject, RuleInterface $rule, array $ } } - if ('not' === $operator) { - return !$valid; - } - return $valid; } } diff --git a/src/CoreShop/Component/Rule/Condition/RuleConditionsValidationProcessor.php b/src/CoreShop/Component/Rule/Condition/RuleConditionsValidationProcessor.php index e890e371de..b734945090 100644 --- a/src/CoreShop/Component/Rule/Condition/RuleConditionsValidationProcessor.php +++ b/src/CoreShop/Component/Rule/Condition/RuleConditionsValidationProcessor.php @@ -60,6 +60,6 @@ public function isConditionValid(ResourceInterface $subject, RuleInterface $rule /** @var ConditionCheckerInterface $checker */ $checker = $this->ruleRegistry->get($condition->getType()); - return $checker->isValid($subject, $rule, $condition->getConfiguration(), $params); + return $checker->isValid($subject, $rule, $condition->getConfiguration() ?? [], $params); } } diff --git a/src/CoreShop/Component/Rule/Model/ConditionInterface.php b/src/CoreShop/Component/Rule/Model/ConditionInterface.php index fb4cb0ba8c..64ae6f8ff7 100644 --- a/src/CoreShop/Component/Rule/Model/ConditionInterface.php +++ b/src/CoreShop/Component/Rule/Model/ConditionInterface.php @@ -45,7 +45,7 @@ public function getSort(); public function setSort($sort); /** - * @return array + * @return array|null */ public function getConfiguration(); diff --git a/src/CoreShop/Component/Rule/README.md b/src/CoreShop/Component/Rule/README.md index 39f6687721..d7f71e2bc4 100644 --- a/src/CoreShop/Component/Rule/README.md +++ b/src/CoreShop/Component/Rule/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/SEO/README.md b/src/CoreShop/Component/SEO/README.md index 17b60d57ec..da17e04d40 100644 --- a/src/CoreShop/Component/SEO/README.md +++ b/src/CoreShop/Component/SEO/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Sequence/README.md b/src/CoreShop/Component/Sequence/README.md index 9bb7f9f44f..ee2104949a 100644 --- a/src/CoreShop/Component/Sequence/README.md +++ b/src/CoreShop/Component/Sequence/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Shipping/README.md b/src/CoreShop/Component/Shipping/README.md index 318739f762..d8e147a9f0 100644 --- a/src/CoreShop/Component/Shipping/README.md +++ b/src/CoreShop/Component/Shipping/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/StorageList/Core/Context/CustomerAndStoreBasedStorageListContext.php b/src/CoreShop/Component/StorageList/Core/Context/CustomerAndStoreBasedStorageListContext.php index 3ec80df4b6..8e6c9e840f 100644 --- a/src/CoreShop/Component/StorageList/Core/Context/CustomerAndStoreBasedStorageListContext.php +++ b/src/CoreShop/Component/StorageList/Core/Context/CustomerAndStoreBasedStorageListContext.php @@ -20,12 +20,14 @@ use CoreShop\Component\Customer\Context\CustomerContextInterface; use CoreShop\Component\Customer\Context\CustomerNotFoundException; +use CoreShop\Component\Order\Context\CartNotFoundException; use CoreShop\Component\StorageList\Context\StorageListContextInterface; use CoreShop\Component\StorageList\Context\StorageListNotFoundException; use CoreShop\Component\StorageList\Core\Repository\CustomerAndStoreAwareRepositoryInterface; use CoreShop\Component\StorageList\Model\StorageListInterface; use CoreShop\Component\Store\Context\StoreContextInterface; use CoreShop\Component\Store\Context\StoreNotFoundException; +use Pimcore\Http\RequestHelper; final class CustomerAndStoreBasedStorageListContext implements StorageListContextInterface { @@ -33,11 +35,20 @@ public function __construct( private CustomerContextInterface $customerContext, private StoreContextInterface $storeContext, private CustomerAndStoreAwareRepositoryInterface $repository, + private RequestHelper $requestHelper, + private bool $restoreCustomerStorageListOnlyOnLogin, ) { } public function getStorageList(): StorageListInterface { + if ($this->restoreCustomerStorageListOnlyOnLogin && + $this->requestHelper->hasMainRequest() && + $this->requestHelper->getMainRequest()->attributes->get('_route') !== 'coreshop_login_check' + ) { + throw new CartNotFoundException('CustomerAndStoreBasedCartContext can only be applied in coreshop_login_check route.'); + } + try { $store = $this->storeContext->getStore(); } catch (StoreNotFoundException) { diff --git a/src/CoreShop/Component/StorageList/Manager/StorageListPimcoreModelManager.php b/src/CoreShop/Component/StorageList/Manager/StorageListPimcoreModelManager.php index d8fbeb287e..0d26fed61a 100644 --- a/src/CoreShop/Component/StorageList/Manager/StorageListPimcoreModelManager.php +++ b/src/CoreShop/Component/StorageList/Manager/StorageListPimcoreModelManager.php @@ -23,13 +23,11 @@ use CoreShop\Component\Resource\Service\FolderCreationServiceInterface; use CoreShop\Component\StorageList\Model\StorageListInterface; use CoreShop\Component\StorageList\StorageListManagerInterface; -use Doctrine\DBAL\Connection; final class StorageListPimcoreModelManager implements StorageListManagerInterface { public function __construct( private FolderCreationServiceInterface $folderCreationService, - private Connection $connection, ) { } @@ -71,7 +69,7 @@ public function persist(StorageListInterface $storageList): void ), ); $item->setPublished(true); - $item->setKey((string) ($index + 1)); + $item->setKey(uniqid((string) ((int) $index + 1), true)); $item->save(); } diff --git a/src/CoreShop/Component/StorageList/Model/StorageList.php b/src/CoreShop/Component/StorageList/Model/StorageList.php index e079581350..8103101d07 100644 --- a/src/CoreShop/Component/StorageList/Model/StorageList.php +++ b/src/CoreShop/Component/StorageList/Model/StorageList.php @@ -94,4 +94,9 @@ public function hasItems(): bool { return count($this->items) > 0; } + + public function count(): int + { + return count($this->items); + } } diff --git a/src/CoreShop/Component/StorageList/Model/StorageListInterface.php b/src/CoreShop/Component/StorageList/Model/StorageListInterface.php index 8c41cd5f96..7482093f53 100644 --- a/src/CoreShop/Component/StorageList/Model/StorageListInterface.php +++ b/src/CoreShop/Component/StorageList/Model/StorageListInterface.php @@ -18,7 +18,7 @@ namespace CoreShop\Component\StorageList\Model; -interface StorageListInterface +interface StorageListInterface extends \Countable { public function getId(): ?int; diff --git a/src/CoreShop/Component/StorageList/README.md b/src/CoreShop/Component/StorageList/README.md index 765c471021..eb83863fef 100644 --- a/src/CoreShop/Component/StorageList/README.md +++ b/src/CoreShop/Component/StorageList/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/StorageList/Repository/CustomerExpiryRepositoryTrait.php b/src/CoreShop/Component/StorageList/Repository/CustomerExpiryRepositoryTrait.php index a497641592..03cab95e99 100644 --- a/src/CoreShop/Component/StorageList/Repository/CustomerExpiryRepositoryTrait.php +++ b/src/CoreShop/Component/StorageList/Repository/CustomerExpiryRepositoryTrait.php @@ -29,15 +29,15 @@ public function findExpiredStorageLists(int $days, array $params = []): array $daysTimestamp = Carbon::now(); $daysTimestamp->subDays($days); - $conditions = ['o_modificationDate < ?']; + $conditions = ['modificationDate < ?']; $queryParams = [$daysTimestamp->getTimestamp()]; $groupCondition = []; - if (true === $params['anonymous'] ?? false) { + if (isset($params['anonymous']) && true === $params['anonymous']) { $groupCondition[] = 'customer__id IS NULL'; } - if (true === $params['customer'] ?? false) { + if (isset($params['customer']) && true === $params['customer']) { $groupCondition[] = 'customer__id IS NOT NULL'; } diff --git a/src/CoreShop/Component/StorageList/StorageListManagerInterface.php b/src/CoreShop/Component/StorageList/StorageListManagerInterface.php index 1fb0bfc4bf..e23b7418f3 100644 --- a/src/CoreShop/Component/StorageList/StorageListManagerInterface.php +++ b/src/CoreShop/Component/StorageList/StorageListManagerInterface.php @@ -22,5 +22,5 @@ interface StorageListManagerInterface { - public function persist(StorageListInterface $storageList): void; + public function persist(StorageListInterface $storageList/*, array $params = []*/): void; } diff --git a/src/CoreShop/Component/Store/Context/RequestBased/CachedStoreContext.php b/src/CoreShop/Component/Store/Context/RequestBased/CachedStoreContext.php index 7a5509b6fe..4d69fafcfc 100644 --- a/src/CoreShop/Component/Store/Context/RequestBased/CachedStoreContext.php +++ b/src/CoreShop/Component/Store/Context/RequestBased/CachedStoreContext.php @@ -19,10 +19,13 @@ namespace CoreShop\Component\Store\Context\RequestBased; use CoreShop\Component\Store\Context\StoreContextInterface; +use CoreShop\Component\Store\Context\StoreNotFoundException; use CoreShop\Component\Store\Model\StoreInterface; final class CachedStoreContext implements StoreContextInterface { + private bool $initialized = false; + private ?StoreInterface $cachedStore = null; public function __construct( @@ -32,8 +35,11 @@ public function __construct( public function getStore(): StoreInterface { - if (null === $this->cachedStore) { + if (false === $this->initialized) { + $this->initialized = true; $this->cachedStore = $this->requestBasedStoreContext->getStore(); + } elseif (!$this->cachedStore) { + throw new StoreNotFoundException(); } return $this->cachedStore; diff --git a/src/CoreShop/Component/Store/Model/StoresAwareTrait.php b/src/CoreShop/Component/Store/Model/StoresAwareTrait.php index bbcbbecbc5..0fcd835811 100644 --- a/src/CoreShop/Component/Store/Model/StoresAwareTrait.php +++ b/src/CoreShop/Component/Store/Model/StoresAwareTrait.php @@ -59,6 +59,9 @@ public function removeStore(StoreInterface $store) public function hasStore(StoreInterface $store) { + /** + * @psalm-suppress InvalidArgument + */ return $this->stores->contains($store); } } diff --git a/src/CoreShop/Component/Store/README.md b/src/CoreShop/Component/Store/README.md index 99d9ae87aa..5a1c78925f 100644 --- a/src/CoreShop/Component/Store/README.md +++ b/src/CoreShop/Component/Store/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Taxation/README.md b/src/CoreShop/Component/Taxation/README.md index 1836dd1267..e76554afd3 100644 --- a/src/CoreShop/Component/Taxation/README.md +++ b/src/CoreShop/Component/Taxation/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Tracking/README.md b/src/CoreShop/Component/Tracking/README.md index 924adad9ac..c976a049ff 100644 --- a/src/CoreShop/Component/Tracking/README.md +++ b/src/CoreShop/Component/Tracking/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/User/Model/User.php b/src/CoreShop/Component/User/Model/User.php index fb22def1cc..dc73e5d84c 100644 --- a/src/CoreShop/Component/User/Model/User.php +++ b/src/CoreShop/Component/User/Model/User.php @@ -73,6 +73,11 @@ public function getRoles(): array return $this->roles; } + public function getUserIdentifier(): string + { + return $this->getLoginIdentifier(); + } + public function getUsername(): ?string { return $this->getLoginIdentifier(); diff --git a/src/CoreShop/Component/User/README.md b/src/CoreShop/Component/User/README.md index 60591b7b3c..e059936dec 100644 --- a/src/CoreShop/Component/User/README.md +++ b/src/CoreShop/Component/User/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://www.coreshop.org/docs/2.1.0/Components/User_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Variant/Model/Resolved/ResolvedAttribute.php b/src/CoreShop/Component/Variant/Model/Resolved/ResolvedAttribute.php index 8a7f5fee8e..3ff8ca53df 100644 --- a/src/CoreShop/Component/Variant/Model/Resolved/ResolvedAttribute.php +++ b/src/CoreShop/Component/Variant/Model/Resolved/ResolvedAttribute.php @@ -73,6 +73,9 @@ public function removeProduct(ProductVariantAwareInterface $product): void public function hasProduct(ProductVariantAwareInterface $product): bool { + /** + * @psalm-suppress InvalidArgument + */ return $this->products->contains($product); } } diff --git a/src/CoreShop/Component/Variant/README.md b/src/CoreShop/Component/Variant/README.md index 831cc29be1..e18b944185 100644 --- a/src/CoreShop/Component/Variant/README.md +++ b/src/CoreShop/Component/Variant/README.md @@ -12,7 +12,7 @@ code. [Read more on coreshop.org](http://www.coreshop.org) Documentation ------------- -Documentation is available on [**coreshop.org**](https://www.coreshop.org/docs/2.1.0/Components/Variant_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Wishlist/Model/Wishlist.php b/src/CoreShop/Component/Wishlist/Model/Wishlist.php index 97ff750ac3..5d766e17b9 100644 --- a/src/CoreShop/Component/Wishlist/Model/Wishlist.php +++ b/src/CoreShop/Component/Wishlist/Model/Wishlist.php @@ -82,4 +82,9 @@ public function hasItem($item): bool return false; } + + public function count(): int + { + return count($this->getItems() ?: []); + } } diff --git a/src/CoreShop/Component/Wishlist/README.md b/src/CoreShop/Component/Wishlist/README.md index d9d9e87d3b..bf7c2ccab2 100644 --- a/src/CoreShop/Component/Wishlist/README.md +++ b/src/CoreShop/Component/Wishlist/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/4.0.0). Bug tracking ------------ diff --git a/src/Kernel.php b/src/Kernel.php index f9d3000896..81d78d971d 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -25,7 +25,7 @@ public function registerBundlesToCollection(BundleCollection $collection): void { parent::registerBundlesToCollection($collection); - $collection->addBundle(new \CoreShop\Bundle\CoreBundle\CoreShopCoreBundle(), 90); + $collection->addBundle(new \CoreShop\Bundle\CoreBundle\CoreShopCoreBundle(), 10); $collection->addBundle(new \FriendsOfBehat\SymfonyExtension\Bundle\FriendsOfBehatSymfonyExtensionBundle()); $collection->addBundle(new \CoreShop\Bundle\TestBundle\CoreShopTestBundle(), 0); }