Facebook for WooCommerce - Version 2.6.17

Version Description

  • 2022-07-06 =
  • Fix - Add allow-plugins directive and adjust phpcs GitHub workflow.
  • Fix - Scheduled product not synced when status becomes "publish".
  • Tweak - WooCommerce 6.7 compatibility.
  • Update - Facebook Marketing API from v12.0 to v13.0.
Download this release

Release Info

Developer automattic
Plugin Icon Facebook for WooCommerce
Version 2.6.17
Comparing to
See all releases

Code changes from version 2.6.16 to 2.6.17

README.md CHANGED
@@ -1,5 +1,7 @@
1
  # Facebook for WooCommerce
2
 
 
 
3
  This is the development repository for the Facebook for WooCommerce plugin.
4
 
5
  - [WooCommerce.com product page](https://woocommerce.com/products/facebook)
1
  # Facebook for WooCommerce
2
 
3
+ [![PHP Coding Standards](https://github.com/woocommerce/facebook-for-woocommerce/actions/workflows/php-coding-standards.yml/badge.svg)](https://github.com/woocommerce/facebook-for-woocommerce/actions/workflows/php-coding-standards.yml)
4
+
5
  This is the development repository for the Facebook for WooCommerce plugin.
6
 
7
  - [WooCommerce.com product page](https://woocommerce.com/products/facebook)
changelog.txt CHANGED
@@ -1,5 +1,11 @@
1
  *** Facebook for WooCommerce Changelog ***
2
 
 
 
 
 
 
 
3
  = 2.6.16 - 2022-06-07 =
4
  * Fix - Updating reference from old master branch.
5
  * Tweak - WC 6.6 compatibility.
1
  *** Facebook for WooCommerce Changelog ***
2
 
3
+ = 2.6.17 - 2022-07-06 =
4
+ * Fix - Add allow-plugins directive and adjust phpcs GitHub workflow.
5
+ * Fix - Scheduled product not synced when status becomes "publish".
6
+ * Tweak - WooCommerce 6.7 compatibility.
7
+ * Update - Facebook Marketing API from v12.0 to v13.0.
8
+
9
  = 2.6.16 - 2022-06-07 =
10
  * Fix - Updating reference from old master branch.
11
  * Tweak - WC 6.6 compatibility.
facebook-commerce.php CHANGED
@@ -362,13 +362,6 @@ class WC_Facebookcommerce_Integration extends WC_Integration {
362
 
363
  add_action( 'add_meta_boxes', 'SkyVerge\WooCommerce\Facebook\Admin\Product_Sync_Meta_Box::register', 10, 1 );
364
 
365
- add_action(
366
- 'transition_post_status',
367
- array( $this, 'fb_change_product_published_status' ),
368
- 10,
369
- 3
370
- );
371
-
372
  add_action(
373
  'wp_ajax_ajax_fb_toggle_visibility',
374
  array( $this, 'ajax_fb_toggle_visibility' )
@@ -419,6 +412,14 @@ class WC_Facebookcommerce_Integration extends WC_Integration {
419
  )
420
  );
421
 
 
 
 
 
 
 
 
 
422
  // Product Set hooks.
423
  add_action( 'fb_wc_product_set_sync', array( $this, 'create_or_update_product_set_item' ), 99, 2 );
424
  add_action( 'fb_wc_product_set_delete', array( $this, 'delete_product_set_item' ), 99 );
@@ -1097,7 +1098,13 @@ class WC_Facebookcommerce_Integration extends WC_Integration {
1097
  return;
1098
  }
1099
 
1100
- $this->update_fb_visibility( $product, $visibility );
 
 
 
 
 
 
1101
  }
1102
 
1103
 
@@ -1116,7 +1123,7 @@ class WC_Facebookcommerce_Integration extends WC_Integration {
1116
  */
1117
  private function should_update_visibility_for_product_status_change( $new_status, $old_status ) {
1118
 
1119
- return ( $old_status === 'publish' && $new_status !== 'publish' ) || ( $old_status === 'trash' && $new_status === 'publish' );
1120
  }
1121
 
1122
 
362
 
363
  add_action( 'add_meta_boxes', 'SkyVerge\WooCommerce\Facebook\Admin\Product_Sync_Meta_Box::register', 10, 1 );
364
 
 
 
 
 
 
 
 
365
  add_action(
366
  'wp_ajax_ajax_fb_toggle_visibility',
367
  array( $this, 'ajax_fb_toggle_visibility' )
412
  )
413
  );
414
 
415
+ // Update products on change of status.
416
+ add_action(
417
+ 'transition_post_status',
418
+ array( $this, 'fb_change_product_published_status' ),
419
+ 10,
420
+ 3
421
+ );
422
+
423
  // Product Set hooks.
424
  add_action( 'fb_wc_product_set_sync', array( $this, 'create_or_update_product_set_item' ), 99, 2 );
425
  add_action( 'fb_wc_product_set_delete', array( $this, 'delete_product_set_item' ), 99 );
1098
  return;
1099
  }
1100
 
1101
+ if ( $visibility === self::FB_SHOP_PRODUCT_VISIBLE ) {
1102
+ // - new status is 'publish' regardless of old status, sync to Facebook
1103
+ $this->on_product_publish( $product->get_id() );
1104
+ } else {
1105
+ $this->update_fb_visibility( $product, $visibility );
1106
+ }
1107
+
1108
  }
1109
 
1110
 
1123
  */
1124
  private function should_update_visibility_for_product_status_change( $new_status, $old_status ) {
1125
 
1126
+ return ( $old_status === 'publish' && $new_status !== 'publish' ) || ( $old_status === 'trash' && $new_status === 'publish' ) || ( $old_status === 'future' && $new_status === 'publish' );
1127
  }
1128
 
1129
 
facebook-for-woocommerce.php CHANGED
@@ -11,11 +11,11 @@
11
  * Description: Grow your business on Facebook! Use this official plugin to help sell more of your products using Facebook. After completing the setup, you'll be ready to create ads that promote your products and you can also create a shop section on your Page where customers can browse your products on Facebook.
12
  * Author: Facebook
13
  * Author URI: https://www.facebook.com/
14
- * Version: 2.6.16
15
  * Text Domain: facebook-for-woocommerce
16
  * Tested up to: 6.0
17
  * WC requires at least: 3.5.0
18
- * WC tested up to: 6.6
19
  * Requires PHP: 7.0
20
  *
21
  * @package FacebookCommerce
@@ -33,7 +33,7 @@ class WC_Facebook_Loader {
33
  /**
34
  * @var string the plugin version. This must be in the main plugin file to be automatically bumped by Woorelease.
35
  */
36
- const PLUGIN_VERSION = '2.6.16'; // WRCS: DEFINED_VERSION.
37
 
38
  // Minimum PHP version required by this plugin.
39
  const MINIMUM_PHP_VERSION = '7.0.0';
11
  * Description: Grow your business on Facebook! Use this official plugin to help sell more of your products using Facebook. After completing the setup, you'll be ready to create ads that promote your products and you can also create a shop section on your Page where customers can browse your products on Facebook.
12
  * Author: Facebook
13
  * Author URI: https://www.facebook.com/
14
+ * Version: 2.6.17
15
  * Text Domain: facebook-for-woocommerce
16
  * Tested up to: 6.0
17
  * WC requires at least: 3.5.0
18
+ * WC tested up to: 6.7
19
  * Requires PHP: 7.0
20
  *
21
  * @package FacebookCommerce
33
  /**
34
  * @var string the plugin version. This must be in the main plugin file to be automatically bumped by Woorelease.
35
  */
36
+ const PLUGIN_VERSION = '2.6.17'; // WRCS: DEFINED_VERSION.
37
 
38
  // Minimum PHP version required by this plugin.
39
  const MINIMUM_PHP_VERSION = '7.0.0';
i18n/languages/facebook-for-woocommerce.pot CHANGED
@@ -2,10 +2,10 @@
2
  # This file is distributed under the same license as the Facebook for WooCommerce package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Facebook for WooCommerce 2.6.16\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://woocommerce.com/my-account/marketplace-ticket-form/\n"
8
- "POT-Creation-Date: 2022-06-07 16:48:17+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
@@ -111,45 +111,45 @@ msgstr ""
111
  msgid "Facebook Commerce and Dynamic Ads (Pixel) Extension"
112
  msgstr ""
113
 
114
- #: facebook-commerce.php:1426
115
  msgid "Nothing to update for product group for %1$s"
116
  msgstr ""
117
 
118
- #: facebook-commerce.php:1839
119
  #. translators: Placeholders %1$s - original error message from Facebook API
120
  msgid "There was an issue connecting to the Facebook API: %1$s"
121
  msgstr ""
122
 
123
- #: facebook-commerce.php:2164
124
  msgid "Your connection has expired."
125
  msgstr ""
126
 
127
- #: facebook-commerce.php:2164
128
  msgid ""
129
  "Please click Manage connection > Advanced Options > Update Token to refresh "
130
  "your connection to Facebook."
131
  msgstr ""
132
 
133
- #: facebook-commerce.php:2171
134
  #. translators: Placeholders %s - error message
135
  msgid "There was an error trying to sync the products to Facebook. %s"
136
  msgstr ""
137
 
138
- #: facebook-commerce.php:2194
139
  msgid "Product sync is disabled."
140
  msgstr ""
141
 
142
- #: facebook-commerce.php:2201
143
  msgid "The plugin is not configured or the Catalog ID is missing."
144
  msgstr ""
145
 
146
- #: facebook-commerce.php:2224
147
  msgid ""
148
  "A product sync is in progress. Please wait until the sync finishes before "
149
  "starting a new one."
150
  msgstr ""
151
 
152
- #: facebook-commerce.php:2236
153
  msgid ""
154
  "We've detected that your Facebook Product Catalog is no longer valid. This "
155
  "may happen if it was deleted, but could also be a temporary error. If the "
@@ -157,29 +157,29 @@ msgid ""
157
  "and setup the plugin again."
158
  msgstr ""
159
 
160
- #: facebook-commerce.php:2765
161
  msgid "Hi! We're here to answer any questions you may have."
162
  msgstr ""
163
 
164
- #: facebook-commerce.php:3155
165
  msgid "Facebook for WooCommerce error:"
166
  msgstr ""
167
 
168
- #: facebook-commerce.php:3237
169
  msgid ""
170
  "There was an error trying to retrieve information about the Facebook page: "
171
  "%s"
172
  msgstr ""
173
 
174
- #: facebook-commerce.php:3288
175
  msgid "Get started with Messenger Customer Chat"
176
  msgstr ""
177
 
178
- #: facebook-commerce.php:3289
179
  msgid "Get started with Instagram Shopping"
180
  msgstr ""
181
 
182
- #: facebook-commerce.php:3524
183
  #. translators: Placeholders %1$s - original error message from Facebook API
184
  msgid "There was an issue connecting to the Facebook API: %s"
185
  msgstr ""
2
  # This file is distributed under the same license as the Facebook for WooCommerce package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Facebook for WooCommerce 2.6.17\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://woocommerce.com/my-account/marketplace-ticket-form/\n"
8
+ "POT-Creation-Date: 2022-07-06 15:02:41+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
111
  msgid "Facebook Commerce and Dynamic Ads (Pixel) Extension"
112
  msgstr ""
113
 
114
+ #: facebook-commerce.php:1433
115
  msgid "Nothing to update for product group for %1$s"
116
  msgstr ""
117
 
118
+ #: facebook-commerce.php:1846
119
  #. translators: Placeholders %1$s - original error message from Facebook API
120
  msgid "There was an issue connecting to the Facebook API: %1$s"
121
  msgstr ""
122
 
123
+ #: facebook-commerce.php:2171
124
  msgid "Your connection has expired."
125
  msgstr ""
126
 
127
+ #: facebook-commerce.php:2171
128
  msgid ""
129
  "Please click Manage connection > Advanced Options > Update Token to refresh "
130
  "your connection to Facebook."
131
  msgstr ""
132
 
133
+ #: facebook-commerce.php:2178
134
  #. translators: Placeholders %s - error message
135
  msgid "There was an error trying to sync the products to Facebook. %s"
136
  msgstr ""
137
 
138
+ #: facebook-commerce.php:2201
139
  msgid "Product sync is disabled."
140
  msgstr ""
141
 
142
+ #: facebook-commerce.php:2208
143
  msgid "The plugin is not configured or the Catalog ID is missing."
144
  msgstr ""
145
 
146
+ #: facebook-commerce.php:2231
147
  msgid ""
148
  "A product sync is in progress. Please wait until the sync finishes before "
149
  "starting a new one."
150
  msgstr ""
151
 
152
+ #: facebook-commerce.php:2243
153
  msgid ""
154
  "We've detected that your Facebook Product Catalog is no longer valid. This "
155
  "may happen if it was deleted, but could also be a temporary error. If the "
157
  "and setup the plugin again."
158
  msgstr ""
159
 
160
+ #: facebook-commerce.php:2772
161
  msgid "Hi! We're here to answer any questions you may have."
162
  msgstr ""
163
 
164
+ #: facebook-commerce.php:3162
165
  msgid "Facebook for WooCommerce error:"
166
  msgstr ""
167
 
168
+ #: facebook-commerce.php:3244
169
  msgid ""
170
  "There was an error trying to retrieve information about the Facebook page: "
171
  "%s"
172
  msgstr ""
173
 
174
+ #: facebook-commerce.php:3295
175
  msgid "Get started with Messenger Customer Chat"
176
  msgstr ""
177
 
178
+ #: facebook-commerce.php:3296
179
  msgid "Get started with Instagram Shopping"
180
  msgstr ""
181
 
182
+ #: facebook-commerce.php:3531
183
  #. translators: Placeholders %1$s - original error message from Facebook API
184
  msgid "There was an issue connecting to the Facebook API: %s"
185
  msgstr ""
includes/fbgraph.php CHANGED
@@ -26,7 +26,7 @@ if ( ! class_exists( 'WC_Facebookcommerce_Graph_API' ) ) :
26
  */
27
  class WC_Facebookcommerce_Graph_API {
28
  const GRAPH_API_URL = 'https://graph.facebook.com/';
29
- const API_VERSION = 'v12.0';
30
  const CURL_TIMEOUT = 500;
31
 
32
  /**
26
  */
27
  class WC_Facebookcommerce_Graph_API {
28
  const GRAPH_API_URL = 'https://graph.facebook.com/';
29
+ const API_VERSION = 'v13.0';
30
  const CURL_TIMEOUT = 500;
31
 
32
  /**
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: facebook, automattic, woothemes
3
  Tags: facebook, shop, catalog, advertise, pixel, product
4
  Requires at least: 4.4
5
  Tested up to: 5.9
6
- Stable tag: 2.6.16
7
  Requires PHP: 5.6 or greater
8
  MySQL: 5.6 or greater
9
  License: GPLv2 or later
@@ -39,6 +39,12 @@ When opening a bug on GitHub, please give us as many details as possible.
39
 
40
  == Changelog ==
41
 
 
 
 
 
 
 
42
  = 2.6.16 - 2022-06-07 =
43
  * Fix - Updating reference from old master branch.
44
  * Tweak - WC 6.6 compatibility.
3
  Tags: facebook, shop, catalog, advertise, pixel, product
4
  Requires at least: 4.4
5
  Tested up to: 5.9
6
+ Stable tag: 2.6.17
7
  Requires PHP: 5.6 or greater
8
  MySQL: 5.6 or greater
9
  License: GPLv2 or later
39
 
40
  == Changelog ==
41
 
42
+ = 2.6.17 - 2022-07-06 =
43
+ * Fix - Add allow-plugins directive and adjust phpcs GitHub workflow.
44
+ * Fix - Scheduled product not synced when status becomes "publish".
45
+ * Tweak - WooCommerce 6.7 compatibility.
46
+ * Update - Facebook Marketing API from v12.0 to v13.0.
47
+
48
  = 2.6.16 - 2022-06-07 =
49
  * Fix - Updating reference from old master branch.
50
  * Tweak - WC 6.6 compatibility.
vendor/autoload.php CHANGED
@@ -2,6 +2,11 @@
2
 
3
  // autoload.php @generated by Composer
4
 
 
 
 
 
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit2aefdfcf714feef810b3b48df1224bdd::getLoader();
2
 
3
  // autoload.php @generated by Composer
4
 
5
+ if (PHP_VERSION_ID < 50600) {
6
+ echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
7
+ exit(1);
8
+ }
9
+
10
  require_once __DIR__ . '/composer/autoload_real.php';
11
 
12
+ return ComposerAutoloaderInit81d55c64313156042fde4f9c9a047b88::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -37,26 +37,80 @@ namespace Composer\Autoload;
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
- * @see http://www.php-fig.org/psr/psr-0/
41
- * @see http://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
 
 
 
45
  // PSR-4
 
 
 
 
46
  private $prefixLengthsPsr4 = array();
 
 
 
 
47
  private $prefixDirsPsr4 = array();
 
 
 
 
48
  private $fallbackDirsPsr4 = array();
49
 
50
  // PSR-0
 
 
 
 
51
  private $prefixesPsr0 = array();
 
 
 
 
52
  private $fallbackDirsPsr0 = array();
53
 
 
54
  private $useIncludePath = false;
 
 
 
 
 
55
  private $classMap = array();
 
 
56
  private $classMapAuthoritative = false;
 
 
 
 
 
57
  private $missingClasses = array();
 
 
58
  private $apcuPrefix;
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
@@ -66,28 +120,47 @@ class ClassLoader
66
  return array();
67
  }
68
 
 
 
 
 
69
  public function getPrefixesPsr4()
70
  {
71
  return $this->prefixDirsPsr4;
72
  }
73
 
 
 
 
 
74
  public function getFallbackDirs()
75
  {
76
  return $this->fallbackDirsPsr0;
77
  }
78
 
 
 
 
 
79
  public function getFallbackDirsPsr4()
80
  {
81
  return $this->fallbackDirsPsr4;
82
  }
83
 
 
 
 
 
84
  public function getClassMap()
85
  {
86
  return $this->classMap;
87
  }
88
 
89
  /**
90
- * @param array $classMap Class to filename map
 
 
 
91
  */
92
  public function addClassMap(array $classMap)
93
  {
@@ -102,9 +175,11 @@ class ClassLoader
102
  * Registers a set of PSR-0 directories for a given prefix, either
103
  * appending or prepending to the ones previously set for this prefix.
104
  *
105
- * @param string $prefix The prefix
106
- * @param array|string $paths The PSR-0 root directories
107
- * @param bool $prepend Whether to prepend the directories
 
 
108
  */
109
  public function add($prefix, $paths, $prepend = false)
110
  {
@@ -147,11 +222,13 @@ class ClassLoader
147
  * Registers a set of PSR-4 directories for a given namespace, either
148
  * appending or prepending to the ones previously set for this namespace.
149
  *
150
- * @param string $prefix The prefix/namespace, with trailing '\\'
151
- * @param array|string $paths The PSR-4 base directories
152
- * @param bool $prepend Whether to prepend the directories
153
  *
154
  * @throws \InvalidArgumentException
 
 
155
  */
156
  public function addPsr4($prefix, $paths, $prepend = false)
157
  {
@@ -195,8 +272,10 @@ class ClassLoader
195
  * Registers a set of PSR-0 directories for a given prefix,
196
  * replacing any others previously set for this prefix.
197
  *
198
- * @param string $prefix The prefix
199
- * @param array|string $paths The PSR-0 base directories
 
 
200
  */
201
  public function set($prefix, $paths)
202
  {
@@ -211,10 +290,12 @@ class ClassLoader
211
  * Registers a set of PSR-4 directories for a given namespace,
212
  * replacing any others previously set for this namespace.
213
  *
214
- * @param string $prefix The prefix/namespace, with trailing '\\'
215
- * @param array|string $paths The PSR-4 base directories
216
  *
217
  * @throws \InvalidArgumentException
 
 
218
  */
219
  public function setPsr4($prefix, $paths)
220
  {
@@ -234,6 +315,8 @@ class ClassLoader
234
  * Turns on searching the include path for class files.
235
  *
236
  * @param bool $useIncludePath
 
 
237
  */
238
  public function setUseIncludePath($useIncludePath)
239
  {
@@ -256,6 +339,8 @@ class ClassLoader
256
  * that have not been registered with the class map.
257
  *
258
  * @param bool $classMapAuthoritative
 
 
259
  */
260
  public function setClassMapAuthoritative($classMapAuthoritative)
261
  {
@@ -276,6 +361,8 @@ class ClassLoader
276
  * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
  *
278
  * @param string|null $apcuPrefix
 
 
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
@@ -296,25 +383,44 @@ class ClassLoader
296
  * Registers this instance as an autoloader.
297
  *
298
  * @param bool $prepend Whether to prepend the autoloader or not
 
 
299
  */
300
  public function register($prepend = false)
301
  {
302
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
 
 
 
 
 
 
 
 
 
 
303
  }
304
 
305
  /**
306
  * Unregisters this instance as an autoloader.
 
 
307
  */
308
  public function unregister()
309
  {
310
  spl_autoload_unregister(array($this, 'loadClass'));
 
 
 
 
311
  }
312
 
313
  /**
314
  * Loads the given class or interface.
315
  *
316
  * @param string $class The name of the class
317
- * @return bool|null True if loaded, null otherwise
318
  */
319
  public function loadClass($class)
320
  {
@@ -323,6 +429,8 @@ class ClassLoader
323
 
324
  return true;
325
  }
 
 
326
  }
327
 
328
  /**
@@ -367,6 +475,21 @@ class ClassLoader
367
  return $file;
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
370
  private function findFileWithExtension($class, $ext)
371
  {
372
  // PSR-4 lookup
@@ -438,6 +561,10 @@ class ClassLoader
438
  * Scope isolated include.
439
  *
440
  * Prevents access to $this/self from included files.
 
 
 
 
441
  */
442
  function includeFile($file)
443
  {
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
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 ?string */
46
+ private $vendorDir;
47
+
48
  // PSR-4
49
+ /**
50
+ * @var array[]
51
+ * @psalm-var array<string, array<string, int>>
52
+ */
53
  private $prefixLengthsPsr4 = array();
54
+ /**
55
+ * @var array[]
56
+ * @psalm-var array<string, array<int, string>>
57
+ */
58
  private $prefixDirsPsr4 = array();
59
+ /**
60
+ * @var array[]
61
+ * @psalm-var array<string, string>
62
+ */
63
  private $fallbackDirsPsr4 = array();
64
 
65
  // PSR-0
66
+ /**
67
+ * @var array[]
68
+ * @psalm-var array<string, array<string, string[]>>
69
+ */
70
  private $prefixesPsr0 = array();
71
+ /**
72
+ * @var array[]
73
+ * @psalm-var array<string, string>
74
+ */
75
  private $fallbackDirsPsr0 = array();
76
 
77
+ /** @var bool */
78
  private $useIncludePath = false;
79
+
80
+ /**
81
+ * @var string[]
82
+ * @psalm-var array<string, string>
83
+ */
84
  private $classMap = array();
85
+
86
+ /** @var bool */
87
  private $classMapAuthoritative = false;
88
+
89
+ /**
90
+ * @var bool[]
91
+ * @psalm-var array<string, bool>
92
+ */
93
  private $missingClasses = array();
94
+
95
+ /** @var ?string */
96
  private $apcuPrefix;
97
 
98
+ /**
99
+ * @var self[]
100
+ */
101
+ private static $registeredLoaders = array();
102
+
103
+ /**
104
+ * @param ?string $vendorDir
105
+ */
106
+ public function __construct($vendorDir = null)
107
+ {
108
+ $this->vendorDir = $vendorDir;
109
+ }
110
+
111
+ /**
112
+ * @return string[]
113
+ */
114
  public function getPrefixes()
115
  {
116
  if (!empty($this->prefixesPsr0)) {
120
  return array();
121
  }
122
 
123
+ /**
124
+ * @return array[]
125
+ * @psalm-return array<string, array<int, string>>
126
+ */
127
  public function getPrefixesPsr4()
128
  {
129
  return $this->prefixDirsPsr4;
130
  }
131
 
132
+ /**
133
+ * @return array[]
134
+ * @psalm-return array<string, string>
135
+ */
136
  public function getFallbackDirs()
137
  {
138
  return $this->fallbackDirsPsr0;
139
  }
140
 
141
+ /**
142
+ * @return array[]
143
+ * @psalm-return array<string, string>
144
+ */
145
  public function getFallbackDirsPsr4()
146
  {
147
  return $this->fallbackDirsPsr4;
148
  }
149
 
150
+ /**
151
+ * @return string[] Array of classname => path
152
+ * @psalm-return array<string, string>
153
+ */
154
  public function getClassMap()
155
  {
156
  return $this->classMap;
157
  }
158
 
159
  /**
160
+ * @param string[] $classMap Class to filename map
161
+ * @psalm-param array<string, string> $classMap
162
+ *
163
+ * @return void
164
  */
165
  public function addClassMap(array $classMap)
166
  {
175
  * Registers a set of PSR-0 directories for a given prefix, either
176
  * appending or prepending to the ones previously set for this prefix.
177
  *
178
+ * @param string $prefix The prefix
179
+ * @param string[]|string $paths The PSR-0 root directories
180
+ * @param bool $prepend Whether to prepend the directories
181
+ *
182
+ * @return void
183
  */
184
  public function add($prefix, $paths, $prepend = false)
185
  {
222
  * Registers a set of PSR-4 directories for a given namespace, either
223
  * appending or prepending to the ones previously set for this namespace.
224
  *
225
+ * @param string $prefix The prefix/namespace, with trailing '\\'
226
+ * @param string[]|string $paths The PSR-4 base directories
227
+ * @param bool $prepend Whether to prepend the directories
228
  *
229
  * @throws \InvalidArgumentException
230
+ *
231
+ * @return void
232
  */
233
  public function addPsr4($prefix, $paths, $prepend = false)
234
  {
272
  * Registers a set of PSR-0 directories for a given prefix,
273
  * replacing any others previously set for this prefix.
274
  *
275
+ * @param string $prefix The prefix
276
+ * @param string[]|string $paths The PSR-0 base directories
277
+ *
278
+ * @return void
279
  */
280
  public function set($prefix, $paths)
281
  {
290
  * Registers a set of PSR-4 directories for a given namespace,
291
  * replacing any others previously set for this namespace.
292
  *
293
+ * @param string $prefix The prefix/namespace, with trailing '\\'
294
+ * @param string[]|string $paths The PSR-4 base directories
295
  *
296
  * @throws \InvalidArgumentException
297
+ *
298
+ * @return void
299
  */
300
  public function setPsr4($prefix, $paths)
301
  {
315
  * Turns on searching the include path for class files.
316
  *
317
  * @param bool $useIncludePath
318
+ *
319
+ * @return void
320
  */
321
  public function setUseIncludePath($useIncludePath)
322
  {
339
  * that have not been registered with the class map.
340
  *
341
  * @param bool $classMapAuthoritative
342
+ *
343
+ * @return void
344
  */
345
  public function setClassMapAuthoritative($classMapAuthoritative)
346
  {
361
  * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
362
  *
363
  * @param string|null $apcuPrefix
364
+ *
365
+ * @return void
366
  */
367
  public function setApcuPrefix($apcuPrefix)
368
  {
383
  * Registers this instance as an autoloader.
384
  *
385
  * @param bool $prepend Whether to prepend the autoloader or not
386
+ *
387
+ * @return void
388
  */
389
  public function register($prepend = false)
390
  {
391
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
392
+
393
+ if (null === $this->vendorDir) {
394
+ return;
395
+ }
396
+
397
+ if ($prepend) {
398
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
399
+ } else {
400
+ unset(self::$registeredLoaders[$this->vendorDir]);
401
+ self::$registeredLoaders[$this->vendorDir] = $this;
402
+ }
403
  }
404
 
405
  /**
406
  * Unregisters this instance as an autoloader.
407
+ *
408
+ * @return void
409
  */
410
  public function unregister()
411
  {
412
  spl_autoload_unregister(array($this, 'loadClass'));
413
+
414
+ if (null !== $this->vendorDir) {
415
+ unset(self::$registeredLoaders[$this->vendorDir]);
416
+ }
417
  }
418
 
419
  /**
420
  * Loads the given class or interface.
421
  *
422
  * @param string $class The name of the class
423
+ * @return true|null True if loaded, null otherwise
424
  */
425
  public function loadClass($class)
426
  {
429
 
430
  return true;
431
  }
432
+
433
+ return null;
434
  }
435
 
436
  /**
475
  return $file;
476
  }
477
 
478
+ /**
479
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
480
+ *
481
+ * @return self[]
482
+ */
483
+ public static function getRegisteredLoaders()
484
+ {
485
+ return self::$registeredLoaders;
486
+ }
487
+
488
+ /**
489
+ * @param string $class
490
+ * @param string $ext
491
+ * @return string|false
492
+ */
493
  private function findFileWithExtension($class, $ext)
494
  {
495
  // PSR-4 lookup
561
  * Scope isolated include.
562
  *
563
  * Prevents access to $this/self from included files.
564
+ *
565
+ * @param string $file
566
+ * @return void
567
+ * @private
568
  */
569
  function includeFile($file)
570
  {
vendor/composer/InstalledVersions.php ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
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 mixed[]|null
31
+ * @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<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
32
+ */
33
+ private static $installed;
34
+
35
+ /**
36
+ * @var bool|null
37
+ */
38
+ private static $canGetVendors;
39
+
40
+ /**
41
+ * @var array[]
42
+ * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
43
+ */
44
+ private static $installedByVendor = array();
45
+
46
+ /**
47
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
48
+ *
49
+ * @return string[]
50
+ * @psalm-return list<string>
51
+ */
52
+ public static function getInstalledPackages()
53
+ {
54
+ $packages = array();
55
+ foreach (self::getInstalled() as $installed) {
56
+ $packages[] = array_keys($installed['versions']);
57
+ }
58
+
59
+ if (1 === \count($packages)) {
60
+ return $packages[0];
61
+ }
62
+
63
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
64
+ }
65
+
66
+ /**
67
+ * Returns a list of all package names with a specific type e.g. 'library'
68
+ *
69
+ * @param string $type
70
+ * @return string[]
71
+ * @psalm-return list<string>
72
+ */
73
+ public static function getInstalledPackagesByType($type)
74
+ {
75
+ $packagesByType = array();
76
+
77
+ foreach (self::getInstalled() as $installed) {
78
+ foreach ($installed['versions'] as $name => $package) {
79
+ if (isset($package['type']) && $package['type'] === $type) {
80
+ $packagesByType[] = $name;
81
+ }
82
+ }
83
+ }
84
+
85
+ return $packagesByType;
86
+ }
87
+
88
+ /**
89
+ * Checks whether the given package is installed
90
+ *
91
+ * This also returns true if the package name is provided or replaced by another package
92
+ *
93
+ * @param string $packageName
94
+ * @param bool $includeDevRequirements
95
+ * @return bool
96
+ */
97
+ public static function isInstalled($packageName, $includeDevRequirements = true)
98
+ {
99
+ foreach (self::getInstalled() as $installed) {
100
+ if (isset($installed['versions'][$packageName])) {
101
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
102
+ }
103
+ }
104
+
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * Checks whether the given package satisfies a version constraint
110
+ *
111
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
112
+ *
113
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
114
+ *
115
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
116
+ * @param string $packageName
117
+ * @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
118
+ * @return bool
119
+ */
120
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
121
+ {
122
+ $constraint = $parser->parseConstraints($constraint);
123
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
124
+
125
+ return $provided->matches($constraint);
126
+ }
127
+
128
+ /**
129
+ * Returns a version constraint representing all the range(s) which are installed for a given package
130
+ *
131
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
132
+ * whether a given version of a package is installed, and not just whether it exists
133
+ *
134
+ * @param string $packageName
135
+ * @return string Version constraint usable with composer/semver
136
+ */
137
+ public static function getVersionRanges($packageName)
138
+ {
139
+ foreach (self::getInstalled() as $installed) {
140
+ if (!isset($installed['versions'][$packageName])) {
141
+ continue;
142
+ }
143
+
144
+ $ranges = array();
145
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
146
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
147
+ }
148
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
149
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
150
+ }
151
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
152
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
153
+ }
154
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
155
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
156
+ }
157
+
158
+ return implode(' || ', $ranges);
159
+ }
160
+
161
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
162
+ }
163
+
164
+ /**
165
+ * @param string $packageName
166
+ * @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
167
+ */
168
+ public static function getVersion($packageName)
169
+ {
170
+ foreach (self::getInstalled() as $installed) {
171
+ if (!isset($installed['versions'][$packageName])) {
172
+ continue;
173
+ }
174
+
175
+ if (!isset($installed['versions'][$packageName]['version'])) {
176
+ return null;
177
+ }
178
+
179
+ return $installed['versions'][$packageName]['version'];
180
+ }
181
+
182
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
183
+ }
184
+
185
+ /**
186
+ * @param string $packageName
187
+ * @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
188
+ */
189
+ public static function getPrettyVersion($packageName)
190
+ {
191
+ foreach (self::getInstalled() as $installed) {
192
+ if (!isset($installed['versions'][$packageName])) {
193
+ continue;
194
+ }
195
+
196
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
197
+ return null;
198
+ }
199
+
200
+ return $installed['versions'][$packageName]['pretty_version'];
201
+ }
202
+
203
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
204
+ }
205
+
206
+ /**
207
+ * @param string $packageName
208
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
209
+ */
210
+ public static function getReference($packageName)
211
+ {
212
+ foreach (self::getInstalled() as $installed) {
213
+ if (!isset($installed['versions'][$packageName])) {
214
+ continue;
215
+ }
216
+
217
+ if (!isset($installed['versions'][$packageName]['reference'])) {
218
+ return null;
219
+ }
220
+
221
+ return $installed['versions'][$packageName]['reference'];
222
+ }
223
+
224
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
225
+ }
226
+
227
+ /**
228
+ * @param string $packageName
229
+ * @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.
230
+ */
231
+ public static function getInstallPath($packageName)
232
+ {
233
+ foreach (self::getInstalled() as $installed) {
234
+ if (!isset($installed['versions'][$packageName])) {
235
+ continue;
236
+ }
237
+
238
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
239
+ }
240
+
241
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
242
+ }
243
+
244
+ /**
245
+ * @return array
246
+ * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
247
+ */
248
+ public static function getRootPackage()
249
+ {
250
+ $installed = self::getInstalled();
251
+
252
+ return $installed[0]['root'];
253
+ }
254
+
255
+ /**
256
+ * Returns the raw installed.php data for custom implementations
257
+ *
258
+ * @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.
259
+ * @return array[]
260
+ * @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<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
261
+ */
262
+ public static function getRawData()
263
+ {
264
+ @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);
265
+
266
+ if (null === self::$installed) {
267
+ // only require the installed.php file if this file is loaded from its dumped location,
268
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
269
+ if (substr(__DIR__, -8, 1) !== 'C') {
270
+ self::$installed = include __DIR__ . '/installed.php';
271
+ } else {
272
+ self::$installed = array();
273
+ }
274
+ }
275
+
276
+ return self::$installed;
277
+ }
278
+
279
+ /**
280
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
281
+ *
282
+ * @return array[]
283
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
284
+ */
285
+ public static function getAllRawData()
286
+ {
287
+ return self::getInstalled();
288
+ }
289
+
290
+ /**
291
+ * Lets you reload the static array from another file
292
+ *
293
+ * This is only useful for complex integrations in which a project needs to use
294
+ * this class but then also needs to execute another project's autoloader in process,
295
+ * and wants to ensure both projects have access to their version of installed.php.
296
+ *
297
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
298
+ * the data it needs from this class, then call reload() with
299
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
300
+ * the project in which it runs can then also use this class safely, without
301
+ * interference between PHPUnit's dependencies and the project's dependencies.
302
+ *
303
+ * @param array[] $data A vendor/composer/installed.php data set
304
+ * @return void
305
+ *
306
+ * @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<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
307
+ */
308
+ public static function reload($data)
309
+ {
310
+ self::$installed = $data;
311
+ self::$installedByVendor = array();
312
+ }
313
+
314
+ /**
315
+ * @return array[]
316
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
317
+ */
318
+ private static function getInstalled()
319
+ {
320
+ if (null === self::$canGetVendors) {
321
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
322
+ }
323
+
324
+ $installed = array();
325
+
326
+ if (self::$canGetVendors) {
327
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
328
+ if (isset(self::$installedByVendor[$vendorDir])) {
329
+ $installed[] = self::$installedByVendor[$vendorDir];
330
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
331
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
332
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
333
+ self::$installed = $installed[count($installed) - 1];
334
+ }
335
+ }
336
+ }
337
+ }
338
+
339
+ if (null === self::$installed) {
340
+ // only require the installed.php file if this file is loaded from its dumped location,
341
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
342
+ if (substr(__DIR__, -8, 1) !== 'C') {
343
+ self::$installed = require __DIR__ . '/installed.php';
344
+ } else {
345
+ self::$installed = array();
346
+ }
347
+ }
348
+ $installed[] = self::$installed;
349
+
350
+ return $installed;
351
+ }
352
+ }
vendor/composer/autoload_classmap.php CHANGED
@@ -2,8 +2,9 @@
2
 
3
  // autoload_classmap.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  );
2
 
3
  // autoload_classmap.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
10
  );
vendor/composer/autoload_namespaces.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_namespaces.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
2
 
3
  // autoload_namespaces.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
vendor/composer/autoload_psr4.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_psr4.php @generated by Composer
4
 
5
- $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
2
 
3
  // autoload_psr4.php @generated by Composer
4
 
5
+ $vendorDir = dirname(__DIR__);
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit2aefdfcf714feef810b3b48df1224bdd
6
  {
7
  private static $loader;
8
 
@@ -22,31 +22,14 @@ class ComposerAutoloaderInit2aefdfcf714feef810b3b48df1224bdd
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInit2aefdfcf714feef810b3b48df1224bdd', 'loadClassLoader'), true, true);
26
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInit2aefdfcf714feef810b3b48df1224bdd', 'loadClassLoader'));
28
-
29
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
- if ($useStaticLoader) {
31
- require_once __DIR__ . '/autoload_static.php';
32
-
33
- call_user_func(\Composer\Autoload\ComposerStaticInit2aefdfcf714feef810b3b48df1224bdd::getInitializer($loader));
34
- } else {
35
- $map = require __DIR__ . '/autoload_namespaces.php';
36
- foreach ($map as $namespace => $path) {
37
- $loader->set($namespace, $path);
38
- }
39
-
40
- $map = require __DIR__ . '/autoload_psr4.php';
41
- foreach ($map as $namespace => $path) {
42
- $loader->setPsr4($namespace, $path);
43
- }
44
-
45
- $classMap = require __DIR__ . '/autoload_classmap.php';
46
- if ($classMap) {
47
- $loader->addClassMap($classMap);
48
- }
49
- }
50
 
51
  $loader->register(true);
52
 
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit81d55c64313156042fde4f9c9a047b88
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ require __DIR__ . '/platform_check.php';
26
+
27
+ spl_autoload_register(array('ComposerAutoloaderInit81d55c64313156042fde4f9c9a047b88', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInit81d55c64313156042fde4f9c9a047b88', 'loadClassLoader'));
30
+
31
+ require __DIR__ . '/autoload_static.php';
32
+ call_user_func(\Composer\Autoload\ComposerStaticInit81d55c64313156042fde4f9c9a047b88::getInitializer($loader));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  $loader->register(true);
35
 
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit2aefdfcf714feef810b3b48df1224bdd
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'S' =>
@@ -36,11 +36,16 @@ class ComposerStaticInit2aefdfcf714feef810b3b48df1224bdd
36
  ),
37
  );
38
 
 
 
 
 
39
  public static function getInitializer(ClassLoader $loader)
40
  {
41
  return \Closure::bind(function () use ($loader) {
42
- $loader->prefixLengthsPsr4 = ComposerStaticInit2aefdfcf714feef810b3b48df1224bdd::$prefixLengthsPsr4;
43
- $loader->prefixDirsPsr4 = ComposerStaticInit2aefdfcf714feef810b3b48df1224bdd::$prefixDirsPsr4;
 
44
 
45
  }, null, ClassLoader::class);
46
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit81d55c64313156042fde4f9c9a047b88
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'S' =>
36
  ),
37
  );
38
 
39
+ public static $classMap = array (
40
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
41
+ );
42
+
43
  public static function getInitializer(ClassLoader $loader)
44
  {
45
  return \Closure::bind(function () use ($loader) {
46
+ $loader->prefixLengthsPsr4 = ComposerStaticInit81d55c64313156042fde4f9c9a047b88::$prefixLengthsPsr4;
47
+ $loader->prefixDirsPsr4 = ComposerStaticInit81d55c64313156042fde4f9c9a047b88::$prefixDirsPsr4;
48
+ $loader->classMap = ComposerStaticInit81d55c64313156042fde4f9c9a047b88::$classMap;
49
 
50
  }, null, ClassLoader::class);
51
  }
vendor/composer/installed.json CHANGED
@@ -1,225 +1,232 @@
1
- [
2
- {
3
- "name": "composer/installers",
4
- "version": "v1.12.0",
5
- "version_normalized": "1.12.0.0",
6
- "source": {
7
- "type": "git",
8
- "url": "https://github.com/composer/installers.git",
9
- "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19"
10
- },
11
- "dist": {
12
- "type": "zip",
13
- "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19",
14
- "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19",
15
- "shasum": ""
16
- },
17
- "require": {
18
- "composer-plugin-api": "^1.0 || ^2.0"
19
- },
20
- "replace": {
21
- "roundcube/plugin-installer": "*",
22
- "shama/baton": "*"
23
- },
24
- "require-dev": {
25
- "composer/composer": "1.6.* || ^2.0",
26
- "composer/semver": "^1 || ^3",
27
- "phpstan/phpstan": "^0.12.55",
28
- "phpstan/phpstan-phpunit": "^0.12.16",
29
- "symfony/phpunit-bridge": "^4.2 || ^5",
30
- "symfony/process": "^2.3"
31
- },
32
- "time": "2021-09-13T08:19:44+00:00",
33
- "type": "composer-plugin",
34
- "extra": {
35
- "class": "Composer\\Installers\\Plugin",
36
- "branch-alias": {
37
- "dev-main": "1.x-dev"
38
- }
39
- },
40
- "installation-source": "dist",
41
- "autoload": {
42
- "psr-4": {
43
- "Composer\\Installers\\": "src/Composer/Installers"
44
- }
45
- },
46
- "notification-url": "https://packagist.org/downloads/",
47
- "license": [
48
- "MIT"
49
- ],
50
- "authors": [
51
- {
52
- "name": "Kyle Robinson Young",
53
- "email": "kyle@dontkry.com",
54
- "homepage": "https://github.com/shama"
55
- }
56
- ],
57
- "description": "A multi-framework Composer library installer",
58
- "homepage": "https://composer.github.io/installers/",
59
- "keywords": [
60
- "Craft",
61
- "Dolibarr",
62
- "Eliasis",
63
- "Hurad",
64
- "ImageCMS",
65
- "Kanboard",
66
- "Lan Management System",
67
- "MODX Evo",
68
- "MantisBT",
69
- "Mautic",
70
- "Maya",
71
- "OXID",
72
- "Plentymarkets",
73
- "Porto",
74
- "RadPHP",
75
- "SMF",
76
- "Starbug",
77
- "Thelia",
78
- "Whmcs",
79
- "WolfCMS",
80
- "agl",
81
- "aimeos",
82
- "annotatecms",
83
- "attogram",
84
- "bitrix",
85
- "cakephp",
86
- "chef",
87
- "cockpit",
88
- "codeigniter",
89
- "concrete5",
90
- "croogo",
91
- "dokuwiki",
92
- "drupal",
93
- "eZ Platform",
94
- "elgg",
95
- "expressionengine",
96
- "fuelphp",
97
- "grav",
98
- "installer",
99
- "itop",
100
- "joomla",
101
- "known",
102
- "kohana",
103
- "laravel",
104
- "lavalite",
105
- "lithium",
106
- "magento",
107
- "majima",
108
- "mako",
109
- "mediawiki",
110
- "miaoxing",
111
- "modulework",
112
- "modx",
113
- "moodle",
114
- "osclass",
115
- "pantheon",
116
- "phpbb",
117
- "piwik",
118
- "ppi",
119
- "processwire",
120
- "puppet",
121
- "pxcms",
122
- "reindex",
123
- "roundcube",
124
- "shopware",
125
- "silverstripe",
126
- "sydes",
127
- "sylius",
128
- "symfony",
129
- "tastyigniter",
130
- "typo3",
131
- "wordpress",
132
- "yawik",
133
- "zend",
134
- "zikula"
135
- ],
136
- "support": {
137
- "issues": "https://github.com/composer/installers/issues",
138
- "source": "https://github.com/composer/installers/tree/v1.12.0"
139
- },
140
- "funding": [
141
- {
142
- "url": "https://packagist.com",
143
- "type": "custom"
144
- },
145
- {
146
- "url": "https://github.com/composer",
147
- "type": "github"
148
- },
149
- {
150
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
151
- "type": "tidelift"
152
- }
153
- ]
154
- },
155
- {
156
- "name": "skyverge/wc-plugin-framework",
157
- "version": "5.10.0",
158
- "version_normalized": "5.10.0.0",
159
- "source": {
160
- "type": "git",
161
- "url": "https://github.com/skyverge/wc-plugin-framework.git",
162
- "reference": "e230d7c40286854e49c0cafeec3398cbf2427a64"
163
- },
164
- "dist": {
165
- "type": "zip",
166
- "url": "https://api.github.com/repos/skyverge/wc-plugin-framework/zipball/e230d7c40286854e49c0cafeec3398cbf2427a64",
167
- "reference": "e230d7c40286854e49c0cafeec3398cbf2427a64",
168
- "shasum": ""
169
- },
170
- "require-dev": {
171
- "lucatume/wp-browser": "^2.1"
172
- },
173
- "time": "2020-11-06T21:25:49+00:00",
174
- "type": "library",
175
- "installation-source": "dist",
176
- "description": "The official SkyVerge WooCommerce plugin framework",
177
- "support": {
178
- "source": "https://github.com/skyverge/wc-plugin-framework/tree/5.10.0",
179
- "issues": "https://github.com/skyverge/wc-plugin-framework/issues"
180
- }
181
- },
182
- {
183
- "name": "woocommerce/action-scheduler-job-framework",
184
- "version": "2.0.0",
185
- "version_normalized": "2.0.0.0",
186
- "source": {
187
- "type": "git",
188
- "url": "https://github.com/woocommerce/action-scheduler-job-framework.git",
189
- "reference": "b0b21b9cc87e476ba7f8817050b39274ea7d6732"
190
- },
191
- "dist": {
192
- "type": "zip",
193
- "url": "https://api.github.com/repos/woocommerce/action-scheduler-job-framework/zipball/b0b21b9cc87e476ba7f8817050b39274ea7d6732",
194
- "reference": "b0b21b9cc87e476ba7f8817050b39274ea7d6732",
195
- "shasum": ""
196
- },
197
- "require": {
198
- "php": ">=7.0"
199
- },
200
- "require-dev": {
201
- "woocommerce/woocommerce-sniffs": "0.1.0"
202
- },
203
- "time": "2021-05-20T02:32:48+00:00",
204
- "type": "library",
205
- "installation-source": "dist",
206
- "autoload": {
207
- "psr-4": {
208
- "Automattic\\WooCommerce\\ActionSchedulerJobFramework\\": "src/"
209
- }
210
- },
211
- "scripts": {
212
- "phpcs": [
213
- "phpcs -s -p"
214
- ]
215
- },
216
- "license": [
217
- "GNU"
218
- ],
219
- "description": "A job framework for Action Scheduler (actionscheduler.org)",
220
- "support": {
221
- "source": "https://github.com/woocommerce/action-scheduler-job-framework/tree/2.0.0",
222
- "issues": "https://github.com/woocommerce/action-scheduler-job-framework/issues"
 
 
 
 
 
223
  }
224
- }
225
- ]
 
 
1
+ {
2
+ "packages": [
3
+ {
4
+ "name": "composer/installers",
5
+ "version": "v1.12.0",
6
+ "version_normalized": "1.12.0.0",
7
+ "source": {
8
+ "type": "git",
9
+ "url": "https://github.com/composer/installers.git",
10
+ "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19"
11
+ },
12
+ "dist": {
13
+ "type": "zip",
14
+ "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19",
15
+ "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19",
16
+ "shasum": ""
17
+ },
18
+ "require": {
19
+ "composer-plugin-api": "^1.0 || ^2.0"
20
+ },
21
+ "replace": {
22
+ "roundcube/plugin-installer": "*",
23
+ "shama/baton": "*"
24
+ },
25
+ "require-dev": {
26
+ "composer/composer": "1.6.* || ^2.0",
27
+ "composer/semver": "^1 || ^3",
28
+ "phpstan/phpstan": "^0.12.55",
29
+ "phpstan/phpstan-phpunit": "^0.12.16",
30
+ "symfony/phpunit-bridge": "^4.2 || ^5",
31
+ "symfony/process": "^2.3"
32
+ },
33
+ "time": "2021-09-13T08:19:44+00:00",
34
+ "type": "composer-plugin",
35
+ "extra": {
36
+ "class": "Composer\\Installers\\Plugin",
37
+ "branch-alias": {
38
+ "dev-main": "1.x-dev"
39
+ }
40
+ },
41
+ "installation-source": "dist",
42
+ "autoload": {
43
+ "psr-4": {
44
+ "Composer\\Installers\\": "src/Composer/Installers"
45
+ }
46
+ },
47
+ "notification-url": "https://packagist.org/downloads/",
48
+ "license": [
49
+ "MIT"
50
+ ],
51
+ "authors": [
52
+ {
53
+ "name": "Kyle Robinson Young",
54
+ "email": "kyle@dontkry.com",
55
+ "homepage": "https://github.com/shama"
56
+ }
57
+ ],
58
+ "description": "A multi-framework Composer library installer",
59
+ "homepage": "https://composer.github.io/installers/",
60
+ "keywords": [
61
+ "Craft",
62
+ "Dolibarr",
63
+ "Eliasis",
64
+ "Hurad",
65
+ "ImageCMS",
66
+ "Kanboard",
67
+ "Lan Management System",
68
+ "MODX Evo",
69
+ "MantisBT",
70
+ "Mautic",
71
+ "Maya",
72
+ "OXID",
73
+ "Plentymarkets",
74
+ "Porto",
75
+ "RadPHP",
76
+ "SMF",
77
+ "Starbug",
78
+ "Thelia",
79
+ "Whmcs",
80
+ "WolfCMS",
81
+ "agl",
82
+ "aimeos",
83
+ "annotatecms",
84
+ "attogram",
85
+ "bitrix",
86
+ "cakephp",
87
+ "chef",
88
+ "cockpit",
89
+ "codeigniter",
90
+ "concrete5",
91
+ "croogo",
92
+ "dokuwiki",
93
+ "drupal",
94
+ "eZ Platform",
95
+ "elgg",
96
+ "expressionengine",
97
+ "fuelphp",
98
+ "grav",
99
+ "installer",
100
+ "itop",
101
+ "joomla",
102
+ "known",
103
+ "kohana",
104
+ "laravel",
105
+ "lavalite",
106
+ "lithium",
107
+ "magento",
108
+ "majima",
109
+ "mako",
110
+ "mediawiki",
111
+ "miaoxing",
112
+ "modulework",
113
+ "modx",
114
+ "moodle",
115
+ "osclass",
116
+ "pantheon",
117
+ "phpbb",
118
+ "piwik",
119
+ "ppi",
120
+ "processwire",
121
+ "puppet",
122
+ "pxcms",
123
+ "reindex",
124
+ "roundcube",
125
+ "shopware",
126
+ "silverstripe",
127
+ "sydes",
128
+ "sylius",
129
+ "symfony",
130
+ "tastyigniter",
131
+ "typo3",
132
+ "wordpress",
133
+ "yawik",
134
+ "zend",
135
+ "zikula"
136
+ ],
137
+ "support": {
138
+ "issues": "https://github.com/composer/installers/issues",
139
+ "source": "https://github.com/composer/installers/tree/v1.12.0"
140
+ },
141
+ "funding": [
142
+ {
143
+ "url": "https://packagist.com",
144
+ "type": "custom"
145
+ },
146
+ {
147
+ "url": "https://github.com/composer",
148
+ "type": "github"
149
+ },
150
+ {
151
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
152
+ "type": "tidelift"
153
+ }
154
+ ],
155
+ "install-path": "./installers"
156
+ },
157
+ {
158
+ "name": "skyverge/wc-plugin-framework",
159
+ "version": "5.10.0",
160
+ "version_normalized": "5.10.0.0",
161
+ "source": {
162
+ "type": "git",
163
+ "url": "https://github.com/skyverge/wc-plugin-framework.git",
164
+ "reference": "e230d7c40286854e49c0cafeec3398cbf2427a64"
165
+ },
166
+ "dist": {
167
+ "type": "zip",
168
+ "url": "https://api.github.com/repos/skyverge/wc-plugin-framework/zipball/e230d7c40286854e49c0cafeec3398cbf2427a64",
169
+ "reference": "e230d7c40286854e49c0cafeec3398cbf2427a64",
170
+ "shasum": ""
171
+ },
172
+ "require-dev": {
173
+ "lucatume/wp-browser": "^2.1"
174
+ },
175
+ "time": "2020-11-06T21:25:49+00:00",
176
+ "type": "library",
177
+ "installation-source": "dist",
178
+ "description": "The official SkyVerge WooCommerce plugin framework",
179
+ "support": {
180
+ "source": "https://github.com/skyverge/wc-plugin-framework/tree/5.10.0",
181
+ "issues": "https://github.com/skyverge/wc-plugin-framework/issues"
182
+ },
183
+ "install-path": "../skyverge/wc-plugin-framework"
184
+ },
185
+ {
186
+ "name": "woocommerce/action-scheduler-job-framework",
187
+ "version": "2.0.0",
188
+ "version_normalized": "2.0.0.0",
189
+ "source": {
190
+ "type": "git",
191
+ "url": "https://github.com/woocommerce/action-scheduler-job-framework.git",
192
+ "reference": "b0b21b9cc87e476ba7f8817050b39274ea7d6732"
193
+ },
194
+ "dist": {
195
+ "type": "zip",
196
+ "url": "https://api.github.com/repos/woocommerce/action-scheduler-job-framework/zipball/b0b21b9cc87e476ba7f8817050b39274ea7d6732",
197
+ "reference": "b0b21b9cc87e476ba7f8817050b39274ea7d6732",
198
+ "shasum": ""
199
+ },
200
+ "require": {
201
+ "php": ">=7.0"
202
+ },
203
+ "require-dev": {
204
+ "woocommerce/woocommerce-sniffs": "0.1.0"
205
+ },
206
+ "time": "2021-05-20T02:32:48+00:00",
207
+ "type": "library",
208
+ "installation-source": "dist",
209
+ "autoload": {
210
+ "psr-4": {
211
+ "Automattic\\WooCommerce\\ActionSchedulerJobFramework\\": "src/"
212
+ }
213
+ },
214
+ "scripts": {
215
+ "phpcs": [
216
+ "phpcs -s -p"
217
+ ]
218
+ },
219
+ "license": [
220
+ "GNU"
221
+ ],
222
+ "description": "A job framework for Action Scheduler (actionscheduler.org)",
223
+ "support": {
224
+ "source": "https://github.com/woocommerce/action-scheduler-job-framework/tree/2.0.0",
225
+ "issues": "https://github.com/woocommerce/action-scheduler-job-framework/issues"
226
+ },
227
+ "install-path": "../woocommerce/action-scheduler-job-framework"
228
  }
229
+ ],
230
+ "dev": false,
231
+ "dev-package-names": []
232
+ }
vendor/composer/installed.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php return array(
2
+ 'root' => array(
3
+ 'name' => 'facebookincubator/facebook-for-woocommerce',
4
+ 'pretty_version' => 'dev-release/2.6.17',
5
+ 'version' => 'dev-release/2.6.17',
6
+ 'reference' => 'c3ebfdc9f950171717d585dbac3a9b3ded54495b',
7
+ 'type' => 'wordpress-plugin',
8
+ 'install_path' => __DIR__ . '/../../',
9
+ 'aliases' => array(),
10
+ 'dev' => false,
11
+ ),
12
+ 'versions' => array(
13
+ 'composer/installers' => array(
14
+ 'pretty_version' => 'v1.12.0',
15
+ 'version' => '1.12.0.0',
16
+ 'reference' => 'd20a64ed3c94748397ff5973488761b22f6d3f19',
17
+ 'type' => 'composer-plugin',
18
+ 'install_path' => __DIR__ . '/./installers',
19
+ 'aliases' => array(),
20
+ 'dev_requirement' => false,
21
+ ),
22
+ 'facebookincubator/facebook-for-woocommerce' => array(
23
+ 'pretty_version' => 'dev-release/2.6.17',
24
+ 'version' => 'dev-release/2.6.17',
25
+ 'reference' => 'c3ebfdc9f950171717d585dbac3a9b3ded54495b',
26
+ 'type' => 'wordpress-plugin',
27
+ 'install_path' => __DIR__ . '/../../',
28
+ 'aliases' => array(),
29
+ 'dev_requirement' => false,
30
+ ),
31
+ 'roundcube/plugin-installer' => array(
32
+ 'dev_requirement' => false,
33
+ 'replaced' => array(
34
+ 0 => '*',
35
+ ),
36
+ ),
37
+ 'shama/baton' => array(
38
+ 'dev_requirement' => false,
39
+ 'replaced' => array(
40
+ 0 => '*',
41
+ ),
42
+ ),
43
+ 'skyverge/wc-plugin-framework' => array(
44
+ 'pretty_version' => '5.10.0',
45
+ 'version' => '5.10.0.0',
46
+ 'reference' => 'e230d7c40286854e49c0cafeec3398cbf2427a64',
47
+ 'type' => 'library',
48
+ 'install_path' => __DIR__ . '/../skyverge/wc-plugin-framework',
49
+ 'aliases' => array(),
50
+ 'dev_requirement' => false,
51
+ ),
52
+ 'woocommerce/action-scheduler-job-framework' => array(
53
+ 'pretty_version' => '2.0.0',
54
+ 'version' => '2.0.0.0',
55
+ 'reference' => 'b0b21b9cc87e476ba7f8817050b39274ea7d6732',
56
+ 'type' => 'library',
57
+ 'install_path' => __DIR__ . '/../woocommerce/action-scheduler-job-framework',
58
+ 'aliases' => array(),
59
+ 'dev_requirement' => false,
60
+ ),
61
+ ),
62
+ );
vendor/composer/platform_check.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // platform_check.php @generated by Composer
4
+
5
+ $issues = array();
6
+
7
+ if (!(PHP_VERSION_ID >= 70000)) {
8
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 7.0.0". You are running ' . PHP_VERSION . '.';
9
+ }
10
+
11
+ if ($issues) {
12
+ if (!headers_sent()) {
13
+ header('HTTP/1.1 500 Internal Server Error');
14
+ }
15
+ if (!ini_get('display_errors')) {
16
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
17
+ fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
18
+ } elseif (!headers_sent()) {
19
+ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
20
+ }
21
+ }
22
+ trigger_error(
23
+ 'Composer detected issues in your platform: ' . implode(' ', $issues),
24
+ E_USER_ERROR
25
+ );
26
+ }