├── yarn.lock
├── .gitignore
├── vendor
├── composer
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_classmap.php
│ ├── LICENSE
│ ├── autoload_static.php
│ ├── autoload_real.php
│ ├── installed.php
│ ├── installed.json
│ ├── InstalledVersions.php
│ └── ClassLoader.php
├── autoload.php
└── getkirby
│ └── composer-installer
│ ├── composer.json
│ ├── src
│ └── ComposerInstaller
│ │ ├── Plugin.php
│ │ ├── CmsInstaller.php
│ │ ├── Installer.php
│ │ └── PluginInstaller.php
│ ├── readme.md
│ └── composer.lock
├── snippets
└── snipcart
│ ├── cart
│ ├── cart-checkout-summary.php
│ └── cart-init.php
│ └── products
│ ├── product-add-to-cart.php
│ └── product-list.php
├── package.json
├── src
├── index.js
└── components
│ ├── discounts
│ ├── discounts.vue
│ └── components
│ │ └── discountlist.vue
│ ├── dashboard
│ ├── abandoned.vue
│ ├── sales.vue
│ ├── Vitals.vue
│ ├── popular.vue
│ └── orders.vue
│ ├── products
│ └── ProductTotal.vue
│ ├── panel
│ └── Dashboard.vue
│ └── tools
│ └── tabs.vue
├── .gitattributes
├── .editorconfig
├── blueprints
└── cart
│ └── product.yml
├── index.css
├── SECURITY.md
├── composer.json
├── LICENSE.md
├── composer.lock
├── README.md
├── index.php
└── index.js
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS files
2 | .DS_Store
3 |
4 | # npm modules
5 | /node_modules
6 |
7 | # Parcel cache folder
8 | .cache
9 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_namespaces.php:
--------------------------------------------------------------------------------
1 |
2 | Checkout
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_psr4.php:
--------------------------------------------------------------------------------
1 | array($vendorDir . '/getkirby/composer-installer/src'),
10 | );
11 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_classmap.php:
--------------------------------------------------------------------------------
1 | $vendorDir . '/composer/InstalledVersions.php',
10 | );
11 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kirby-snipcart",
3 | "version": "0.7.5",
4 | "description": "A kirby CMS panel plugin for Snipcart",
5 | "author": "Hash&Salt",
6 | "license": "MIT",
7 | "scripts": {
8 | "dev": "npx -y kirbyup src/index.js --watch",
9 | "build": "npx -y kirbyup src/index.js"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import Dash from "./components/panel/Dashboard.vue";
2 | import ProductTotal from "./components/products/ProductTotal.vue";
3 |
4 | panel.plugin("hashandsalt/snipcart", {
5 |
6 |
7 | components: {
8 | dash: Dash
9 | },
10 |
11 |
12 | fields: {
13 | productTotal: ProductTotal,
14 | }
15 |
16 | });
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Note: You need to uncomment the lines you want to use; the other lines can be deleted
2 |
3 | # Git
4 | # .gitattributes export-ignore
5 | # .gitignore export-ignore
6 |
7 | # Tests
8 | # /.coveralls.yml export-ignore
9 | # /.travis.yml export-ignore
10 | # /phpunit.xml.dist export-ignore
11 | # /tests/ export-ignore
12 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # This file is for unifying the coding style for different editors and IDEs
2 | # editorconfig.org
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | end_of_line = lf
9 | insert_final_newline = true
10 | trim_trailing_whitespace = true
11 |
12 | [*.php]
13 | indent_size = 4
14 |
15 | [*.md,*.txt]
16 | trim_trailing_whitespace = false
17 | insert_final_newline = false
18 |
19 | [composer.json]
20 | indent_size = 4
21 |
--------------------------------------------------------------------------------
/src/components/discounts/discounts.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
22 |
--------------------------------------------------------------------------------
/snippets/snipcart/products/product-add-to-cart.php:
--------------------------------------------------------------------------------
1 |
8 | Add to cart
9 |
10 |
--------------------------------------------------------------------------------
/blueprints/cart/product.yml:
--------------------------------------------------------------------------------
1 | type: group
2 | fields:
3 | productTotal:
4 | type: producttotal
5 | productName:
6 | label: Name
7 | type: text
8 | required: true
9 | productID:
10 | label: Product ID
11 | type: text
12 | required: true
13 | productPrice:
14 | label: Price
15 | type: number
16 | step: .01
17 | required: true
18 | productDescription:
19 | label: Description
20 | type: text
21 | required: true
22 | productImage:
23 | label: Image
24 | type: files
25 | max: 1
26 | required: true
27 |
--------------------------------------------------------------------------------
/src/components/dashboard/abandoned.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Abandonded Carts
4 | {{ abandonedCount }}
5 |
6 |
7 |
26 |
--------------------------------------------------------------------------------
/index.css:
--------------------------------------------------------------------------------
1 | .card{background-color:#fff;width:100%;overflow:hidden}.card-header{background-color:#16171a;display:flex;align-items:flex-start;justify-content:space-between;color:#fff;padding:15px 8px 0;overflow:hidden;clear:both}.tab-heads{display:flex;padding:0;list-style:none;margin:-4px 0 0 6px}.tab-head{padding:5px 18px;position:relative;cursor:pointer}.tab-head--active{background-color:#fff;color:#333;transition:.4s}.card-body{padding:20px 16px}.k-snipcart-vital{background-color:#000;text-align:center;overflow:hidden;padding:12px 0 24px}.k-snipcart-vital h3{color:#fff;margin:0 12px 24px 0;font-weight:400}.k-snipcart-vital span{color:#fff;font-size:28px;display:block}
2 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | *Use this section to tell people about which versions of your project are currently being supported with security updates.*
6 |
7 | | Version | Supported |
8 | | ------- | ------------------ |
9 | | 5.1.x | :white_check_mark: |
10 | | 5.0.x | :x: |
11 | | 4.0.x | :white_check_mark: |
12 | | < 4.0 | :x: |
13 |
14 | ## Reporting a Vulnerability
15 |
16 | *Use this section to tell people how to report a vulnerability.*
17 |
18 | *Tell them where to go, how often they can expect to get an update on a reported vulnerability, what to expect if the vulnerability is accepted or declined, etc.*
19 |
--------------------------------------------------------------------------------
/src/components/dashboard/sales.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Total Sales
4 | {{ salesCount }}
5 |
6 |
7 |
27 |
--------------------------------------------------------------------------------
/snippets/snipcart/products/product-list.php:
--------------------------------------------------------------------------------
1 |
2 | collection("products") as $product): ?>
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | = $product->title() ?>
12 |
13 |
14 |
15 |
= $product->productDescription() ?>
16 |
£= $product->productPrice() ?>
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hashandsalt/kirby-snipcart",
3 | "description": "Snipcart Panel Plugin",
4 | "type": "kirby-plugin",
5 | "license": "MIT",
6 | "keywords": [
7 | "kirby4",
8 | "kirby5"
9 | ],
10 | "support": {
11 | "issues": "https://github.com/HashandSalt/kirby-snipcart/issues",
12 | "source": "https://github.com/HashandSalt/kirby-snipcart"
13 | },
14 | "authors": [
15 | {
16 | "name": "James Steel",
17 | "email": "hello@hashandsalt.com"
18 | }
19 | ],
20 | "require": {
21 | "getkirby/composer-installer": "^1.1"
22 | },
23 | "config": {
24 | "allow-plugins": {
25 | "getkirby/composer-installer": true
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/vendor/autoload.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
34 |
35 |
--------------------------------------------------------------------------------
/src/components/products/ProductTotal.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Total Sales
5 | {{ salesCount }}
6 |
7 |
8 |
9 |
10 |
42 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c)
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/vendor/composer/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Copyright (c) Nils Adermann, Jordi Boggiano
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is furnished
9 | to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in all
12 | copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 |
22 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_static.php:
--------------------------------------------------------------------------------
1 |
11 | array (
12 | 'Kirby\\' => 6,
13 | ),
14 | );
15 |
16 | public static $prefixDirsPsr4 = array (
17 | 'Kirby\\' =>
18 | array (
19 | 0 => __DIR__ . '/..' . '/getkirby/composer-installer/src',
20 | ),
21 | );
22 |
23 | public static $classMap = array (
24 | 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
25 | );
26 |
27 | public static function getInitializer(ClassLoader $loader)
28 | {
29 | return \Closure::bind(function () use ($loader) {
30 | $loader->prefixLengthsPsr4 = ComposerStaticInite6aab26fb36f866ee271ee1417d9dbff::$prefixLengthsPsr4;
31 | $loader->prefixDirsPsr4 = ComposerStaticInite6aab26fb36f866ee271ee1417d9dbff::$prefixDirsPsr4;
32 | $loader->classMap = ComposerStaticInite6aab26fb36f866ee271ee1417d9dbff::$classMap;
33 |
34 | }, null, ClassLoader::class);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/components/dashboard/popular.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Most Popular
4 | {{ popularCount }}
5 |
6 |
7 |
46 |
--------------------------------------------------------------------------------
/vendor/composer/autoload_real.php:
--------------------------------------------------------------------------------
1 | register(true);
33 |
34 | return $loader;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/vendor/composer/installed.php:
--------------------------------------------------------------------------------
1 | array(
3 | 'name' => 'hashandsalt/kirby-snipcart',
4 | 'pretty_version' => 'dev-master',
5 | 'version' => 'dev-master',
6 | 'reference' => '3de7d8fcb8018adaab9c6a56062456894a64384f',
7 | 'type' => 'kirby-plugin',
8 | 'install_path' => __DIR__ . '/../../',
9 | 'aliases' => array(),
10 | 'dev' => true,
11 | ),
12 | 'versions' => array(
13 | 'getkirby/composer-installer' => array(
14 | 'pretty_version' => '1.2.1',
15 | 'version' => '1.2.1.0',
16 | 'reference' => 'c98ece30bfba45be7ce457e1102d1b169d922f3d',
17 | 'type' => 'composer-plugin',
18 | 'install_path' => __DIR__ . '/../getkirby/composer-installer',
19 | 'aliases' => array(),
20 | 'dev_requirement' => false,
21 | ),
22 | 'hashandsalt/kirby-snipcart' => array(
23 | 'pretty_version' => 'dev-master',
24 | 'version' => 'dev-master',
25 | 'reference' => '3de7d8fcb8018adaab9c6a56062456894a64384f',
26 | 'type' => 'kirby-plugin',
27 | 'install_path' => __DIR__ . '/../../',
28 | 'aliases' => array(),
29 | 'dev_requirement' => false,
30 | ),
31 | ),
32 | );
33 |
--------------------------------------------------------------------------------
/src/components/discounts/components/discountlist.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
46 |
47 |
49 |
--------------------------------------------------------------------------------
/src/components/panel/Dashboard.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Dashboard
9 |
10 |
11 |
12 |
13 | Discounts
14 |
15 |
16 |
17 |
18 |
19 |
20 |
41 |
42 |
60 |
--------------------------------------------------------------------------------
/src/components/dashboard/orders.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
44 |
45 |
47 |
--------------------------------------------------------------------------------
/vendor/getkirby/composer-installer/src/ComposerInstaller/Plugin.php:
--------------------------------------------------------------------------------
1 |
12 | * @link https://getkirby.com
13 | * @copyright Bastian Allgeier GmbH
14 | * @license https://opensource.org/licenses/MIT
15 | */
16 | class Plugin implements PluginInterface
17 | {
18 | /**
19 | * Apply plugin modifications to Composer
20 | *
21 | * @param \Composer\Composer $composer
22 | * @param \Composer\IO\IOInterface $io
23 | * @return void
24 | */
25 | public function activate(Composer $composer, IOInterface $io): void
26 | {
27 | $installationManager = $composer->getInstallationManager();
28 | $installationManager->addInstaller(new CmsInstaller($io, $composer));
29 | $installationManager->addInstaller(new PluginInstaller($io, $composer));
30 | }
31 |
32 | /**
33 | * Remove any hooks from Composer
34 | *
35 | * @codeCoverageIgnore
36 | *
37 | * @param \Composer\Composer $composer
38 | * @param \Composer\IO\IOInterface $io
39 | * @return void
40 | */
41 | public function deactivate(Composer $composer, IOInterface $io): void
42 | {
43 | // nothing to do
44 | }
45 |
46 | /**
47 | * Prepare the plugin to be uninstalled
48 | *
49 | * @codeCoverageIgnore
50 | *
51 | * @param Composer $composer
52 | * @param IOInterface $io
53 | * @return void
54 | */
55 | public function uninstall(Composer $composer, IOInterface $io): void
56 | {
57 | // nothing to do
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/src/components/tools/tabs.vue:
--------------------------------------------------------------------------------
1 |
2 |
23 |
24 |
25 |
53 |
54 |
98 |
--------------------------------------------------------------------------------
/vendor/getkirby/composer-installer/src/ComposerInstaller/CmsInstaller.php:
--------------------------------------------------------------------------------
1 |
12 | * @link https://getkirby.com
13 | * @copyright Bastian Allgeier GmbH
14 | * @license https://opensource.org/licenses/MIT
15 | */
16 | class CmsInstaller extends Installer
17 | {
18 | /**
19 | * Decides if the installer supports the given type
20 | *
21 | * @param string $packageType
22 | * @return bool
23 | */
24 | public function supports($packageType): bool
25 | {
26 | return $packageType === 'kirby-cms';
27 | }
28 |
29 | /**
30 | * Returns the installation path of a package
31 | *
32 | * @param \Composer\Package\PackageInterface $package
33 | * @return string
34 | */
35 | public function getInstallPath(PackageInterface $package): string
36 | {
37 | // get the extra configuration of the top-level package
38 | if ($rootPackage = $this->composer->getPackage()) {
39 | $extra = $rootPackage->getExtra();
40 | } else {
41 | $extra = [];
42 | }
43 |
44 | // use path from configuration, otherwise fall back to default
45 | if (isset($extra['kirby-cms-path']) === true) {
46 | $path = $extra['kirby-cms-path'];
47 | } else {
48 | $path = 'kirby';
49 | }
50 |
51 | // if explicitly set to something invalid (e.g. `false`), install to vendor dir
52 | if (is_string($path) !== true) {
53 | return parent::getInstallPath($package);
54 | }
55 |
56 | // don't allow unsafe directories
57 | $vendorDir = $this->composer->getConfig()->get('vendor-dir', Config::RELATIVE_PATHS) ?? 'vendor';
58 | if ($path === $vendorDir || $path === '.') {
59 | throw new InvalidArgumentException('The path ' . $path . ' is an unsafe installation directory for ' . $package->getPrettyName() . '.');
60 | }
61 |
62 | return $path;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/vendor/composer/installed.json:
--------------------------------------------------------------------------------
1 | {
2 | "packages": [
3 | {
4 | "name": "getkirby/composer-installer",
5 | "version": "1.2.1",
6 | "version_normalized": "1.2.1.0",
7 | "source": {
8 | "type": "git",
9 | "url": "https://github.com/getkirby/composer-installer.git",
10 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d"
11 | },
12 | "dist": {
13 | "type": "zip",
14 | "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d",
15 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d",
16 | "shasum": ""
17 | },
18 | "require": {
19 | "composer-plugin-api": "^1.0 || ^2.0"
20 | },
21 | "require-dev": {
22 | "composer/composer": "^1.8 || ^2.0"
23 | },
24 | "time": "2020-12-28T12:54:39+00:00",
25 | "type": "composer-plugin",
26 | "extra": {
27 | "class": "Kirby\\ComposerInstaller\\Plugin"
28 | },
29 | "installation-source": "dist",
30 | "autoload": {
31 | "psr-4": {
32 | "Kirby\\": "src/"
33 | }
34 | },
35 | "notification-url": "https://packagist.org/downloads/",
36 | "license": [
37 | "MIT"
38 | ],
39 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins",
40 | "homepage": "https://getkirby.com",
41 | "support": {
42 | "issues": "https://github.com/getkirby/composer-installer/issues",
43 | "source": "https://github.com/getkirby/composer-installer/tree/1.2.1"
44 | },
45 | "funding": [
46 | {
47 | "url": "https://getkirby.com/buy",
48 | "type": "custom"
49 | }
50 | ],
51 | "install-path": "../getkirby/composer-installer"
52 | }
53 | ],
54 | "dev": true,
55 | "dev-package-names": []
56 | }
57 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 | "This file is @generated automatically"
6 | ],
7 | "content-hash": "1f4fee894eb06d44597712995e66e4c2",
8 | "packages": [
9 | {
10 | "name": "getkirby/composer-installer",
11 | "version": "1.2.1",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/getkirby/composer-installer.git",
15 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d",
20 | "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "composer-plugin-api": "^1.0 || ^2.0"
25 | },
26 | "require-dev": {
27 | "composer/composer": "^1.8 || ^2.0"
28 | },
29 | "type": "composer-plugin",
30 | "extra": {
31 | "class": "Kirby\\ComposerInstaller\\Plugin"
32 | },
33 | "autoload": {
34 | "psr-4": {
35 | "Kirby\\": "src/"
36 | }
37 | },
38 | "notification-url": "https://packagist.org/downloads/",
39 | "license": [
40 | "MIT"
41 | ],
42 | "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins",
43 | "homepage": "https://getkirby.com",
44 | "support": {
45 | "issues": "https://github.com/getkirby/composer-installer/issues",
46 | "source": "https://github.com/getkirby/composer-installer/tree/1.2.1"
47 | },
48 | "funding": [
49 | {
50 | "url": "https://getkirby.com/buy",
51 | "type": "custom"
52 | }
53 | ],
54 | "time": "2020-12-28T12:54:39+00:00"
55 | }
56 | ],
57 | "packages-dev": [],
58 | "aliases": [],
59 | "minimum-stability": "stable",
60 | "stability-flags": {},
61 | "prefer-stable": false,
62 | "prefer-lowest": false,
63 | "platform": {},
64 | "platform-dev": {},
65 | "plugin-api-version": "2.6.0"
66 | }
67 |
--------------------------------------------------------------------------------
/snippets/snipcart/cart/cart-init.php:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Kirby Snipcart
2 |
3 | ## For Kirby 5 use release 0.7.5+
4 | ## For Kirby 4 use release 0.5.0
5 |
6 |
7 | This plugin helps integrate Snipcart into a Kirby site. We have big plans for this one, but right now it just helps add the default cart and provides blueprints & snippets to take the mandatory data that Snipcart needs in order to work.
8 |
9 | It is worth noting that this version is built on Vue, and adding the cart to the template also adds Vue. Therefore, if you need other interactivity (lightboxes, image sliders etc) on the site, it's not a good idea to use jQuery. Go with Vue based plugins.
10 |
11 | Planned future features:
12 |
13 | * Vue template overrides allowing greater customisation of the cart.
14 | * Panel widgets showing high level info like number of sales, revenue etc.
15 | * Full integration with the relevant parts Snipcart API.
16 | * Reports - export stuff like the sales for the year to CSV.
17 | * Anything else useful!
18 |
19 | Built against Kirby 3.8.3+ and PHP 8.1+
20 |
21 | ## Install
22 |
23 | ### Download
24 |
25 | Download and copy this repository to `/site/plugins/kirby3-snipcart`.
26 |
27 | ### Composer
28 |
29 | ```
30 | composer require hashandsalt/kirby3-snipcart
31 | ```
32 |
33 | ****
34 |
35 | ## Commerical Usage
36 |
37 | This plugin is free but if you use it in a commercial project please consider to
38 | - [make a donation 🍻](https://paypal.me/hashandsalt?locale.x=en_GB) or
39 | - [buy a Kirby license using this affiliate link](https://a.paddle.com/v2/click/1129/36141?link=1170)
40 |
41 | ****
42 |
43 |
44 | ## Usage
45 |
46 | ### Cart Snippet
47 |
48 | Add the cart just before your closing body tag:
49 |
50 | ```
51 | = snippet('cart/init') ?>
52 | ```
53 |
54 | ### Blueprint
55 |
56 | Extend the product data blueprint into you product page blueprint:
57 |
58 | ```
59 | sections:
60 | productdata:
61 | type: fields
62 | fields:
63 | productinfo: cart/product
64 | ```
65 |
66 | ### Add to Cart Button
67 |
68 | Add the "Add to Cart" button to your product template:
69 |
70 | ```
71 | = snippet('product/add') ?>
72 | ```
73 |
74 | ### Add Checkout Summary
75 |
76 | Add the "Checkout" button and items in basket to your product template:
77 |
78 | ```
79 | = snippet('cart/checkoutsummary') ?>
80 | ```
81 |
82 | ## Options
83 |
84 | The cart will not work without a valid API for the cart on the front end, and you also need a secret key for the Kirby Panel to work with. These can be obtained from within the Snipcart Dashboard.
85 |
86 | You can also choose wether or not to use the default css theme for the cart:
87 |
88 | ```
89 | 'hashandsalt.kirby-snipcart.snipcartlive' => false,
90 |
91 | 'hashandsalt.kirby-snipcart.apikeytest' => 'XXXX',
92 | 'hashandsalt.kirby-snipcart.apikeylive' => 'XXXX',
93 |
94 | 'hashandsalt.kirby-snipcart.apisecrettest' => 'XXXX',
95 | 'hashandsalt.kirby-snipcart.apisecretlive' => 'XXXX',
96 |
97 |
98 |
99 | ```
100 |
101 | ## Change Notes
102 |
103 | The following config option has been depricated as it is now a an option on the Snipcart JS call. You can set it in `= snippet('cart/init') ?>`
104 |
105 | ```
106 | 'hashandsalt.kirby-snipcart.defaulttheme' => true,
107 | ```
--------------------------------------------------------------------------------
/vendor/getkirby/composer-installer/readme.md:
--------------------------------------------------------------------------------
1 | # Kirby Composer Installer
2 |
3 | [](https://github.com/getkirby/composer-installer/actions?query=workflow%3ACI)
4 | [](https://coveralls.io/github/getkirby/composer-installer)
5 |
6 | This is Kirby's custom [Composer installer](https://getcomposer.org/doc/articles/custom-installers.md) for the Kirby CMS.
7 | It is responsible for automatically choosing the correct installation paths if you install the CMS via Composer.
8 |
9 | It can also be used to automatically install Kirby plugins to the `site/plugins` directory.
10 |
11 | ## Installing the CMS
12 |
13 | ### Default configuration
14 |
15 | If you `require` the `getkirby/cms` package in your own `composer.json`, there is nothing else you need to do:
16 |
17 | ```js
18 | {
19 | "require": {
20 | "getkirby/cms": "^3.0"
21 | }
22 | }
23 | ```
24 |
25 | Kirby's Composer installer (this repo) will run automatically and will install the CMS to the `kirby` directory.
26 |
27 | ### Custom installation path
28 |
29 | You might want to use a different installation path. The path can be configured like this in your `composer.json`:
30 |
31 | ```js
32 | {
33 | "require": {
34 | "getkirby/cms": "^3.0"
35 | },
36 | "extra": {
37 | "kirby-cms-path": "kirby" // change this to your custom path
38 | }
39 | }
40 | ```
41 |
42 | ### Disable the installer for the CMS
43 |
44 | If you prefer to have the CMS installed to the `vendor` directory, you can disable the custom path entirely:
45 |
46 | ```js
47 | {
48 | "require": {
49 | "getkirby/cms": "^3.0"
50 | },
51 | "extra": {
52 | "kirby-cms-path": false
53 | }
54 | }
55 | ```
56 |
57 | Please note that you will need to modify your site's `index.php` to load the `vendor/autoload.php` file instead of Kirby's `bootstrap.php`.
58 |
59 | ## Installing plugins
60 |
61 | ### Support in published plugins
62 |
63 | Plugins need to require this installer as a Composer dependency to make use of the automatic installation to the `site/plugins` directory.
64 |
65 | You can find out more about this in our [plugin documentation](https://getkirby.com/docs/guide/plugins/plugin-setup-basic).
66 |
67 | ### Usage for plugin users
68 |
69 | As a user of Kirby plugins that support this installer, you only need to `require` the plugins in your site's `composer.json`:
70 |
71 | ```js
72 | {
73 | "require": {
74 | "getkirby/cms": "^3.0",
75 | "superwoman/superplugin": "^1.0"
76 | }
77 | }
78 | ```
79 |
80 | The installer (this repo) will run automatically, as the plugin dev added it to the plugin's `composer.json`.
81 |
82 | ### Custom installation path
83 |
84 | If your `site/plugins` directory is at a custom path, you can configure the installation path like this in your `composer.json`:
85 |
86 | ```js
87 | {
88 | "require": {
89 | "getkirby/cms": "^3.0",
90 | "superwoman/superplugin": "^1.0"
91 | },
92 | "extra": {
93 | "kirby-plugin-path": "site/plugins" // change this to your custom path
94 | }
95 | }
96 | ```
97 |
98 | ## License
99 |
100 |
101 |
102 | ## Author
103 |
104 | Lukas Bestle
105 |
--------------------------------------------------------------------------------
/vendor/getkirby/composer-installer/src/ComposerInstaller/Installer.php:
--------------------------------------------------------------------------------
1 |
14 | * @link https://getkirby.com
15 | * @copyright Bastian Allgeier GmbH
16 | * @license https://opensource.org/licenses/MIT
17 | */
18 | class Installer extends LibraryInstaller
19 | {
20 | /**
21 | * Decides if the installer supports the given type
22 | *
23 | * @param string $packageType
24 | * @return bool
25 | */
26 | public function supports($packageType): bool
27 | {
28 | throw new RuntimeException('This method needs to be overridden.'); // @codeCoverageIgnore
29 | }
30 |
31 | /**
32 | * Installs a specific package
33 | *
34 | * @param \Composer\Repository\InstalledRepositoryInterface $repo Repository in which to check
35 | * @param \Composer\Package\PackageInterface $package Package instance to install
36 | * @return \React\Promise\PromiseInterface|null
37 | */
38 | public function install(InstalledRepositoryInterface $repo, PackageInterface $package)
39 | {
40 | // first install the package normally...
41 | $promise = parent::install($repo, $package);
42 |
43 | // ...then run custom code
44 | $postInstall = function () use ($package): void {
45 | $this->postInstall($package);
46 | };
47 |
48 | // Composer 2 in async mode
49 | if ($promise instanceof PromiseInterface) {
50 | return $promise->then($postInstall);
51 | }
52 |
53 | // Composer 1 or Composer 2 without async
54 | $postInstall();
55 | }
56 |
57 | /**
58 | * Updates a specific package
59 | *
60 | * @param \Composer\Repository\InstalledRepositoryInterface $repo Repository in which to check
61 | * @param \Composer\Package\PackageInterface $initial Already installed package version
62 | * @param \Composer\Package\PackageInterface $target Updated version
63 | * @return \React\Promise\PromiseInterface|null
64 | *
65 | * @throws \InvalidArgumentException if $initial package is not installed
66 | */
67 | public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target)
68 | {
69 | // first update the package normally...
70 | $promise = parent::update($repo, $initial, $target);
71 |
72 | // ...then run custom code
73 | $postInstall = function () use ($target): void {
74 | $this->postInstall($target);
75 | };
76 |
77 | // Composer 2 in async mode
78 | if ($promise instanceof PromiseInterface) {
79 | return $promise->then($postInstall);
80 | }
81 |
82 | // Composer 1 or Composer 2 without async
83 | $postInstall();
84 | }
85 |
86 | /**
87 | * Custom handler that will be called after each package
88 | * installation or update
89 | *
90 | * @param \Composer\Package\PackageInterface $package
91 | * @return void
92 | */
93 | protected function postInstall(PackageInterface $package)
94 | {
95 | // remove the package's `vendor` directory to avoid duplicated autoloader and vendor code
96 | $packageVendorDir = $this->getInstallPath($package) . '/vendor';
97 | if (is_dir($packageVendorDir) === true) {
98 | $success = $this->filesystem->removeDirectory($packageVendorDir);
99 |
100 | if ($success !== true) {
101 | throw new RuntimeException('Could not completely delete ' . $packageVendorDir . ', aborting.'); // @codeCoverageIgnore
102 | }
103 | }
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/vendor/getkirby/composer-installer/src/ComposerInstaller/PluginInstaller.php:
--------------------------------------------------------------------------------
1 |
11 | * @link https://getkirby.com
12 | * @copyright Bastian Allgeier GmbH
13 | * @license https://opensource.org/licenses/MIT
14 | */
15 | class PluginInstaller extends Installer
16 | {
17 | /**
18 | * Decides if the installer supports the given type
19 | *
20 | * @param string $packageType
21 | * @return bool
22 | */
23 | public function supports($packageType): bool
24 | {
25 | return $packageType === 'kirby-plugin';
26 | }
27 |
28 | /**
29 | * Returns the installation path of a package
30 | *
31 | * @param \Composer\Package\PackageInterface $package
32 | * @return string path
33 | */
34 | public function getInstallPath(PackageInterface $package): string
35 | {
36 | // place into `vendor` directory as usual if Pluginkit is not supported
37 | if ($this->supportsPluginkit($package) !== true) {
38 | return parent::getInstallPath($package);
39 | }
40 |
41 | // get the extra configuration of the top-level package
42 | if ($rootPackage = $this->composer->getPackage()) {
43 | $extra = $rootPackage->getExtra();
44 | } else {
45 | $extra = [];
46 | }
47 |
48 | // use base path from configuration, otherwise fall back to default
49 | $basePath = $extra['kirby-plugin-path'] ?? 'site/plugins';
50 |
51 | if (is_string($basePath) !== true) {
52 | throw new InvalidArgumentException('Invalid "kirby-plugin-path" option');
53 | }
54 |
55 | // determine the plugin name from its package name;
56 | // can be overridden in the plugin's `composer.json`
57 | $prettyName = $package->getPrettyName();
58 | $pluginExtra = $package->getExtra();
59 | if (empty($pluginExtra['installer-name']) === false) {
60 | $name = $pluginExtra['installer-name'];
61 |
62 | if (is_string($name) !== true) {
63 | throw new InvalidArgumentException('Invalid "installer-name" option in plugin ' . $prettyName);
64 | }
65 | } elseif (strpos($prettyName, '/') !== false) {
66 | // use name after the slash
67 | $name = explode('/', $prettyName)[1];
68 | } else {
69 | $name = $prettyName;
70 | }
71 |
72 | // build destination path from base path and plugin name
73 | return $basePath . '/' . $name;
74 | }
75 |
76 | /**
77 | * Custom handler that will be called after each package
78 | * installation or update
79 | *
80 | * @param \Composer\Package\PackageInterface $package
81 | * @return void
82 | */
83 | protected function postInstall(PackageInterface $package): void
84 | {
85 | // only continue if Pluginkit is supported
86 | if ($this->supportsPluginkit($package) !== true) {
87 | return;
88 | }
89 |
90 | parent::postInstall($package);
91 | }
92 |
93 | /**
94 | * Checks if the package has explicitly required this installer;
95 | * otherwise (if the Pluginkit is not yet supported by the plugin)
96 | * the installer will fall back to the behavior of the LibraryInstaller
97 | *
98 | * @param \Composer\Package\PackageInterface $package
99 | * @return bool
100 | */
101 | protected function supportsPluginkit(PackageInterface $package): bool
102 | {
103 | foreach ($package->getRequires() as $link) {
104 | if ($link->getTarget() === 'getkirby/composer-installer') {
105 | return true;
106 | }
107 | }
108 |
109 | // no required package is the installer
110 | return false;
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/index.php:
--------------------------------------------------------------------------------
1 |
9 | * @copyright James Steel
10 | * @link https://github.com/HashandSalt/kirby3-snipcart
11 | * @license MIT
12 | */
13 |
14 | @include_once __DIR__ . '/vendor/autoload.php';
15 |
16 | Kirby::plugin('hashandsalt/kirby-snipcart', [
17 |
18 |
19 | // Options
20 | 'options' => [
21 |
22 | // MODE (live|test)
23 | 'snipcartlive' => false,
24 |
25 | // API KEYS
26 | 'apikeytest' => option('hashandsalt.kirby-snipcart.apikeytest'), // Snipcart Test API Key (Front end)
27 | 'apikeylive' => option('hashandsalt.kirby-snipcart.apikeylive'), // Snipcart Live API Key (Front end)
28 |
29 | // SECRET KEYS
30 | 'apisecrettest' => option('hashandsalt.kirby-snipcart.apisecretkeytest'), // Snipcart Test API Key (For Panel Dashboard)
31 | 'apisecretlive' => option('hashandsalt.kirby-snipcart.apisecretkeylive'), // Snipcart Test API Key (For Panel Dashboard)
32 |
33 |
34 |
35 | ],
36 |
37 |
38 |
39 | // Blueprints
40 | 'blueprints' => [
41 |
42 | // Init
43 | 'cart/product' => __DIR__ . '/blueprints/cart/product.yml',
44 |
45 | ],
46 |
47 |
48 | // Snippets
49 | 'snippets' => [
50 |
51 | // Cart
52 | 'cart/init' => __DIR__ . '/snippets/snipcart/cart/cart-init.php',
53 | 'cart/checkoutsummary' => __DIR__ . '/snippets/snipcart/cart/cart-checkout-summary.php',
54 |
55 | // Products
56 | 'product/add' => __DIR__ . '/snippets/snipcart/products/product-add-to-cart.php',
57 | 'product/list' => __DIR__ . '/snippets/snipcart/products/product-list.php',
58 |
59 | ],
60 |
61 |
62 |
63 |
64 | // Fields
65 | 'fields' => [
66 | 'productTotal' => [
67 | 'props' => [
68 | 'help' => function ($help = null) {
69 | return I18n::translate($help, $help);
70 | }
71 | ]
72 | ],
73 | ],
74 |
75 |
76 | 'areas' => [
77 | 'snipcart' => function ($kirby) {
78 | return [
79 | 'label' => 'Snipcart',
80 | 'icon' => 'cart',
81 | 'menu' => true,
82 | 'link' => 'snipcartdash',
83 | 'views' => [
84 | [
85 | // the Panel patterns must not start with 'panel/',
86 | // the `panel` slug is automatically prepended.
87 | 'pattern' => 'snipcartdash',
88 | 'action' => function () {
89 |
90 |
91 | return [
92 | // the Vue component can be defined in the
93 | // `index.js` of your plugin
94 | 'component' => 'dash',
95 |
96 | // the document title for the current view
97 | 'title' => 'Snipcart',
98 |
99 |
100 | ];
101 | }
102 | ]
103 | ]
104 | ];
105 | }
106 | ],
107 |
108 | // API Route
109 | 'api' => [
110 | 'routes' => [
111 |
112 | [
113 | 'pattern' => 'snipcart/(:all)',
114 | 'action' => function ($param) {
115 | $apisecretkey = option('hashandsalt.kirby-snipcart.snipcartlive') === true ? option('hashandsalt.kirby-snipcart.apisecretlive') : option('hashandsalt.kirby-snipcart.apisecrettest');
116 | $snipcart = [];
117 |
118 | if ($limit = get('limit')) {
119 | $limit = '?limit='.get('limit');
120 | }
121 |
122 | $request = Remote::get('https://app.snipcart.com/api/'.$param.$limit, [
123 | 'headers' => [
124 | 'Accept:' . 'application/json',
125 | 'Authorization: Basic ' . base64_encode($apisecretkey . ':')
126 | ]
127 | ]);
128 | if ($request->code() === 200) {
129 | $snipcart = $request->json();
130 | }
131 | return $snipcart;
132 | }
133 | ]
134 | ]
135 | ]
136 |
137 |
138 |
139 | ]);
140 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | (function(){"use strict";const l={props:{initialTab:String,tabs:Array},data(){return{activeTab:this.initialTab}},computed:{tabPanelSlotName(){return`tab-panel-${this.activeTab}`}},methods:{tabHeadSlotName(a){return`tab-head-${a}`},switchTab(a){this.activeTab=a}}};function r(a,e,t,s,n,o,c,rt){var i=typeof a=="function"?a.options:a;return e&&(i.render=e,i.staticRenderFns=t,i._compiled=!0),{exports:a,options:i}}var d=function(){var e=this,t=e._self._c;return t("div",{staticClass:"card"},[t("header",{staticClass:"card-header"},[t("ul",{staticClass:"tab-heads"},e._l(e.tabs,function(s){return t("li",{key:s,staticClass:"tab-head",class:{"tab-head--active":e.activeTab===s},on:{click:function(n){return e.switchTab(s)}}},[e._t(e.tabHeadSlotName(s),function(){return[e._v(e._s(s)+" ")]})],2)}),0)]),t("main",{staticClass:"card-body"},[t("div",{staticClass:"tab-panel"},[e._t(e.tabPanelSlotName)],2)])])},_=[],u=r(l,d,_);const p=u.exports,m={data(){return{abandoned:null}},computed:{abandonedCount(){return this.abandoned?this.abandoned.length:"Loading..."}},async created(){let a=await this.$api.get("snipcart/carts/abandoned");this.abandoned=a.items}};var v=function(){var e=this,t=e._self._c;return t("div",{staticClass:"k-snipcart-vital"},[t("h3",[e._v("Abandonded Carts")]),t("span",[e._v(e._s(e.abandonedCount))])])},h=[],f=r(m,v,h);const b=f.exports,$={data(){return{totalSales:null}},computed:{salesCount(){return this.totalSales?this.totalSales:"Loading..."}},async created(){let e=(await this.$api.get("snipcart/orders")).items.reduce((t,s)=>t+s.finalGrandTotal,0).toFixed(2);this.totalSales=e}};var g=function(){var e=this,t=e._self._c;return t("div",{staticClass:"k-snipcart-vital"},[t("h3",[e._v("Total Sales")]),t("span",[e._v(e._s(e.salesCount))])])},y=[],C=r($,g,y);const S=C.exports,T={name:"popularItem",data(){return{popularItem:void 0,errors:[]}},computed:{popularCount(){return this.popularItem?this.popularItem:"Loading..."}},async created(){try{let t=(await this.$api.get("snipcart/orders",{pretty:!0})).items.reduce((n,o)=>n.concat(o.items),[]).map(({name:n})=>n).reduce((n,o)=>{const c=n[o]||0;return n[o]=c+1,n},{}),s=Object.keys(t).reduce((n,o)=>t[n]>t[o]?n:o);this.popularItem=s}catch(a){this.errors.push(a)}}};var x=function(){var e=this,t=e._self._c;return t("div",{staticClass:"k-snipcart-vital"},[t("h3",[e._v("Most Popular")]),t("span",[e._v(e._s(e.popularCount))])])},k=[],w=r(T,x,k);const D=w.exports,F={props:{name:String,columns:Object,options:Array,rows:{type:Array,default(){return[]}},empty:String},data(){return{tablecolumns:{invoiceNumber:{label:"Code",type:"text"},date:{label:"Date",type:"text"},status:{label:"Status",type:"text"},total:{label:"Total",type:"text"},shippingAddressCountry:{label:"Ship to",type:"text"}},orders:[]}},async created(){let e=(await this.$api.get("snipcart/orders?limit=500")).items.map(function(t){let s=new Date(Date.parse(t.completionDate)),n=("0"+s.getDate()).slice(-2)+"/"+("0"+(s.getMonth()+1)).slice(-2)+"/"+s.getFullYear();return{invoiceNumber:t.invoiceNumber,date:n,status:t.status,total:t.finalGrandTotal,shippingAddressCountry:t.shippingAddressCountry}});this.orders=e}};var I=function(){var e=this,t=e._self._c;return t("div",[e.orders.length?t("k-table",{attrs:{columns:e.tablecolumns,rows:e.orders}}):e._e()],1)},R=[],A=r(F,I,R);const N=A.exports,O={name:"Vitals",components:{abandoned:b,salestotal:S,popular:D,orders:N}};var P=function(){var e=this,t=e._self._c;return t("k-grid",{staticClass:"k-snipcart-vitals",attrs:{gutter:"medium",variant:"columns"}},[t("k-column",{attrs:{width:"1/3"}},[t("salestotal")],1),t("k-column",{attrs:{width:"1/3"}},[t("popular")],1),t("k-column",{attrs:{width:"1/3"}},[t("abandoned")],1),t("k-column",{attrs:{width:"1/1"}},[t("orders")],1)],1)},j=[],L=r(O,P,j);const M=L.exports,B={props:{name:String,columns:Object,options:Array,rows:{type:Array,default(){return[]}},empty:String},data(){return{tablecolumns:{discname:{label:"Name",type:"text"},code:{label:"Code",type:"text"},expires:{label:"Expires",type:"text"},uses:{label:"Uses",type:"text"}},discounts:[]}},async created(){let e=(await this.$api.get("snipcart/discounts")).map(function(t){let s=new Date(Date.parse(t.expires)),n=("0"+s.getDate()).slice(-2)+"/"+("0"+(s.getMonth()+1)).slice(-2)+"/"+s.getFullYear();return{discname:t.discname,code:t.code,uses:t.numberOfUsages,expires:n}});this.discounts=e}};var G=function(){var e=this,t=e._self._c;return t("div",[e.discounts.length?t("k-table",{attrs:{columns:e.tablecolumns,rows:e.discounts}}):e._e()],1)},H=[],U=r(B,G,H);const V={name:"Discounts",components:{discounts:U.exports}};var Y=function(){var e=this,t=e._self._c;return t("div",[t("k-grid",{staticClass:"k-snipcart-vitals",attrs:{gutter:"medium"}},[t("k-column",{attrs:{width:"1/1"}},[t("discounts")],1)],1)],1)},q=[],z=r(V,Y,q);const J=z.exports,K={name:"Dashboard",components:{vitals:M,discounts:J,TabCard:p},data(){return{initialTab:"dashboard",tabs:["dashboard","discounts"]}}};var Q=function(){var e=this,t=e._self._c;return t("k-panel-inside",[t("TabCard",{attrs:{tabs:e.tabs,initialTab:e.initialTab}},[t("template",{slot:"tab-head-dashboard"},[e._v(" Dashboard ")]),t("template",{slot:"tab-panel-dashboard"},[t("vitals")],1),t("template",{slot:"tab-head-discounts"},[e._v(" Discounts ")]),t("template",{slot:"tab-panel-discounts"},[t("discounts")],1)],2)],1)},W=[],X=r(K,Q,W);const Z=X.exports,E={props:{label:String,value:String,disabled:Boolean,required:Boolean,value:String},data(){return{totalSales:null,productID:this.$store.getters["content/values"]().productid}},computed:{salesCount(){return this.totalSales?this.totalSales:"Loading..."}},async created(){let a=await this.$api.get("snipcart/products/"+this.productID);a===void 0||a.length==0?this.totalSales=0:this.totalSales=a.statistics.totalSales.toFixed(2)}};var tt=function(){var e=this,t=e._self._c;return t("div",{staticClass:"k-snipcart-product-total"},[t("div",{staticClass:"k-snipcart-vital"},[t("h3",[e._v("Total Sales")]),t("span",[e._v(e._s(e.salesCount))])])])},et=[],at=r(E,tt,et);const st=at.exports;panel.plugin("hashandsalt/snipcart",{components:{dash:Z},fields:{productTotal:st}})})();
2 |
--------------------------------------------------------------------------------
/vendor/composer/InstalledVersions.php:
--------------------------------------------------------------------------------
1 |
7 | * Jordi Boggiano
8 | *
9 | * For the full copyright and license information, please view the LICENSE
10 | * file that was distributed with this source code.
11 | */
12 |
13 | namespace Composer;
14 |
15 | use Composer\Autoload\ClassLoader;
16 | use Composer\Semver\VersionParser;
17 |
18 | /**
19 | * This class is copied in every Composer installed project and available to all
20 | *
21 | * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
22 | *
23 | * To require its presence, you can require `composer-runtime-api ^2.0`
24 | *
25 | * @final
26 | */
27 | class InstalledVersions
28 | {
29 | /**
30 | * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
31 | * @internal
32 | */
33 | private static $selfDir = null;
34 |
35 | /**
36 | * @var mixed[]|null
37 | * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null
38 | */
39 | private static $installed;
40 |
41 | /**
42 | * @var bool
43 | */
44 | private static $installedIsLocalDir;
45 |
46 | /**
47 | * @var bool|null
48 | */
49 | private static $canGetVendors;
50 |
51 | /**
52 | * @var array[]
53 | * @psalm-var array}>
54 | */
55 | private static $installedByVendor = array();
56 |
57 | /**
58 | * Returns a list of all package names which are present, either by being installed, replaced or provided
59 | *
60 | * @return string[]
61 | * @psalm-return list
62 | */
63 | public static function getInstalledPackages()
64 | {
65 | $packages = array();
66 | foreach (self::getInstalled() as $installed) {
67 | $packages[] = array_keys($installed['versions']);
68 | }
69 |
70 | if (1 === \count($packages)) {
71 | return $packages[0];
72 | }
73 |
74 | return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
75 | }
76 |
77 | /**
78 | * Returns a list of all package names with a specific type e.g. 'library'
79 | *
80 | * @param string $type
81 | * @return string[]
82 | * @psalm-return list
83 | */
84 | public static function getInstalledPackagesByType($type)
85 | {
86 | $packagesByType = array();
87 |
88 | foreach (self::getInstalled() as $installed) {
89 | foreach ($installed['versions'] as $name => $package) {
90 | if (isset($package['type']) && $package['type'] === $type) {
91 | $packagesByType[] = $name;
92 | }
93 | }
94 | }
95 |
96 | return $packagesByType;
97 | }
98 |
99 | /**
100 | * Checks whether the given package is installed
101 | *
102 | * This also returns true if the package name is provided or replaced by another package
103 | *
104 | * @param string $packageName
105 | * @param bool $includeDevRequirements
106 | * @return bool
107 | */
108 | public static function isInstalled($packageName, $includeDevRequirements = true)
109 | {
110 | foreach (self::getInstalled() as $installed) {
111 | if (isset($installed['versions'][$packageName])) {
112 | return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
113 | }
114 | }
115 |
116 | return false;
117 | }
118 |
119 | /**
120 | * Checks whether the given package satisfies a version constraint
121 | *
122 | * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
123 | *
124 | * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
125 | *
126 | * @param VersionParser $parser Install composer/semver to have access to this class and functionality
127 | * @param string $packageName
128 | * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
129 | * @return bool
130 | */
131 | public static function satisfies(VersionParser $parser, $packageName, $constraint)
132 | {
133 | $constraint = $parser->parseConstraints((string) $constraint);
134 | $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
135 |
136 | return $provided->matches($constraint);
137 | }
138 |
139 | /**
140 | * Returns a version constraint representing all the range(s) which are installed for a given package
141 | *
142 | * It is easier to use this via isInstalled() with the $constraint argument if you need to check
143 | * whether a given version of a package is installed, and not just whether it exists
144 | *
145 | * @param string $packageName
146 | * @return string Version constraint usable with composer/semver
147 | */
148 | public static function getVersionRanges($packageName)
149 | {
150 | foreach (self::getInstalled() as $installed) {
151 | if (!isset($installed['versions'][$packageName])) {
152 | continue;
153 | }
154 |
155 | $ranges = array();
156 | if (isset($installed['versions'][$packageName]['pretty_version'])) {
157 | $ranges[] = $installed['versions'][$packageName]['pretty_version'];
158 | }
159 | if (array_key_exists('aliases', $installed['versions'][$packageName])) {
160 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
161 | }
162 | if (array_key_exists('replaced', $installed['versions'][$packageName])) {
163 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
164 | }
165 | if (array_key_exists('provided', $installed['versions'][$packageName])) {
166 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
167 | }
168 |
169 | return implode(' || ', $ranges);
170 | }
171 |
172 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
173 | }
174 |
175 | /**
176 | * @param string $packageName
177 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
178 | */
179 | public static function getVersion($packageName)
180 | {
181 | foreach (self::getInstalled() as $installed) {
182 | if (!isset($installed['versions'][$packageName])) {
183 | continue;
184 | }
185 |
186 | if (!isset($installed['versions'][$packageName]['version'])) {
187 | return null;
188 | }
189 |
190 | return $installed['versions'][$packageName]['version'];
191 | }
192 |
193 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
194 | }
195 |
196 | /**
197 | * @param string $packageName
198 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
199 | */
200 | public static function getPrettyVersion($packageName)
201 | {
202 | foreach (self::getInstalled() as $installed) {
203 | if (!isset($installed['versions'][$packageName])) {
204 | continue;
205 | }
206 |
207 | if (!isset($installed['versions'][$packageName]['pretty_version'])) {
208 | return null;
209 | }
210 |
211 | return $installed['versions'][$packageName]['pretty_version'];
212 | }
213 |
214 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
215 | }
216 |
217 | /**
218 | * @param string $packageName
219 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
220 | */
221 | public static function getReference($packageName)
222 | {
223 | foreach (self::getInstalled() as $installed) {
224 | if (!isset($installed['versions'][$packageName])) {
225 | continue;
226 | }
227 |
228 | if (!isset($installed['versions'][$packageName]['reference'])) {
229 | return null;
230 | }
231 |
232 | return $installed['versions'][$packageName]['reference'];
233 | }
234 |
235 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
236 | }
237 |
238 | /**
239 | * @param string $packageName
240 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
241 | */
242 | public static function getInstallPath($packageName)
243 | {
244 | foreach (self::getInstalled() as $installed) {
245 | if (!isset($installed['versions'][$packageName])) {
246 | continue;
247 | }
248 |
249 | return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
250 | }
251 |
252 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
253 | }
254 |
255 | /**
256 | * @return array
257 | * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
258 | */
259 | public static function getRootPackage()
260 | {
261 | $installed = self::getInstalled();
262 |
263 | return $installed[0]['root'];
264 | }
265 |
266 | /**
267 | * Returns the raw installed.php data for custom implementations
268 | *
269 | * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
270 | * @return array[]
271 | * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}
272 | */
273 | public static function getRawData()
274 | {
275 | @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
276 |
277 | if (null === self::$installed) {
278 | // only require the installed.php file if this file is loaded from its dumped location,
279 | // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
280 | if (substr(__DIR__, -8, 1) !== 'C') {
281 | self::$installed = include __DIR__ . '/installed.php';
282 | } else {
283 | self::$installed = array();
284 | }
285 | }
286 |
287 | return self::$installed;
288 | }
289 |
290 | /**
291 | * Returns the raw data of all installed.php which are currently loaded for custom implementations
292 | *
293 | * @return array[]
294 | * @psalm-return list}>
295 | */
296 | public static function getAllRawData()
297 | {
298 | return self::getInstalled();
299 | }
300 |
301 | /**
302 | * Lets you reload the static array from another file
303 | *
304 | * This is only useful for complex integrations in which a project needs to use
305 | * this class but then also needs to execute another project's autoloader in process,
306 | * and wants to ensure both projects have access to their version of installed.php.
307 | *
308 | * A typical case would be PHPUnit, where it would need to make sure it reads all
309 | * the data it needs from this class, then call reload() with
310 | * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
311 | * the project in which it runs can then also use this class safely, without
312 | * interference between PHPUnit's dependencies and the project's dependencies.
313 | *
314 | * @param array[] $data A vendor/composer/installed.php data set
315 | * @return void
316 | *
317 | * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data
318 | */
319 | public static function reload($data)
320 | {
321 | self::$installed = $data;
322 | self::$installedByVendor = array();
323 |
324 | // when using reload, we disable the duplicate protection to ensure that self::$installed data is
325 | // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
326 | // so we have to assume it does not, and that may result in duplicate data being returned when listing
327 | // all installed packages for example
328 | self::$installedIsLocalDir = false;
329 | }
330 |
331 | /**
332 | * @return string
333 | */
334 | private static function getSelfDir()
335 | {
336 | if (self::$selfDir === null) {
337 | self::$selfDir = strtr(__DIR__, '\\', '/');
338 | }
339 |
340 | return self::$selfDir;
341 | }
342 |
343 | /**
344 | * @return array[]
345 | * @psalm-return list}>
346 | */
347 | private static function getInstalled()
348 | {
349 | if (null === self::$canGetVendors) {
350 | self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
351 | }
352 |
353 | $installed = array();
354 | $copiedLocalDir = false;
355 |
356 | if (self::$canGetVendors) {
357 | $selfDir = self::getSelfDir();
358 | foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
359 | $vendorDir = strtr($vendorDir, '\\', '/');
360 | if (isset(self::$installedByVendor[$vendorDir])) {
361 | $installed[] = self::$installedByVendor[$vendorDir];
362 | } elseif (is_file($vendorDir.'/composer/installed.php')) {
363 | /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */
364 | $required = require $vendorDir.'/composer/installed.php';
365 | self::$installedByVendor[$vendorDir] = $required;
366 | $installed[] = $required;
367 | if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
368 | self::$installed = $required;
369 | self::$installedIsLocalDir = true;
370 | }
371 | }
372 | if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
373 | $copiedLocalDir = true;
374 | }
375 | }
376 | }
377 |
378 | if (null === self::$installed) {
379 | // only require the installed.php file if this file is loaded from its dumped location,
380 | // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
381 | if (substr(__DIR__, -8, 1) !== 'C') {
382 | /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */
383 | $required = require __DIR__ . '/installed.php';
384 | self::$installed = $required;
385 | } else {
386 | self::$installed = array();
387 | }
388 | }
389 |
390 | if (self::$installed !== array() && !$copiedLocalDir) {
391 | $installed[] = self::$installed;
392 | }
393 |
394 | return $installed;
395 | }
396 | }
397 |
--------------------------------------------------------------------------------
/vendor/composer/ClassLoader.php:
--------------------------------------------------------------------------------
1 |
7 | * Jordi Boggiano
8 | *
9 | * For the full copyright and license information, please view the LICENSE
10 | * file that was distributed with this source code.
11 | */
12 |
13 | namespace Composer\Autoload;
14 |
15 | /**
16 | * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17 | *
18 | * $loader = new \Composer\Autoload\ClassLoader();
19 | *
20 | * // register classes with namespaces
21 | * $loader->add('Symfony\Component', __DIR__.'/component');
22 | * $loader->add('Symfony', __DIR__.'/framework');
23 | *
24 | * // activate the autoloader
25 | * $loader->register();
26 | *
27 | * // to enable searching the include path (eg. for PEAR packages)
28 | * $loader->setUseIncludePath(true);
29 | *
30 | * In this example, if you try to use a class in the Symfony\Component
31 | * namespace or one of its children (Symfony\Component\Console for instance),
32 | * the autoloader will first look for the class under the component/
33 | * directory, and it will then fallback to the framework/ directory if not
34 | * found before giving up.
35 | *
36 | * This class is loosely based on the Symfony UniversalClassLoader.
37 | *
38 | * @author Fabien Potencier
39 | * @author Jordi Boggiano
40 | * @see https://www.php-fig.org/psr/psr-0/
41 | * @see https://www.php-fig.org/psr/psr-4/
42 | */
43 | class ClassLoader
44 | {
45 | /** @var \Closure(string):void */
46 | private static $includeFile;
47 |
48 | /** @var string|null */
49 | private $vendorDir;
50 |
51 | // PSR-4
52 | /**
53 | * @var array>
54 | */
55 | private $prefixLengthsPsr4 = array();
56 | /**
57 | * @var array>
58 | */
59 | private $prefixDirsPsr4 = array();
60 | /**
61 | * @var list
62 | */
63 | private $fallbackDirsPsr4 = array();
64 |
65 | // PSR-0
66 | /**
67 | * List of PSR-0 prefixes
68 | *
69 | * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
70 | *
71 | * @var array>>
72 | */
73 | private $prefixesPsr0 = array();
74 | /**
75 | * @var list
76 | */
77 | private $fallbackDirsPsr0 = array();
78 |
79 | /** @var bool */
80 | private $useIncludePath = false;
81 |
82 | /**
83 | * @var array
84 | */
85 | private $classMap = array();
86 |
87 | /** @var bool */
88 | private $classMapAuthoritative = false;
89 |
90 | /**
91 | * @var array
92 | */
93 | private $missingClasses = array();
94 |
95 | /** @var string|null */
96 | private $apcuPrefix;
97 |
98 | /**
99 | * @var array
100 | */
101 | private static $registeredLoaders = array();
102 |
103 | /**
104 | * @param string|null $vendorDir
105 | */
106 | public function __construct($vendorDir = null)
107 | {
108 | $this->vendorDir = $vendorDir;
109 | self::initializeIncludeClosure();
110 | }
111 |
112 | /**
113 | * @return array>
114 | */
115 | public function getPrefixes()
116 | {
117 | if (!empty($this->prefixesPsr0)) {
118 | return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
119 | }
120 |
121 | return array();
122 | }
123 |
124 | /**
125 | * @return array>
126 | */
127 | public function getPrefixesPsr4()
128 | {
129 | return $this->prefixDirsPsr4;
130 | }
131 |
132 | /**
133 | * @return list
134 | */
135 | public function getFallbackDirs()
136 | {
137 | return $this->fallbackDirsPsr0;
138 | }
139 |
140 | /**
141 | * @return list
142 | */
143 | public function getFallbackDirsPsr4()
144 | {
145 | return $this->fallbackDirsPsr4;
146 | }
147 |
148 | /**
149 | * @return array Array of classname => path
150 | */
151 | public function getClassMap()
152 | {
153 | return $this->classMap;
154 | }
155 |
156 | /**
157 | * @param array $classMap Class to filename map
158 | *
159 | * @return void
160 | */
161 | public function addClassMap(array $classMap)
162 | {
163 | if ($this->classMap) {
164 | $this->classMap = array_merge($this->classMap, $classMap);
165 | } else {
166 | $this->classMap = $classMap;
167 | }
168 | }
169 |
170 | /**
171 | * Registers a set of PSR-0 directories for a given prefix, either
172 | * appending or prepending to the ones previously set for this prefix.
173 | *
174 | * @param string $prefix The prefix
175 | * @param list|string $paths The PSR-0 root directories
176 | * @param bool $prepend Whether to prepend the directories
177 | *
178 | * @return void
179 | */
180 | public function add($prefix, $paths, $prepend = false)
181 | {
182 | $paths = (array) $paths;
183 | if (!$prefix) {
184 | if ($prepend) {
185 | $this->fallbackDirsPsr0 = array_merge(
186 | $paths,
187 | $this->fallbackDirsPsr0
188 | );
189 | } else {
190 | $this->fallbackDirsPsr0 = array_merge(
191 | $this->fallbackDirsPsr0,
192 | $paths
193 | );
194 | }
195 |
196 | return;
197 | }
198 |
199 | $first = $prefix[0];
200 | if (!isset($this->prefixesPsr0[$first][$prefix])) {
201 | $this->prefixesPsr0[$first][$prefix] = $paths;
202 |
203 | return;
204 | }
205 | if ($prepend) {
206 | $this->prefixesPsr0[$first][$prefix] = array_merge(
207 | $paths,
208 | $this->prefixesPsr0[$first][$prefix]
209 | );
210 | } else {
211 | $this->prefixesPsr0[$first][$prefix] = array_merge(
212 | $this->prefixesPsr0[$first][$prefix],
213 | $paths
214 | );
215 | }
216 | }
217 |
218 | /**
219 | * Registers a set of PSR-4 directories for a given namespace, either
220 | * appending or prepending to the ones previously set for this namespace.
221 | *
222 | * @param string $prefix The prefix/namespace, with trailing '\\'
223 | * @param list|string $paths The PSR-4 base directories
224 | * @param bool $prepend Whether to prepend the directories
225 | *
226 | * @throws \InvalidArgumentException
227 | *
228 | * @return void
229 | */
230 | public function addPsr4($prefix, $paths, $prepend = false)
231 | {
232 | $paths = (array) $paths;
233 | if (!$prefix) {
234 | // Register directories for the root namespace.
235 | if ($prepend) {
236 | $this->fallbackDirsPsr4 = array_merge(
237 | $paths,
238 | $this->fallbackDirsPsr4
239 | );
240 | } else {
241 | $this->fallbackDirsPsr4 = array_merge(
242 | $this->fallbackDirsPsr4,
243 | $paths
244 | );
245 | }
246 | } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
247 | // Register directories for a new namespace.
248 | $length = strlen($prefix);
249 | if ('\\' !== $prefix[$length - 1]) {
250 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
251 | }
252 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
253 | $this->prefixDirsPsr4[$prefix] = $paths;
254 | } elseif ($prepend) {
255 | // Prepend directories for an already registered namespace.
256 | $this->prefixDirsPsr4[$prefix] = array_merge(
257 | $paths,
258 | $this->prefixDirsPsr4[$prefix]
259 | );
260 | } else {
261 | // Append directories for an already registered namespace.
262 | $this->prefixDirsPsr4[$prefix] = array_merge(
263 | $this->prefixDirsPsr4[$prefix],
264 | $paths
265 | );
266 | }
267 | }
268 |
269 | /**
270 | * Registers a set of PSR-0 directories for a given prefix,
271 | * replacing any others previously set for this prefix.
272 | *
273 | * @param string $prefix The prefix
274 | * @param list|string $paths The PSR-0 base directories
275 | *
276 | * @return void
277 | */
278 | public function set($prefix, $paths)
279 | {
280 | if (!$prefix) {
281 | $this->fallbackDirsPsr0 = (array) $paths;
282 | } else {
283 | $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
284 | }
285 | }
286 |
287 | /**
288 | * Registers a set of PSR-4 directories for a given namespace,
289 | * replacing any others previously set for this namespace.
290 | *
291 | * @param string $prefix The prefix/namespace, with trailing '\\'
292 | * @param list|string $paths The PSR-4 base directories
293 | *
294 | * @throws \InvalidArgumentException
295 | *
296 | * @return void
297 | */
298 | public function setPsr4($prefix, $paths)
299 | {
300 | if (!$prefix) {
301 | $this->fallbackDirsPsr4 = (array) $paths;
302 | } else {
303 | $length = strlen($prefix);
304 | if ('\\' !== $prefix[$length - 1]) {
305 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
306 | }
307 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
308 | $this->prefixDirsPsr4[$prefix] = (array) $paths;
309 | }
310 | }
311 |
312 | /**
313 | * Turns on searching the include path for class files.
314 | *
315 | * @param bool $useIncludePath
316 | *
317 | * @return void
318 | */
319 | public function setUseIncludePath($useIncludePath)
320 | {
321 | $this->useIncludePath = $useIncludePath;
322 | }
323 |
324 | /**
325 | * Can be used to check if the autoloader uses the include path to check
326 | * for classes.
327 | *
328 | * @return bool
329 | */
330 | public function getUseIncludePath()
331 | {
332 | return $this->useIncludePath;
333 | }
334 |
335 | /**
336 | * Turns off searching the prefix and fallback directories for classes
337 | * that have not been registered with the class map.
338 | *
339 | * @param bool $classMapAuthoritative
340 | *
341 | * @return void
342 | */
343 | public function setClassMapAuthoritative($classMapAuthoritative)
344 | {
345 | $this->classMapAuthoritative = $classMapAuthoritative;
346 | }
347 |
348 | /**
349 | * Should class lookup fail if not found in the current class map?
350 | *
351 | * @return bool
352 | */
353 | public function isClassMapAuthoritative()
354 | {
355 | return $this->classMapAuthoritative;
356 | }
357 |
358 | /**
359 | * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
360 | *
361 | * @param string|null $apcuPrefix
362 | *
363 | * @return void
364 | */
365 | public function setApcuPrefix($apcuPrefix)
366 | {
367 | $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
368 | }
369 |
370 | /**
371 | * The APCu prefix in use, or null if APCu caching is not enabled.
372 | *
373 | * @return string|null
374 | */
375 | public function getApcuPrefix()
376 | {
377 | return $this->apcuPrefix;
378 | }
379 |
380 | /**
381 | * Registers this instance as an autoloader.
382 | *
383 | * @param bool $prepend Whether to prepend the autoloader or not
384 | *
385 | * @return void
386 | */
387 | public function register($prepend = false)
388 | {
389 | spl_autoload_register(array($this, 'loadClass'), true, $prepend);
390 |
391 | if (null === $this->vendorDir) {
392 | return;
393 | }
394 |
395 | if ($prepend) {
396 | self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
397 | } else {
398 | unset(self::$registeredLoaders[$this->vendorDir]);
399 | self::$registeredLoaders[$this->vendorDir] = $this;
400 | }
401 | }
402 |
403 | /**
404 | * Unregisters this instance as an autoloader.
405 | *
406 | * @return void
407 | */
408 | public function unregister()
409 | {
410 | spl_autoload_unregister(array($this, 'loadClass'));
411 |
412 | if (null !== $this->vendorDir) {
413 | unset(self::$registeredLoaders[$this->vendorDir]);
414 | }
415 | }
416 |
417 | /**
418 | * Loads the given class or interface.
419 | *
420 | * @param string $class The name of the class
421 | * @return true|null True if loaded, null otherwise
422 | */
423 | public function loadClass($class)
424 | {
425 | if ($file = $this->findFile($class)) {
426 | $includeFile = self::$includeFile;
427 | $includeFile($file);
428 |
429 | return true;
430 | }
431 |
432 | return null;
433 | }
434 |
435 | /**
436 | * Finds the path to the file where the class is defined.
437 | *
438 | * @param string $class The name of the class
439 | *
440 | * @return string|false The path if found, false otherwise
441 | */
442 | public function findFile($class)
443 | {
444 | // class map lookup
445 | if (isset($this->classMap[$class])) {
446 | return $this->classMap[$class];
447 | }
448 | if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
449 | return false;
450 | }
451 | if (null !== $this->apcuPrefix) {
452 | $file = apcu_fetch($this->apcuPrefix.$class, $hit);
453 | if ($hit) {
454 | return $file;
455 | }
456 | }
457 |
458 | $file = $this->findFileWithExtension($class, '.php');
459 |
460 | // Search for Hack files if we are running on HHVM
461 | if (false === $file && defined('HHVM_VERSION')) {
462 | $file = $this->findFileWithExtension($class, '.hh');
463 | }
464 |
465 | if (null !== $this->apcuPrefix) {
466 | apcu_add($this->apcuPrefix.$class, $file);
467 | }
468 |
469 | if (false === $file) {
470 | // Remember that this class does not exist.
471 | $this->missingClasses[$class] = true;
472 | }
473 |
474 | return $file;
475 | }
476 |
477 | /**
478 | * Returns the currently registered loaders keyed by their corresponding vendor directories.
479 | *
480 | * @return array
481 | */
482 | public static function getRegisteredLoaders()
483 | {
484 | return self::$registeredLoaders;
485 | }
486 |
487 | /**
488 | * @param string $class
489 | * @param string $ext
490 | * @return string|false
491 | */
492 | private function findFileWithExtension($class, $ext)
493 | {
494 | // PSR-4 lookup
495 | $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
496 |
497 | $first = $class[0];
498 | if (isset($this->prefixLengthsPsr4[$first])) {
499 | $subPath = $class;
500 | while (false !== $lastPos = strrpos($subPath, '\\')) {
501 | $subPath = substr($subPath, 0, $lastPos);
502 | $search = $subPath . '\\';
503 | if (isset($this->prefixDirsPsr4[$search])) {
504 | $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
505 | foreach ($this->prefixDirsPsr4[$search] as $dir) {
506 | if (file_exists($file = $dir . $pathEnd)) {
507 | return $file;
508 | }
509 | }
510 | }
511 | }
512 | }
513 |
514 | // PSR-4 fallback dirs
515 | foreach ($this->fallbackDirsPsr4 as $dir) {
516 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
517 | return $file;
518 | }
519 | }
520 |
521 | // PSR-0 lookup
522 | if (false !== $pos = strrpos($class, '\\')) {
523 | // namespaced class name
524 | $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
525 | . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
526 | } else {
527 | // PEAR-like class name
528 | $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
529 | }
530 |
531 | if (isset($this->prefixesPsr0[$first])) {
532 | foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
533 | if (0 === strpos($class, $prefix)) {
534 | foreach ($dirs as $dir) {
535 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
536 | return $file;
537 | }
538 | }
539 | }
540 | }
541 | }
542 |
543 | // PSR-0 fallback dirs
544 | foreach ($this->fallbackDirsPsr0 as $dir) {
545 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
546 | return $file;
547 | }
548 | }
549 |
550 | // PSR-0 include paths.
551 | if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
552 | return $file;
553 | }
554 |
555 | return false;
556 | }
557 |
558 | /**
559 | * @return void
560 | */
561 | private static function initializeIncludeClosure()
562 | {
563 | if (self::$includeFile !== null) {
564 | return;
565 | }
566 |
567 | /**
568 | * Scope isolated include.
569 | *
570 | * Prevents access to $this/self from included files.
571 | *
572 | * @param string $file
573 | * @return void
574 | */
575 | self::$includeFile = \Closure::bind(static function($file) {
576 | include $file;
577 | }, null, null);
578 | }
579 | }
580 |
--------------------------------------------------------------------------------
/vendor/getkirby/composer-installer/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 | "This file is @generated automatically"
6 | ],
7 | "content-hash": "981db668fb0d4f37f7b64daf03b5f131",
8 | "packages": [],
9 | "packages-dev": [
10 | {
11 | "name": "composer/ca-bundle",
12 | "version": "1.2.8",
13 | "source": {
14 | "type": "git",
15 | "url": "https://github.com/composer/ca-bundle.git",
16 | "reference": "8a7ecad675253e4654ea05505233285377405215"
17 | },
18 | "dist": {
19 | "type": "zip",
20 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
21 | "reference": "8a7ecad675253e4654ea05505233285377405215",
22 | "shasum": ""
23 | },
24 | "require": {
25 | "ext-openssl": "*",
26 | "ext-pcre": "*",
27 | "php": "^5.3.2 || ^7.0 || ^8.0"
28 | },
29 | "require-dev": {
30 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
31 | "psr/log": "^1.0",
32 | "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
33 | },
34 | "type": "library",
35 | "extra": {
36 | "branch-alias": {
37 | "dev-master": "1.x-dev"
38 | }
39 | },
40 | "autoload": {
41 | "psr-4": {
42 | "Composer\\CaBundle\\": "src"
43 | }
44 | },
45 | "notification-url": "https://packagist.org/downloads/",
46 | "license": [
47 | "MIT"
48 | ],
49 | "authors": [
50 | {
51 | "name": "Jordi Boggiano",
52 | "email": "j.boggiano@seld.be",
53 | "homepage": "http://seld.be"
54 | }
55 | ],
56 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
57 | "keywords": [
58 | "cabundle",
59 | "cacert",
60 | "certificate",
61 | "ssl",
62 | "tls"
63 | ],
64 | "support": {
65 | "irc": "irc://irc.freenode.org/composer",
66 | "issues": "https://github.com/composer/ca-bundle/issues",
67 | "source": "https://github.com/composer/ca-bundle/tree/1.2.8"
68 | },
69 | "funding": [
70 | {
71 | "url": "https://packagist.com",
72 | "type": "custom"
73 | },
74 | {
75 | "url": "https://github.com/composer",
76 | "type": "github"
77 | },
78 | {
79 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
80 | "type": "tidelift"
81 | }
82 | ],
83 | "time": "2020-08-23T12:54:47+00:00"
84 | },
85 | {
86 | "name": "composer/composer",
87 | "version": "2.0.8",
88 | "source": {
89 | "type": "git",
90 | "url": "https://github.com/composer/composer.git",
91 | "reference": "62139b2806178adb979d76bd3437534a1a9fd490"
92 | },
93 | "dist": {
94 | "type": "zip",
95 | "url": "https://api.github.com/repos/composer/composer/zipball/62139b2806178adb979d76bd3437534a1a9fd490",
96 | "reference": "62139b2806178adb979d76bd3437534a1a9fd490",
97 | "shasum": ""
98 | },
99 | "require": {
100 | "composer/ca-bundle": "^1.0",
101 | "composer/semver": "^3.0",
102 | "composer/spdx-licenses": "^1.2",
103 | "composer/xdebug-handler": "^1.1",
104 | "justinrainbow/json-schema": "^5.2.10",
105 | "php": "^5.3.2 || ^7.0 || ^8.0",
106 | "psr/log": "^1.0",
107 | "react/promise": "^1.2 || ^2.7",
108 | "seld/jsonlint": "^1.4",
109 | "seld/phar-utils": "^1.0",
110 | "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
111 | "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
112 | "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
113 | "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0"
114 | },
115 | "require-dev": {
116 | "phpspec/prophecy": "^1.10",
117 | "symfony/phpunit-bridge": "^4.2 || ^5.0"
118 | },
119 | "suggest": {
120 | "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
121 | "ext-zip": "Enabling the zip extension allows you to unzip archives",
122 | "ext-zlib": "Allow gzip compression of HTTP requests"
123 | },
124 | "bin": [
125 | "bin/composer"
126 | ],
127 | "type": "library",
128 | "extra": {
129 | "branch-alias": {
130 | "dev-master": "2.0-dev"
131 | }
132 | },
133 | "autoload": {
134 | "psr-4": {
135 | "Composer\\": "src/Composer"
136 | }
137 | },
138 | "notification-url": "https://packagist.org/downloads/",
139 | "license": [
140 | "MIT"
141 | ],
142 | "authors": [
143 | {
144 | "name": "Nils Adermann",
145 | "email": "naderman@naderman.de",
146 | "homepage": "https://www.naderman.de"
147 | },
148 | {
149 | "name": "Jordi Boggiano",
150 | "email": "j.boggiano@seld.be",
151 | "homepage": "https://seld.be"
152 | }
153 | ],
154 | "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
155 | "homepage": "https://getcomposer.org/",
156 | "keywords": [
157 | "autoload",
158 | "dependency",
159 | "package"
160 | ],
161 | "support": {
162 | "irc": "irc://irc.freenode.org/composer",
163 | "issues": "https://github.com/composer/composer/issues",
164 | "source": "https://github.com/composer/composer/tree/2.0.8"
165 | },
166 | "funding": [
167 | {
168 | "url": "https://packagist.com",
169 | "type": "custom"
170 | },
171 | {
172 | "url": "https://github.com/composer",
173 | "type": "github"
174 | },
175 | {
176 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
177 | "type": "tidelift"
178 | }
179 | ],
180 | "time": "2020-12-03T16:20:39+00:00"
181 | },
182 | {
183 | "name": "composer/semver",
184 | "version": "3.2.4",
185 | "source": {
186 | "type": "git",
187 | "url": "https://github.com/composer/semver.git",
188 | "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464"
189 | },
190 | "dist": {
191 | "type": "zip",
192 | "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
193 | "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
194 | "shasum": ""
195 | },
196 | "require": {
197 | "php": "^5.3.2 || ^7.0 || ^8.0"
198 | },
199 | "require-dev": {
200 | "phpstan/phpstan": "^0.12.54",
201 | "symfony/phpunit-bridge": "^4.2 || ^5"
202 | },
203 | "type": "library",
204 | "extra": {
205 | "branch-alias": {
206 | "dev-main": "3.x-dev"
207 | }
208 | },
209 | "autoload": {
210 | "psr-4": {
211 | "Composer\\Semver\\": "src"
212 | }
213 | },
214 | "notification-url": "https://packagist.org/downloads/",
215 | "license": [
216 | "MIT"
217 | ],
218 | "authors": [
219 | {
220 | "name": "Nils Adermann",
221 | "email": "naderman@naderman.de",
222 | "homepage": "http://www.naderman.de"
223 | },
224 | {
225 | "name": "Jordi Boggiano",
226 | "email": "j.boggiano@seld.be",
227 | "homepage": "http://seld.be"
228 | },
229 | {
230 | "name": "Rob Bast",
231 | "email": "rob.bast@gmail.com",
232 | "homepage": "http://robbast.nl"
233 | }
234 | ],
235 | "description": "Semver library that offers utilities, version constraint parsing and validation.",
236 | "keywords": [
237 | "semantic",
238 | "semver",
239 | "validation",
240 | "versioning"
241 | ],
242 | "support": {
243 | "irc": "irc://irc.freenode.org/composer",
244 | "issues": "https://github.com/composer/semver/issues",
245 | "source": "https://github.com/composer/semver/tree/3.2.4"
246 | },
247 | "funding": [
248 | {
249 | "url": "https://packagist.com",
250 | "type": "custom"
251 | },
252 | {
253 | "url": "https://github.com/composer",
254 | "type": "github"
255 | },
256 | {
257 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
258 | "type": "tidelift"
259 | }
260 | ],
261 | "time": "2020-11-13T08:59:24+00:00"
262 | },
263 | {
264 | "name": "composer/spdx-licenses",
265 | "version": "1.5.5",
266 | "source": {
267 | "type": "git",
268 | "url": "https://github.com/composer/spdx-licenses.git",
269 | "reference": "de30328a7af8680efdc03e396aad24befd513200"
270 | },
271 | "dist": {
272 | "type": "zip",
273 | "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200",
274 | "reference": "de30328a7af8680efdc03e396aad24befd513200",
275 | "shasum": ""
276 | },
277 | "require": {
278 | "php": "^5.3.2 || ^7.0 || ^8.0"
279 | },
280 | "require-dev": {
281 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
282 | },
283 | "type": "library",
284 | "extra": {
285 | "branch-alias": {
286 | "dev-main": "1.x-dev"
287 | }
288 | },
289 | "autoload": {
290 | "psr-4": {
291 | "Composer\\Spdx\\": "src"
292 | }
293 | },
294 | "notification-url": "https://packagist.org/downloads/",
295 | "license": [
296 | "MIT"
297 | ],
298 | "authors": [
299 | {
300 | "name": "Nils Adermann",
301 | "email": "naderman@naderman.de",
302 | "homepage": "http://www.naderman.de"
303 | },
304 | {
305 | "name": "Jordi Boggiano",
306 | "email": "j.boggiano@seld.be",
307 | "homepage": "http://seld.be"
308 | },
309 | {
310 | "name": "Rob Bast",
311 | "email": "rob.bast@gmail.com",
312 | "homepage": "http://robbast.nl"
313 | }
314 | ],
315 | "description": "SPDX licenses list and validation library.",
316 | "keywords": [
317 | "license",
318 | "spdx",
319 | "validator"
320 | ],
321 | "support": {
322 | "irc": "irc://irc.freenode.org/composer",
323 | "issues": "https://github.com/composer/spdx-licenses/issues",
324 | "source": "https://github.com/composer/spdx-licenses/tree/1.5.5"
325 | },
326 | "funding": [
327 | {
328 | "url": "https://packagist.com",
329 | "type": "custom"
330 | },
331 | {
332 | "url": "https://github.com/composer",
333 | "type": "github"
334 | },
335 | {
336 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
337 | "type": "tidelift"
338 | }
339 | ],
340 | "time": "2020-12-03T16:04:16+00:00"
341 | },
342 | {
343 | "name": "composer/xdebug-handler",
344 | "version": "1.4.5",
345 | "source": {
346 | "type": "git",
347 | "url": "https://github.com/composer/xdebug-handler.git",
348 | "reference": "f28d44c286812c714741478d968104c5e604a1d4"
349 | },
350 | "dist": {
351 | "type": "zip",
352 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4",
353 | "reference": "f28d44c286812c714741478d968104c5e604a1d4",
354 | "shasum": ""
355 | },
356 | "require": {
357 | "php": "^5.3.2 || ^7.0 || ^8.0",
358 | "psr/log": "^1.0"
359 | },
360 | "require-dev": {
361 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
362 | },
363 | "type": "library",
364 | "autoload": {
365 | "psr-4": {
366 | "Composer\\XdebugHandler\\": "src"
367 | }
368 | },
369 | "notification-url": "https://packagist.org/downloads/",
370 | "license": [
371 | "MIT"
372 | ],
373 | "authors": [
374 | {
375 | "name": "John Stevenson",
376 | "email": "john-stevenson@blueyonder.co.uk"
377 | }
378 | ],
379 | "description": "Restarts a process without Xdebug.",
380 | "keywords": [
381 | "Xdebug",
382 | "performance"
383 | ],
384 | "support": {
385 | "irc": "irc://irc.freenode.org/composer",
386 | "issues": "https://github.com/composer/xdebug-handler/issues",
387 | "source": "https://github.com/composer/xdebug-handler/tree/1.4.5"
388 | },
389 | "funding": [
390 | {
391 | "url": "https://packagist.com",
392 | "type": "custom"
393 | },
394 | {
395 | "url": "https://github.com/composer",
396 | "type": "github"
397 | },
398 | {
399 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
400 | "type": "tidelift"
401 | }
402 | ],
403 | "time": "2020-11-13T08:04:11+00:00"
404 | },
405 | {
406 | "name": "justinrainbow/json-schema",
407 | "version": "5.2.10",
408 | "source": {
409 | "type": "git",
410 | "url": "https://github.com/justinrainbow/json-schema.git",
411 | "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b"
412 | },
413 | "dist": {
414 | "type": "zip",
415 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
416 | "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
417 | "shasum": ""
418 | },
419 | "require": {
420 | "php": ">=5.3.3"
421 | },
422 | "require-dev": {
423 | "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
424 | "json-schema/json-schema-test-suite": "1.2.0",
425 | "phpunit/phpunit": "^4.8.35"
426 | },
427 | "bin": [
428 | "bin/validate-json"
429 | ],
430 | "type": "library",
431 | "extra": {
432 | "branch-alias": {
433 | "dev-master": "5.0.x-dev"
434 | }
435 | },
436 | "autoload": {
437 | "psr-4": {
438 | "JsonSchema\\": "src/JsonSchema/"
439 | }
440 | },
441 | "notification-url": "https://packagist.org/downloads/",
442 | "license": [
443 | "MIT"
444 | ],
445 | "authors": [
446 | {
447 | "name": "Bruno Prieto Reis",
448 | "email": "bruno.p.reis@gmail.com"
449 | },
450 | {
451 | "name": "Justin Rainbow",
452 | "email": "justin.rainbow@gmail.com"
453 | },
454 | {
455 | "name": "Igor Wiedler",
456 | "email": "igor@wiedler.ch"
457 | },
458 | {
459 | "name": "Robert Schönthal",
460 | "email": "seroscho@googlemail.com"
461 | }
462 | ],
463 | "description": "A library to validate a json schema.",
464 | "homepage": "https://github.com/justinrainbow/json-schema",
465 | "keywords": [
466 | "json",
467 | "schema"
468 | ],
469 | "support": {
470 | "issues": "https://github.com/justinrainbow/json-schema/issues",
471 | "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10"
472 | },
473 | "time": "2020-05-27T16:41:55+00:00"
474 | },
475 | {
476 | "name": "psr/container",
477 | "version": "1.0.0",
478 | "source": {
479 | "type": "git",
480 | "url": "https://github.com/php-fig/container.git",
481 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
482 | },
483 | "dist": {
484 | "type": "zip",
485 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
486 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
487 | "shasum": ""
488 | },
489 | "require": {
490 | "php": ">=5.3.0"
491 | },
492 | "type": "library",
493 | "extra": {
494 | "branch-alias": {
495 | "dev-master": "1.0.x-dev"
496 | }
497 | },
498 | "autoload": {
499 | "psr-4": {
500 | "Psr\\Container\\": "src/"
501 | }
502 | },
503 | "notification-url": "https://packagist.org/downloads/",
504 | "license": [
505 | "MIT"
506 | ],
507 | "authors": [
508 | {
509 | "name": "PHP-FIG",
510 | "homepage": "http://www.php-fig.org/"
511 | }
512 | ],
513 | "description": "Common Container Interface (PHP FIG PSR-11)",
514 | "homepage": "https://github.com/php-fig/container",
515 | "keywords": [
516 | "PSR-11",
517 | "container",
518 | "container-interface",
519 | "container-interop",
520 | "psr"
521 | ],
522 | "support": {
523 | "issues": "https://github.com/php-fig/container/issues",
524 | "source": "https://github.com/php-fig/container/tree/master"
525 | },
526 | "time": "2017-02-14T16:28:37+00:00"
527 | },
528 | {
529 | "name": "psr/log",
530 | "version": "1.1.3",
531 | "source": {
532 | "type": "git",
533 | "url": "https://github.com/php-fig/log.git",
534 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
535 | },
536 | "dist": {
537 | "type": "zip",
538 | "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
539 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
540 | "shasum": ""
541 | },
542 | "require": {
543 | "php": ">=5.3.0"
544 | },
545 | "type": "library",
546 | "extra": {
547 | "branch-alias": {
548 | "dev-master": "1.1.x-dev"
549 | }
550 | },
551 | "autoload": {
552 | "psr-4": {
553 | "Psr\\Log\\": "Psr/Log/"
554 | }
555 | },
556 | "notification-url": "https://packagist.org/downloads/",
557 | "license": [
558 | "MIT"
559 | ],
560 | "authors": [
561 | {
562 | "name": "PHP-FIG",
563 | "homepage": "http://www.php-fig.org/"
564 | }
565 | ],
566 | "description": "Common interface for logging libraries",
567 | "homepage": "https://github.com/php-fig/log",
568 | "keywords": [
569 | "log",
570 | "psr",
571 | "psr-3"
572 | ],
573 | "support": {
574 | "source": "https://github.com/php-fig/log/tree/1.1.3"
575 | },
576 | "time": "2020-03-23T09:12:05+00:00"
577 | },
578 | {
579 | "name": "react/promise",
580 | "version": "v2.8.0",
581 | "source": {
582 | "type": "git",
583 | "url": "https://github.com/reactphp/promise.git",
584 | "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
585 | },
586 | "dist": {
587 | "type": "zip",
588 | "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
589 | "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
590 | "shasum": ""
591 | },
592 | "require": {
593 | "php": ">=5.4.0"
594 | },
595 | "require-dev": {
596 | "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
597 | },
598 | "type": "library",
599 | "autoload": {
600 | "psr-4": {
601 | "React\\Promise\\": "src/"
602 | },
603 | "files": [
604 | "src/functions_include.php"
605 | ]
606 | },
607 | "notification-url": "https://packagist.org/downloads/",
608 | "license": [
609 | "MIT"
610 | ],
611 | "authors": [
612 | {
613 | "name": "Jan Sorgalla",
614 | "email": "jsorgalla@gmail.com"
615 | }
616 | ],
617 | "description": "A lightweight implementation of CommonJS Promises/A for PHP",
618 | "keywords": [
619 | "promise",
620 | "promises"
621 | ],
622 | "support": {
623 | "issues": "https://github.com/reactphp/promise/issues",
624 | "source": "https://github.com/reactphp/promise/tree/v2.8.0"
625 | },
626 | "time": "2020-05-12T15:16:56+00:00"
627 | },
628 | {
629 | "name": "seld/jsonlint",
630 | "version": "1.8.3",
631 | "source": {
632 | "type": "git",
633 | "url": "https://github.com/Seldaek/jsonlint.git",
634 | "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57"
635 | },
636 | "dist": {
637 | "type": "zip",
638 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
639 | "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
640 | "shasum": ""
641 | },
642 | "require": {
643 | "php": "^5.3 || ^7.0 || ^8.0"
644 | },
645 | "require-dev": {
646 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
647 | },
648 | "bin": [
649 | "bin/jsonlint"
650 | ],
651 | "type": "library",
652 | "autoload": {
653 | "psr-4": {
654 | "Seld\\JsonLint\\": "src/Seld/JsonLint/"
655 | }
656 | },
657 | "notification-url": "https://packagist.org/downloads/",
658 | "license": [
659 | "MIT"
660 | ],
661 | "authors": [
662 | {
663 | "name": "Jordi Boggiano",
664 | "email": "j.boggiano@seld.be",
665 | "homepage": "http://seld.be"
666 | }
667 | ],
668 | "description": "JSON Linter",
669 | "keywords": [
670 | "json",
671 | "linter",
672 | "parser",
673 | "validator"
674 | ],
675 | "support": {
676 | "issues": "https://github.com/Seldaek/jsonlint/issues",
677 | "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3"
678 | },
679 | "funding": [
680 | {
681 | "url": "https://github.com/Seldaek",
682 | "type": "github"
683 | },
684 | {
685 | "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
686 | "type": "tidelift"
687 | }
688 | ],
689 | "time": "2020-11-11T09:19:24+00:00"
690 | },
691 | {
692 | "name": "seld/phar-utils",
693 | "version": "1.1.1",
694 | "source": {
695 | "type": "git",
696 | "url": "https://github.com/Seldaek/phar-utils.git",
697 | "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796"
698 | },
699 | "dist": {
700 | "type": "zip",
701 | "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796",
702 | "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796",
703 | "shasum": ""
704 | },
705 | "require": {
706 | "php": ">=5.3"
707 | },
708 | "type": "library",
709 | "extra": {
710 | "branch-alias": {
711 | "dev-master": "1.x-dev"
712 | }
713 | },
714 | "autoload": {
715 | "psr-4": {
716 | "Seld\\PharUtils\\": "src/"
717 | }
718 | },
719 | "notification-url": "https://packagist.org/downloads/",
720 | "license": [
721 | "MIT"
722 | ],
723 | "authors": [
724 | {
725 | "name": "Jordi Boggiano",
726 | "email": "j.boggiano@seld.be"
727 | }
728 | ],
729 | "description": "PHAR file format utilities, for when PHP phars you up",
730 | "keywords": [
731 | "phar"
732 | ],
733 | "support": {
734 | "issues": "https://github.com/Seldaek/phar-utils/issues",
735 | "source": "https://github.com/Seldaek/phar-utils/tree/master"
736 | },
737 | "time": "2020-07-07T18:42:57+00:00"
738 | },
739 | {
740 | "name": "symfony/console",
741 | "version": "v5.2.1",
742 | "source": {
743 | "type": "git",
744 | "url": "https://github.com/symfony/console.git",
745 | "reference": "47c02526c532fb381374dab26df05e7313978976"
746 | },
747 | "dist": {
748 | "type": "zip",
749 | "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976",
750 | "reference": "47c02526c532fb381374dab26df05e7313978976",
751 | "shasum": ""
752 | },
753 | "require": {
754 | "php": ">=7.2.5",
755 | "symfony/polyfill-mbstring": "~1.0",
756 | "symfony/polyfill-php73": "^1.8",
757 | "symfony/polyfill-php80": "^1.15",
758 | "symfony/service-contracts": "^1.1|^2",
759 | "symfony/string": "^5.1"
760 | },
761 | "conflict": {
762 | "symfony/dependency-injection": "<4.4",
763 | "symfony/dotenv": "<5.1",
764 | "symfony/event-dispatcher": "<4.4",
765 | "symfony/lock": "<4.4",
766 | "symfony/process": "<4.4"
767 | },
768 | "provide": {
769 | "psr/log-implementation": "1.0"
770 | },
771 | "require-dev": {
772 | "psr/log": "~1.0",
773 | "symfony/config": "^4.4|^5.0",
774 | "symfony/dependency-injection": "^4.4|^5.0",
775 | "symfony/event-dispatcher": "^4.4|^5.0",
776 | "symfony/lock": "^4.4|^5.0",
777 | "symfony/process": "^4.4|^5.0",
778 | "symfony/var-dumper": "^4.4|^5.0"
779 | },
780 | "suggest": {
781 | "psr/log": "For using the console logger",
782 | "symfony/event-dispatcher": "",
783 | "symfony/lock": "",
784 | "symfony/process": ""
785 | },
786 | "type": "library",
787 | "autoload": {
788 | "psr-4": {
789 | "Symfony\\Component\\Console\\": ""
790 | },
791 | "exclude-from-classmap": [
792 | "/Tests/"
793 | ]
794 | },
795 | "notification-url": "https://packagist.org/downloads/",
796 | "license": [
797 | "MIT"
798 | ],
799 | "authors": [
800 | {
801 | "name": "Fabien Potencier",
802 | "email": "fabien@symfony.com"
803 | },
804 | {
805 | "name": "Symfony Community",
806 | "homepage": "https://symfony.com/contributors"
807 | }
808 | ],
809 | "description": "Symfony Console Component",
810 | "homepage": "https://symfony.com",
811 | "keywords": [
812 | "cli",
813 | "command line",
814 | "console",
815 | "terminal"
816 | ],
817 | "support": {
818 | "source": "https://github.com/symfony/console/tree/v5.2.1"
819 | },
820 | "funding": [
821 | {
822 | "url": "https://symfony.com/sponsor",
823 | "type": "custom"
824 | },
825 | {
826 | "url": "https://github.com/fabpot",
827 | "type": "github"
828 | },
829 | {
830 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
831 | "type": "tidelift"
832 | }
833 | ],
834 | "time": "2020-12-18T08:03:05+00:00"
835 | },
836 | {
837 | "name": "symfony/filesystem",
838 | "version": "v5.2.1",
839 | "source": {
840 | "type": "git",
841 | "url": "https://github.com/symfony/filesystem.git",
842 | "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d"
843 | },
844 | "dist": {
845 | "type": "zip",
846 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/fa8f8cab6b65e2d99a118e082935344c5ba8c60d",
847 | "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d",
848 | "shasum": ""
849 | },
850 | "require": {
851 | "php": ">=7.2.5",
852 | "symfony/polyfill-ctype": "~1.8"
853 | },
854 | "type": "library",
855 | "autoload": {
856 | "psr-4": {
857 | "Symfony\\Component\\Filesystem\\": ""
858 | },
859 | "exclude-from-classmap": [
860 | "/Tests/"
861 | ]
862 | },
863 | "notification-url": "https://packagist.org/downloads/",
864 | "license": [
865 | "MIT"
866 | ],
867 | "authors": [
868 | {
869 | "name": "Fabien Potencier",
870 | "email": "fabien@symfony.com"
871 | },
872 | {
873 | "name": "Symfony Community",
874 | "homepage": "https://symfony.com/contributors"
875 | }
876 | ],
877 | "description": "Symfony Filesystem Component",
878 | "homepage": "https://symfony.com",
879 | "support": {
880 | "source": "https://github.com/symfony/filesystem/tree/v5.2.1"
881 | },
882 | "funding": [
883 | {
884 | "url": "https://symfony.com/sponsor",
885 | "type": "custom"
886 | },
887 | {
888 | "url": "https://github.com/fabpot",
889 | "type": "github"
890 | },
891 | {
892 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
893 | "type": "tidelift"
894 | }
895 | ],
896 | "time": "2020-11-30T17:05:38+00:00"
897 | },
898 | {
899 | "name": "symfony/finder",
900 | "version": "v5.2.1",
901 | "source": {
902 | "type": "git",
903 | "url": "https://github.com/symfony/finder.git",
904 | "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba"
905 | },
906 | "dist": {
907 | "type": "zip",
908 | "url": "https://api.github.com/repos/symfony/finder/zipball/0b9231a5922fd7287ba5b411893c0ecd2733e5ba",
909 | "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba",
910 | "shasum": ""
911 | },
912 | "require": {
913 | "php": ">=7.2.5"
914 | },
915 | "type": "library",
916 | "autoload": {
917 | "psr-4": {
918 | "Symfony\\Component\\Finder\\": ""
919 | },
920 | "exclude-from-classmap": [
921 | "/Tests/"
922 | ]
923 | },
924 | "notification-url": "https://packagist.org/downloads/",
925 | "license": [
926 | "MIT"
927 | ],
928 | "authors": [
929 | {
930 | "name": "Fabien Potencier",
931 | "email": "fabien@symfony.com"
932 | },
933 | {
934 | "name": "Symfony Community",
935 | "homepage": "https://symfony.com/contributors"
936 | }
937 | ],
938 | "description": "Symfony Finder Component",
939 | "homepage": "https://symfony.com",
940 | "support": {
941 | "source": "https://github.com/symfony/finder/tree/v5.2.1"
942 | },
943 | "funding": [
944 | {
945 | "url": "https://symfony.com/sponsor",
946 | "type": "custom"
947 | },
948 | {
949 | "url": "https://github.com/fabpot",
950 | "type": "github"
951 | },
952 | {
953 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
954 | "type": "tidelift"
955 | }
956 | ],
957 | "time": "2020-12-08T17:02:38+00:00"
958 | },
959 | {
960 | "name": "symfony/polyfill-ctype",
961 | "version": "v1.20.0",
962 | "source": {
963 | "type": "git",
964 | "url": "https://github.com/symfony/polyfill-ctype.git",
965 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
966 | },
967 | "dist": {
968 | "type": "zip",
969 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
970 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
971 | "shasum": ""
972 | },
973 | "require": {
974 | "php": ">=7.1"
975 | },
976 | "suggest": {
977 | "ext-ctype": "For best performance"
978 | },
979 | "type": "library",
980 | "extra": {
981 | "branch-alias": {
982 | "dev-main": "1.20-dev"
983 | },
984 | "thanks": {
985 | "name": "symfony/polyfill",
986 | "url": "https://github.com/symfony/polyfill"
987 | }
988 | },
989 | "autoload": {
990 | "psr-4": {
991 | "Symfony\\Polyfill\\Ctype\\": ""
992 | },
993 | "files": [
994 | "bootstrap.php"
995 | ]
996 | },
997 | "notification-url": "https://packagist.org/downloads/",
998 | "license": [
999 | "MIT"
1000 | ],
1001 | "authors": [
1002 | {
1003 | "name": "Gert de Pagter",
1004 | "email": "BackEndTea@gmail.com"
1005 | },
1006 | {
1007 | "name": "Symfony Community",
1008 | "homepage": "https://symfony.com/contributors"
1009 | }
1010 | ],
1011 | "description": "Symfony polyfill for ctype functions",
1012 | "homepage": "https://symfony.com",
1013 | "keywords": [
1014 | "compatibility",
1015 | "ctype",
1016 | "polyfill",
1017 | "portable"
1018 | ],
1019 | "support": {
1020 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0"
1021 | },
1022 | "funding": [
1023 | {
1024 | "url": "https://symfony.com/sponsor",
1025 | "type": "custom"
1026 | },
1027 | {
1028 | "url": "https://github.com/fabpot",
1029 | "type": "github"
1030 | },
1031 | {
1032 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1033 | "type": "tidelift"
1034 | }
1035 | ],
1036 | "time": "2020-10-23T14:02:19+00:00"
1037 | },
1038 | {
1039 | "name": "symfony/polyfill-intl-grapheme",
1040 | "version": "v1.20.0",
1041 | "source": {
1042 | "type": "git",
1043 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
1044 | "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c"
1045 | },
1046 | "dist": {
1047 | "type": "zip",
1048 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
1049 | "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
1050 | "shasum": ""
1051 | },
1052 | "require": {
1053 | "php": ">=7.1"
1054 | },
1055 | "suggest": {
1056 | "ext-intl": "For best performance"
1057 | },
1058 | "type": "library",
1059 | "extra": {
1060 | "branch-alias": {
1061 | "dev-main": "1.20-dev"
1062 | },
1063 | "thanks": {
1064 | "name": "symfony/polyfill",
1065 | "url": "https://github.com/symfony/polyfill"
1066 | }
1067 | },
1068 | "autoload": {
1069 | "psr-4": {
1070 | "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
1071 | },
1072 | "files": [
1073 | "bootstrap.php"
1074 | ]
1075 | },
1076 | "notification-url": "https://packagist.org/downloads/",
1077 | "license": [
1078 | "MIT"
1079 | ],
1080 | "authors": [
1081 | {
1082 | "name": "Nicolas Grekas",
1083 | "email": "p@tchwork.com"
1084 | },
1085 | {
1086 | "name": "Symfony Community",
1087 | "homepage": "https://symfony.com/contributors"
1088 | }
1089 | ],
1090 | "description": "Symfony polyfill for intl's grapheme_* functions",
1091 | "homepage": "https://symfony.com",
1092 | "keywords": [
1093 | "compatibility",
1094 | "grapheme",
1095 | "intl",
1096 | "polyfill",
1097 | "portable",
1098 | "shim"
1099 | ],
1100 | "support": {
1101 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0"
1102 | },
1103 | "funding": [
1104 | {
1105 | "url": "https://symfony.com/sponsor",
1106 | "type": "custom"
1107 | },
1108 | {
1109 | "url": "https://github.com/fabpot",
1110 | "type": "github"
1111 | },
1112 | {
1113 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1114 | "type": "tidelift"
1115 | }
1116 | ],
1117 | "time": "2020-10-23T14:02:19+00:00"
1118 | },
1119 | {
1120 | "name": "symfony/polyfill-intl-normalizer",
1121 | "version": "v1.20.0",
1122 | "source": {
1123 | "type": "git",
1124 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
1125 | "reference": "727d1096295d807c309fb01a851577302394c897"
1126 | },
1127 | "dist": {
1128 | "type": "zip",
1129 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897",
1130 | "reference": "727d1096295d807c309fb01a851577302394c897",
1131 | "shasum": ""
1132 | },
1133 | "require": {
1134 | "php": ">=7.1"
1135 | },
1136 | "suggest": {
1137 | "ext-intl": "For best performance"
1138 | },
1139 | "type": "library",
1140 | "extra": {
1141 | "branch-alias": {
1142 | "dev-main": "1.20-dev"
1143 | },
1144 | "thanks": {
1145 | "name": "symfony/polyfill",
1146 | "url": "https://github.com/symfony/polyfill"
1147 | }
1148 | },
1149 | "autoload": {
1150 | "psr-4": {
1151 | "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
1152 | },
1153 | "files": [
1154 | "bootstrap.php"
1155 | ],
1156 | "classmap": [
1157 | "Resources/stubs"
1158 | ]
1159 | },
1160 | "notification-url": "https://packagist.org/downloads/",
1161 | "license": [
1162 | "MIT"
1163 | ],
1164 | "authors": [
1165 | {
1166 | "name": "Nicolas Grekas",
1167 | "email": "p@tchwork.com"
1168 | },
1169 | {
1170 | "name": "Symfony Community",
1171 | "homepage": "https://symfony.com/contributors"
1172 | }
1173 | ],
1174 | "description": "Symfony polyfill for intl's Normalizer class and related functions",
1175 | "homepage": "https://symfony.com",
1176 | "keywords": [
1177 | "compatibility",
1178 | "intl",
1179 | "normalizer",
1180 | "polyfill",
1181 | "portable",
1182 | "shim"
1183 | ],
1184 | "support": {
1185 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0"
1186 | },
1187 | "funding": [
1188 | {
1189 | "url": "https://symfony.com/sponsor",
1190 | "type": "custom"
1191 | },
1192 | {
1193 | "url": "https://github.com/fabpot",
1194 | "type": "github"
1195 | },
1196 | {
1197 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1198 | "type": "tidelift"
1199 | }
1200 | ],
1201 | "time": "2020-10-23T14:02:19+00:00"
1202 | },
1203 | {
1204 | "name": "symfony/polyfill-mbstring",
1205 | "version": "v1.20.0",
1206 | "source": {
1207 | "type": "git",
1208 | "url": "https://github.com/symfony/polyfill-mbstring.git",
1209 | "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
1210 | },
1211 | "dist": {
1212 | "type": "zip",
1213 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
1214 | "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
1215 | "shasum": ""
1216 | },
1217 | "require": {
1218 | "php": ">=7.1"
1219 | },
1220 | "suggest": {
1221 | "ext-mbstring": "For best performance"
1222 | },
1223 | "type": "library",
1224 | "extra": {
1225 | "branch-alias": {
1226 | "dev-main": "1.20-dev"
1227 | },
1228 | "thanks": {
1229 | "name": "symfony/polyfill",
1230 | "url": "https://github.com/symfony/polyfill"
1231 | }
1232 | },
1233 | "autoload": {
1234 | "psr-4": {
1235 | "Symfony\\Polyfill\\Mbstring\\": ""
1236 | },
1237 | "files": [
1238 | "bootstrap.php"
1239 | ]
1240 | },
1241 | "notification-url": "https://packagist.org/downloads/",
1242 | "license": [
1243 | "MIT"
1244 | ],
1245 | "authors": [
1246 | {
1247 | "name": "Nicolas Grekas",
1248 | "email": "p@tchwork.com"
1249 | },
1250 | {
1251 | "name": "Symfony Community",
1252 | "homepage": "https://symfony.com/contributors"
1253 | }
1254 | ],
1255 | "description": "Symfony polyfill for the Mbstring extension",
1256 | "homepage": "https://symfony.com",
1257 | "keywords": [
1258 | "compatibility",
1259 | "mbstring",
1260 | "polyfill",
1261 | "portable",
1262 | "shim"
1263 | ],
1264 | "support": {
1265 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
1266 | },
1267 | "funding": [
1268 | {
1269 | "url": "https://symfony.com/sponsor",
1270 | "type": "custom"
1271 | },
1272 | {
1273 | "url": "https://github.com/fabpot",
1274 | "type": "github"
1275 | },
1276 | {
1277 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1278 | "type": "tidelift"
1279 | }
1280 | ],
1281 | "time": "2020-10-23T14:02:19+00:00"
1282 | },
1283 | {
1284 | "name": "symfony/polyfill-php73",
1285 | "version": "v1.20.0",
1286 | "source": {
1287 | "type": "git",
1288 | "url": "https://github.com/symfony/polyfill-php73.git",
1289 | "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
1290 | },
1291 | "dist": {
1292 | "type": "zip",
1293 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
1294 | "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
1295 | "shasum": ""
1296 | },
1297 | "require": {
1298 | "php": ">=7.1"
1299 | },
1300 | "type": "library",
1301 | "extra": {
1302 | "branch-alias": {
1303 | "dev-main": "1.20-dev"
1304 | },
1305 | "thanks": {
1306 | "name": "symfony/polyfill",
1307 | "url": "https://github.com/symfony/polyfill"
1308 | }
1309 | },
1310 | "autoload": {
1311 | "psr-4": {
1312 | "Symfony\\Polyfill\\Php73\\": ""
1313 | },
1314 | "files": [
1315 | "bootstrap.php"
1316 | ],
1317 | "classmap": [
1318 | "Resources/stubs"
1319 | ]
1320 | },
1321 | "notification-url": "https://packagist.org/downloads/",
1322 | "license": [
1323 | "MIT"
1324 | ],
1325 | "authors": [
1326 | {
1327 | "name": "Nicolas Grekas",
1328 | "email": "p@tchwork.com"
1329 | },
1330 | {
1331 | "name": "Symfony Community",
1332 | "homepage": "https://symfony.com/contributors"
1333 | }
1334 | ],
1335 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
1336 | "homepage": "https://symfony.com",
1337 | "keywords": [
1338 | "compatibility",
1339 | "polyfill",
1340 | "portable",
1341 | "shim"
1342 | ],
1343 | "support": {
1344 | "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0"
1345 | },
1346 | "funding": [
1347 | {
1348 | "url": "https://symfony.com/sponsor",
1349 | "type": "custom"
1350 | },
1351 | {
1352 | "url": "https://github.com/fabpot",
1353 | "type": "github"
1354 | },
1355 | {
1356 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1357 | "type": "tidelift"
1358 | }
1359 | ],
1360 | "time": "2020-10-23T14:02:19+00:00"
1361 | },
1362 | {
1363 | "name": "symfony/polyfill-php80",
1364 | "version": "v1.20.0",
1365 | "source": {
1366 | "type": "git",
1367 | "url": "https://github.com/symfony/polyfill-php80.git",
1368 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de"
1369 | },
1370 | "dist": {
1371 | "type": "zip",
1372 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
1373 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
1374 | "shasum": ""
1375 | },
1376 | "require": {
1377 | "php": ">=7.1"
1378 | },
1379 | "type": "library",
1380 | "extra": {
1381 | "branch-alias": {
1382 | "dev-main": "1.20-dev"
1383 | },
1384 | "thanks": {
1385 | "name": "symfony/polyfill",
1386 | "url": "https://github.com/symfony/polyfill"
1387 | }
1388 | },
1389 | "autoload": {
1390 | "psr-4": {
1391 | "Symfony\\Polyfill\\Php80\\": ""
1392 | },
1393 | "files": [
1394 | "bootstrap.php"
1395 | ],
1396 | "classmap": [
1397 | "Resources/stubs"
1398 | ]
1399 | },
1400 | "notification-url": "https://packagist.org/downloads/",
1401 | "license": [
1402 | "MIT"
1403 | ],
1404 | "authors": [
1405 | {
1406 | "name": "Ion Bazan",
1407 | "email": "ion.bazan@gmail.com"
1408 | },
1409 | {
1410 | "name": "Nicolas Grekas",
1411 | "email": "p@tchwork.com"
1412 | },
1413 | {
1414 | "name": "Symfony Community",
1415 | "homepage": "https://symfony.com/contributors"
1416 | }
1417 | ],
1418 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
1419 | "homepage": "https://symfony.com",
1420 | "keywords": [
1421 | "compatibility",
1422 | "polyfill",
1423 | "portable",
1424 | "shim"
1425 | ],
1426 | "support": {
1427 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0"
1428 | },
1429 | "funding": [
1430 | {
1431 | "url": "https://symfony.com/sponsor",
1432 | "type": "custom"
1433 | },
1434 | {
1435 | "url": "https://github.com/fabpot",
1436 | "type": "github"
1437 | },
1438 | {
1439 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1440 | "type": "tidelift"
1441 | }
1442 | ],
1443 | "time": "2020-10-23T14:02:19+00:00"
1444 | },
1445 | {
1446 | "name": "symfony/process",
1447 | "version": "v5.2.1",
1448 | "source": {
1449 | "type": "git",
1450 | "url": "https://github.com/symfony/process.git",
1451 | "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd"
1452 | },
1453 | "dist": {
1454 | "type": "zip",
1455 | "url": "https://api.github.com/repos/symfony/process/zipball/bd8815b8b6705298beaa384f04fabd459c10bedd",
1456 | "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd",
1457 | "shasum": ""
1458 | },
1459 | "require": {
1460 | "php": ">=7.2.5",
1461 | "symfony/polyfill-php80": "^1.15"
1462 | },
1463 | "type": "library",
1464 | "autoload": {
1465 | "psr-4": {
1466 | "Symfony\\Component\\Process\\": ""
1467 | },
1468 | "exclude-from-classmap": [
1469 | "/Tests/"
1470 | ]
1471 | },
1472 | "notification-url": "https://packagist.org/downloads/",
1473 | "license": [
1474 | "MIT"
1475 | ],
1476 | "authors": [
1477 | {
1478 | "name": "Fabien Potencier",
1479 | "email": "fabien@symfony.com"
1480 | },
1481 | {
1482 | "name": "Symfony Community",
1483 | "homepage": "https://symfony.com/contributors"
1484 | }
1485 | ],
1486 | "description": "Symfony Process Component",
1487 | "homepage": "https://symfony.com",
1488 | "support": {
1489 | "source": "https://github.com/symfony/process/tree/v5.2.1"
1490 | },
1491 | "funding": [
1492 | {
1493 | "url": "https://symfony.com/sponsor",
1494 | "type": "custom"
1495 | },
1496 | {
1497 | "url": "https://github.com/fabpot",
1498 | "type": "github"
1499 | },
1500 | {
1501 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1502 | "type": "tidelift"
1503 | }
1504 | ],
1505 | "time": "2020-12-08T17:03:37+00:00"
1506 | },
1507 | {
1508 | "name": "symfony/service-contracts",
1509 | "version": "v2.2.0",
1510 | "source": {
1511 | "type": "git",
1512 | "url": "https://github.com/symfony/service-contracts.git",
1513 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
1514 | },
1515 | "dist": {
1516 | "type": "zip",
1517 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
1518 | "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
1519 | "shasum": ""
1520 | },
1521 | "require": {
1522 | "php": ">=7.2.5",
1523 | "psr/container": "^1.0"
1524 | },
1525 | "suggest": {
1526 | "symfony/service-implementation": ""
1527 | },
1528 | "type": "library",
1529 | "extra": {
1530 | "branch-alias": {
1531 | "dev-master": "2.2-dev"
1532 | },
1533 | "thanks": {
1534 | "name": "symfony/contracts",
1535 | "url": "https://github.com/symfony/contracts"
1536 | }
1537 | },
1538 | "autoload": {
1539 | "psr-4": {
1540 | "Symfony\\Contracts\\Service\\": ""
1541 | }
1542 | },
1543 | "notification-url": "https://packagist.org/downloads/",
1544 | "license": [
1545 | "MIT"
1546 | ],
1547 | "authors": [
1548 | {
1549 | "name": "Nicolas Grekas",
1550 | "email": "p@tchwork.com"
1551 | },
1552 | {
1553 | "name": "Symfony Community",
1554 | "homepage": "https://symfony.com/contributors"
1555 | }
1556 | ],
1557 | "description": "Generic abstractions related to writing services",
1558 | "homepage": "https://symfony.com",
1559 | "keywords": [
1560 | "abstractions",
1561 | "contracts",
1562 | "decoupling",
1563 | "interfaces",
1564 | "interoperability",
1565 | "standards"
1566 | ],
1567 | "support": {
1568 | "source": "https://github.com/symfony/service-contracts/tree/master"
1569 | },
1570 | "funding": [
1571 | {
1572 | "url": "https://symfony.com/sponsor",
1573 | "type": "custom"
1574 | },
1575 | {
1576 | "url": "https://github.com/fabpot",
1577 | "type": "github"
1578 | },
1579 | {
1580 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1581 | "type": "tidelift"
1582 | }
1583 | ],
1584 | "time": "2020-09-07T11:33:47+00:00"
1585 | },
1586 | {
1587 | "name": "symfony/string",
1588 | "version": "v5.2.1",
1589 | "source": {
1590 | "type": "git",
1591 | "url": "https://github.com/symfony/string.git",
1592 | "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed"
1593 | },
1594 | "dist": {
1595 | "type": "zip",
1596 | "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
1597 | "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
1598 | "shasum": ""
1599 | },
1600 | "require": {
1601 | "php": ">=7.2.5",
1602 | "symfony/polyfill-ctype": "~1.8",
1603 | "symfony/polyfill-intl-grapheme": "~1.0",
1604 | "symfony/polyfill-intl-normalizer": "~1.0",
1605 | "symfony/polyfill-mbstring": "~1.0",
1606 | "symfony/polyfill-php80": "~1.15"
1607 | },
1608 | "require-dev": {
1609 | "symfony/error-handler": "^4.4|^5.0",
1610 | "symfony/http-client": "^4.4|^5.0",
1611 | "symfony/translation-contracts": "^1.1|^2",
1612 | "symfony/var-exporter": "^4.4|^5.0"
1613 | },
1614 | "type": "library",
1615 | "autoload": {
1616 | "psr-4": {
1617 | "Symfony\\Component\\String\\": ""
1618 | },
1619 | "files": [
1620 | "Resources/functions.php"
1621 | ],
1622 | "exclude-from-classmap": [
1623 | "/Tests/"
1624 | ]
1625 | },
1626 | "notification-url": "https://packagist.org/downloads/",
1627 | "license": [
1628 | "MIT"
1629 | ],
1630 | "authors": [
1631 | {
1632 | "name": "Nicolas Grekas",
1633 | "email": "p@tchwork.com"
1634 | },
1635 | {
1636 | "name": "Symfony Community",
1637 | "homepage": "https://symfony.com/contributors"
1638 | }
1639 | ],
1640 | "description": "Symfony String component",
1641 | "homepage": "https://symfony.com",
1642 | "keywords": [
1643 | "grapheme",
1644 | "i18n",
1645 | "string",
1646 | "unicode",
1647 | "utf-8",
1648 | "utf8"
1649 | ],
1650 | "support": {
1651 | "source": "https://github.com/symfony/string/tree/v5.2.1"
1652 | },
1653 | "funding": [
1654 | {
1655 | "url": "https://symfony.com/sponsor",
1656 | "type": "custom"
1657 | },
1658 | {
1659 | "url": "https://github.com/fabpot",
1660 | "type": "github"
1661 | },
1662 | {
1663 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1664 | "type": "tidelift"
1665 | }
1666 | ],
1667 | "time": "2020-12-05T07:33:16+00:00"
1668 | }
1669 | ],
1670 | "aliases": [],
1671 | "minimum-stability": "stable",
1672 | "stability-flags": [],
1673 | "prefer-stable": false,
1674 | "prefer-lowest": false,
1675 | "platform": {
1676 | "composer-plugin-api": "^1.0 || ^2.0"
1677 | },
1678 | "platform-dev": [],
1679 | "plugin-api-version": "2.0.0"
1680 | }
1681 |
--------------------------------------------------------------------------------