├── 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 | 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 | 10 | 11 | 22 | -------------------------------------------------------------------------------- /snippets/snipcart/products/product-add-to-cart.php: -------------------------------------------------------------------------------- 1 | 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 | 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 | 7 | 27 | -------------------------------------------------------------------------------- /snippets/snipcart/products/product-list.php: -------------------------------------------------------------------------------- 1 |
2 | collection("products") as $product): ?> 3 | 4 |
5 | 6 |
7 | 8 | <?= $product->productImage()->toFile()->alt() ?> 9 | 10 |
11 | title() ?> 12 |
13 |
14 | 15 |

productDescription() ?>

16 | £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 | 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 | 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 | 6 | 7 | 46 | 47 | 49 | -------------------------------------------------------------------------------- /src/components/panel/Dashboard.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 41 | 42 | 60 | -------------------------------------------------------------------------------- /src/components/dashboard/orders.vue: -------------------------------------------------------------------------------- 1 | 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 | 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 | 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 | 72 | ``` 73 | 74 | ### Add Checkout Summary 75 | 76 | Add the "Checkout" button and items in basket to your product template: 77 | 78 | ``` 79 | 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 `` 104 | 105 | ``` 106 | 'hashandsalt.kirby-snipcart.defaulttheme' => true, 107 | ``` -------------------------------------------------------------------------------- /vendor/getkirby/composer-installer/readme.md: -------------------------------------------------------------------------------- 1 | # Kirby Composer Installer 2 | 3 | [![CI Status](https://flat.badgen.net/github/checks/getkirby/composer-installer/master)](https://github.com/getkirby/composer-installer/actions?query=workflow%3ACI) 4 | [![Coverage Status](https://flat.badgen.net/coveralls/c/github/getkirby/composer-installer)](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 | --------------------------------------------------------------------------------