Gutenberg Blocks – ACF Blocks Suite - Version 2.6.0

Version Description

  • New: Access to the Extendify template and pattern library
Download this release

Release Info

Developer munirkamal
Plugin Icon 128x128 Gutenberg Blocks – ACF Blocks Suite
Version 2.6.0
Comparing to
See all releases

Code changes from version 2.5.1 to 2.6.0

Files changed (131) hide show
  1. acf-blocks.php +52 -4
  2. {block-templates → acfblocks-templates}/free/acfb-accordion.php +0 -2
  3. {block-templates → acfblocks-templates}/free/acfb-business-hours.php +0 -2
  4. {block-templates → acfblocks-templates}/free/acfb-clicktotweet.php +0 -2
  5. {block-templates → acfblocks-templates}/free/acfb-counternumber.php +0 -2
  6. {block-templates → acfblocks-templates}/free/acfb-divider.php +0 -2
  7. {block-templates → acfblocks-templates}/free/acfb-facebook-page.php +0 -0
  8. {block-templates → acfblocks-templates}/free/acfb-fb-like-button.php +0 -0
  9. {block-templates → acfblocks-templates}/free/acfb-image-slider.php +0 -2
  10. {block-templates → acfblocks-templates}/free/acfb-meta-display.php +0 -2
  11. {block-templates → acfblocks-templates}/free/acfb-multibuttons.php +0 -2
  12. {block-templates → acfblocks-templates}/free/acfb-photocollage.php +0 -0
  13. {block-templates → acfblocks-templates}/free/acfb-posts.php +0 -2
  14. {block-templates → acfblocks-templates}/free/acfb-pricelist.php +0 -2
  15. {block-templates → acfblocks-templates}/free/acfb-pricingbox.php +0 -2
  16. {block-templates → acfblocks-templates}/free/acfb-progressbar.php +0 -2
  17. {block-templates → acfblocks-templates}/free/acfb-random-image.php +0 -0
  18. {block-templates → acfblocks-templates}/free/acfb-scrollable-image.php +0 -0
  19. {block-templates → acfblocks-templates}/free/acfb-socialsharing.php +0 -2
  20. {block-templates → acfblocks-templates}/free/acfb-starrating.php +0 -3
  21. {block-templates → acfblocks-templates}/free/acfb-tabs.php +0 -3
  22. {block-templates → acfblocks-templates}/free/acfb-team.php +0 -2
  23. {block-templates → acfblocks-templates}/free/acfb-testimonial.php +0 -2
  24. {block-templates → acfblocks-templates}/free/acfb-toggle.php +0 -2
  25. block-templates/functions/function.php +0 -56
  26. extendify-sdk/.editorconfig +16 -0
  27. extendify-sdk/.eslintignore +3 -0
  28. extendify-sdk/.eslintrc.js +82 -0
  29. extendify-sdk/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  30. extendify-sdk/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  31. extendify-sdk/.github/workflows/build-and-test.yml +62 -0
  32. extendify-sdk/.github/workflows/build-development-zip.yml +70 -0
  33. extendify-sdk/.github/workflows/force-production-on-main.yml +66 -0
  34. extendify-sdk/.gitignore +10 -0
  35. extendify-sdk/.phpcs.xml.dist +179 -0
  36. extendify-sdk/.svgrrc +20 -0
  37. extendify-sdk/app/Admin.php +111 -0
  38. extendify-sdk/app/ApiRouter.php +150 -0
  39. extendify-sdk/app/App.php +93 -0
  40. extendify-sdk/app/Controllers/CategoryController.php +42 -0
  41. extendify-sdk/app/Controllers/PluginController.php +61 -0
  42. extendify-sdk/app/Controllers/TemplateController.php +53 -0
  43. extendify-sdk/app/Http.php +145 -0
  44. extendify-sdk/app/Plugin.php +335 -0
  45. extendify-sdk/app/User.php +108 -0
  46. extendify-sdk/bootstrap.php +30 -0
  47. extendify-sdk/composer.json +16 -0
  48. extendify-sdk/composer.lock +2456 -0
  49. extendify-sdk/config.json +6 -0
  50. extendify-sdk/extendify-sdk.php +55 -0
  51. extendify-sdk/loader.php +61 -0
  52. extendify-sdk/package-lock.json +16573 -0
  53. extendify-sdk/package.json +57 -0
  54. extendify-sdk/public/.gitkeep +0 -0
  55. extendify-sdk/public/build/extendify-sdk.css +2 -0
  56. extendify-sdk/public/build/extendify-sdk.js +2 -0
  57. extendify-sdk/public/build/extendify-sdk.js.LICENSE.txt +5 -0
  58. extendify-sdk/readme.md +15 -0
  59. extendify-sdk/readme.txt +5 -0
  60. extendify-sdk/routes/api.php +26 -0
  61. extendify-sdk/src/gutenberg/api/Categories.js +9 -0
  62. extendify-sdk/src/gutenberg/api/Plugins.js +23 -0
  63. extendify-sdk/src/gutenberg/api/Templates.js +25 -0
  64. extendify-sdk/src/gutenberg/api/index.js +65 -0
  65. extendify-sdk/src/gutenberg/assets/icons/index.js +51 -0
  66. extendify-sdk/src/gutenberg/base/templates-library/index.js +47 -0
  67. extendify-sdk/src/gutenberg/components/library-auth/api-form.js +89 -0
  68. extendify-sdk/src/gutenberg/components/library-auth/index.js +67 -0
  69. extendify-sdk/src/gutenberg/components/library-auth/style.scss +24 -0
  70. extendify-sdk/src/gutenberg/components/library-content/index.js +83 -0
  71. extendify-sdk/src/gutenberg/components/library-content/style.scss +49 -0
  72. extendify-sdk/src/gutenberg/components/library-imports-counter/index.js +38 -0
  73. extendify-sdk/src/gutenberg/components/library-imports-counter/style.scss +0 -0
  74. extendify-sdk/src/gutenberg/components/library-load-more/index.js +113 -0
  75. extendify-sdk/src/gutenberg/components/library-load-more/style.scss +4 -0
  76. extendify-sdk/src/gutenberg/components/library-modal/index.js +163 -0
  77. extendify-sdk/src/gutenberg/components/library-modal/style.scss +66 -0
  78. extendify-sdk/src/gutenberg/components/library-not-found/index.js +37 -0
  79. extendify-sdk/src/gutenberg/components/library-not-found/style.scss +5 -0
  80. extendify-sdk/src/gutenberg/components/library-search/index.js +45 -0
  81. extendify-sdk/src/gutenberg/components/library-sidebar-section/index.js +18 -0
  82. extendify-sdk/src/gutenberg/components/library-sidebar-section/style.scss +10 -0
  83. extendify-sdk/src/gutenberg/components/library-sidebar/index.js +227 -0
  84. extendify-sdk/src/gutenberg/components/library-sidebar/style.scss +44 -0
  85. extendify-sdk/src/gutenberg/components/library-template-preview/index.js +192 -0
  86. extendify-sdk/src/gutenberg/components/library-template-preview/style.scss +71 -0
  87. extendify-sdk/src/gutenberg/components/library-template/index.js +89 -0
  88. extendify-sdk/src/gutenberg/components/library-template/style.scss +27 -0
  89. extendify-sdk/src/gutenberg/functions/index.js +112 -0
  90. extendify-sdk/src/gutenberg/global/index.js +1 -0
  91. extendify-sdk/src/gutenberg/listeners/index.js +5 -0
  92. extendify-sdk/src/gutenberg/listeners/softerror-encountered.js +28 -0
  93. extendify-sdk/src/gutenberg/listeners/template-inserted.js +9 -0
  94. extendify-sdk/src/gutenberg/middleware/hasPluginsActivated/ActivatePluginsModal.js +64 -0
  95. extendify-sdk/src/gutenberg/middleware/hasPluginsActivated/ActivatingModal.js +70 -0
  96. extendify-sdk/src/gutenberg/middleware/hasPluginsActivated/index.js +22 -0
  97. extendify-sdk/src/gutenberg/middleware/hasRequiredPlugins/InstallingModal.js +69 -0
  98. extendify-sdk/src/gutenberg/middleware/hasRequiredPlugins/RequiredPluginsModal.js +69 -0
  99. extendify-sdk/src/gutenberg/middleware/hasRequiredPlugins/index.js +22 -0
  100. extendify-sdk/src/gutenberg/middleware/helpers.js +63 -0
  101. extendify-sdk/src/gutenberg/middleware/index.js +49 -0
  102. extendify-sdk/src/gutenberg/middleware/needsPageReload/ReloadRequiredModal.js +46 -0
  103. extendify-sdk/src/gutenberg/middleware/needsPageReload/index.js +18 -0
  104. extendify-sdk/src/gutenberg/plugins/header-btn/index.js +65 -0
  105. extendify-sdk/src/gutenberg/plugins/header-btn/style.scss +10 -0
  106. extendify-sdk/src/gutenberg/plugins/index.js +2 -0
  107. extendify-sdk/src/gutenberg/plugins/more-menu-btn/index.js +64 -0
  108. extendify-sdk/src/gutenberg/plugins/more-menu-btn/style.scss +5 -0
  109. extendify-sdk/src/gutenberg/scss/_mixins.scss +62 -0
  110. extendify-sdk/src/gutenberg/scss/_variables.scss +0 -0
  111. extendify-sdk/src/gutenberg/store/actions/index.js +118 -0
  112. extendify-sdk/src/gutenberg/store/controls/index.js +9 -0
  113. extendify-sdk/src/gutenberg/store/index.js +42 -0
  114. extendify-sdk/src/gutenberg/store/reducer/index.js +167 -0
  115. extendify-sdk/src/gutenberg/store/resolvers/index.js +25 -0
  116. extendify-sdk/src/gutenberg/store/selectors/index.js +138 -0
  117. extendify-sdk/src/index.js +25 -0
  118. extendify-sdk/src/style.scss +47 -0
  119. extendify-sdk/vendor/autoload.php +7 -0
  120. extendify-sdk/vendor/composer/ClassLoader.php +445 -0
  121. extendify-sdk/vendor/composer/InstalledVersions.php +654 -0
  122. extendify-sdk/vendor/composer/LICENSE +21 -0
  123. extendify-sdk/vendor/composer/autoload_classmap.php +9 -0
  124. extendify-sdk/vendor/composer/autoload_namespaces.php +9 -0
  125. extendify-sdk/vendor/composer/autoload_psr4.php +10 -0
  126. extendify-sdk/vendor/composer/autoload_real.php +55 -0
  127. extendify-sdk/vendor/composer/autoload_static.php +31 -0
  128. extendify-sdk/vendor/composer/installed.json +1 -0
  129. extendify-sdk/vendor/composer/installed.php +395 -0
  130. extendify-sdk/webpack.config.js +140 -0
  131. readme.txt +25 -4
acf-blocks.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: ACF Blocks Suite
5
  * Plugin URI: https://acfblocks.com/
6
  * Description: Supercharge your Gutenberg editor with high quality beautiful WordPress blocks. Ready-to-use ACF Blocks!
7
- * Version: 2.5.1
8
  * Author: munirkamal
9
  * Author URI: https://munirkamal.wordpress.com
10
  * License: GPL2
@@ -15,6 +15,7 @@
15
  if ( !defined( 'ABSPATH' ) ) {
16
  exit;
17
  }
 
18
 
19
  if ( function_exists( 'acfb_fs' ) ) {
20
  acfb_fs()->set_basename( false, __FILE__ );
@@ -402,12 +403,12 @@ if ( function_exists( 'acfb_fs' ) ) {
402
  $acfb_temp = str_replace( "acf/", "", $block['name'] );
403
  // Look for a file in theme
404
 
405
- if ( $theme_template = locate_template( 'block-templates/' . $acfb_temp . '.php' ) ) {
406
  require $theme_template;
407
  } else {
408
  // Nothing found, let's look in our plugin
409
- $free_template = plugin_dir_path( __FILE__ ) . 'block-templates/free/' . $acfb_temp . '.php';
410
- $pro_template = plugin_dir_path( __FILE__ ) . 'block-templates/pro/' . $acfb_temp . '.php';
411
  if ( file_exists( $free_template ) ) {
412
  require $free_template;
413
  }
@@ -712,6 +713,53 @@ if ( function_exists( 'acfb_fs' ) ) {
712
  // Adding .json extension
713
  return $acfb_mime_types;
714
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
715
 
716
  }
717
 
4
  * Plugin Name: ACF Blocks Suite
5
  * Plugin URI: https://acfblocks.com/
6
  * Description: Supercharge your Gutenberg editor with high quality beautiful WordPress blocks. Ready-to-use ACF Blocks!
7
+ * Version: 2.6.0
8
  * Author: munirkamal
9
  * Author URI: https://munirkamal.wordpress.com
10
  * License: GPL2
15
  if ( !defined( 'ABSPATH' ) ) {
16
  exit;
17
  }
18
+ require_once plugin_dir_path( __FILE__ ) . 'extendify-sdk/loader.php';
19
 
20
  if ( function_exists( 'acfb_fs' ) ) {
21
  acfb_fs()->set_basename( false, __FILE__ );
403
  $acfb_temp = str_replace( "acf/", "", $block['name'] );
404
  // Look for a file in theme
405
 
406
+ if ( $theme_template = locate_template( 'acfblocks-templates/' . $acfb_temp . '.php' ) ) {
407
  require $theme_template;
408
  } else {
409
  // Nothing found, let's look in our plugin
410
+ $free_template = plugin_dir_path( __FILE__ ) . 'acfblocks-templates/free/' . $acfb_temp . '.php';
411
+ $pro_template = plugin_dir_path( __FILE__ ) . 'acfblocks-templates/pro/' . $acfb_temp . '.php';
412
  if ( file_exists( $free_template ) ) {
413
  require $free_template;
414
  }
713
  // Adding .json extension
714
  return $acfb_mime_types;
715
  }
716
+
717
+ // Functions Code
718
+ function parse_link( $fields )
719
+ {
720
+ $acfb_families = array();
721
+ foreach ( $fields as $key => $field ) {
722
+
723
+ if ( is_array( $field ) and array_key_exists( 'font_family', $field ) ) {
724
+ $acfb_font_family = $field['font_family'];
725
+ if ( $acfb_font_family !== "" and $acfb_font_family !== NULL and $acfb_font_family !== 'default' ) {
726
+ $acfb_families[] = $acfb_font_family;
727
+ }
728
+ }
729
+
730
+ }
731
+
732
+ if ( !empty($acfb_families) ) {
733
+ $family_merges = join( '&family=', $acfb_families );
734
+ return "<link href='https://fonts.googleapis.com/css2?family={$family_merges}' rel='stylesheet'>";
735
+ } else {
736
+ return "";
737
+ }
738
+
739
+ }
740
+
741
+ function get_family( $family )
742
+ {
743
+ return str_replace( '+', " ", $family );
744
+ }
745
+
746
+ function getCustomField( $field_name, $post_id )
747
+ {
748
+ $selected_field = get_field( $field_name );
749
+ $selected_field_data = json_decode( $selected_field, true );
750
+ return [
751
+ 'type' => $selected_field_data['type'],
752
+ 'value' => get_field( $selected_field_data['name'], $post_id ),
753
+ ];
754
+ }
755
+
756
+ // retrieves the attachment ID from the file URL for acf meta gallery
757
+ function acfb_meta_gallery_get_image_id( $acfb_meta_gallery_image_url )
758
+ {
759
+ global $wpdb ;
760
+ $attachment = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE guid='%s';", $acfb_meta_gallery_image_url ) );
761
+ return $attachment[0];
762
+ }
763
 
764
  }
765
 
{block-templates → acfblocks-templates}/free/acfb-accordion.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_accordion_title_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_accordion_title_typo'),
{block-templates → acfblocks-templates}/free/acfb-business-hours.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_bh_text_typo')
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_bh_text_typo')
{block-templates → acfblocks-templates}/free/acfb-clicktotweet.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_click_to_tweet_text_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_click_to_tweet_text_typo'),
{block-templates → acfblocks-templates}/free/acfb-counternumber.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_counter_number_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_counter_number_typo'),
{block-templates → acfblocks-templates}/free/acfb-divider.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  $uid = $block['id'];
5
 
6
  $className = 'acfb_divider_block';
1
  <?php
 
 
2
  $uid = $block['id'];
3
 
4
  $className = 'acfb_divider_block';
{block-templates → acfblocks-templates}/free/acfb-facebook-page.php RENAMED
File without changes
{block-templates → acfblocks-templates}/free/acfb-fb-like-button.php RENAMED
File without changes
{block-templates → acfblocks-templates}/free/acfb-image-slider.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_slider_caption_typo')
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_slider_caption_typo')
{block-templates → acfblocks-templates}/free/acfb-meta-display.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  $acfb_meta_display_post_id = (int)get_field('post_id'); # hidden field in order to obtain post id
5
  $acfb_meta_field = getCustomField('acfb_meta_select_field', $acfb_meta_display_post_id);
6
 
1
  <?php
 
 
2
  $acfb_meta_display_post_id = (int)get_field('post_id'); # hidden field in order to obtain post id
3
  $acfb_meta_field = getCustomField('acfb_meta_select_field', $acfb_meta_display_post_id);
4
 
{block-templates → acfblocks-templates}/free/acfb-multibuttons.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_multibutton_text_typo')
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_multibutton_text_typo')
{block-templates → acfblocks-templates}/free/acfb-photocollage.php RENAMED
File without changes
{block-templates → acfblocks-templates}/free/acfb-posts.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_post_title_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_post_title_typo'),
{block-templates → acfblocks-templates}/free/acfb-pricelist.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_price_list_title_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_price_list_title_typo'),
{block-templates → acfblocks-templates}/free/acfb-pricingbox.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_pricingbox_title_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_pricingbox_title_typo'),
{block-templates → acfblocks-templates}/free/acfb-progressbar.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_progressbar_text_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_progressbar_text_typo'),
{block-templates → acfblocks-templates}/free/acfb-random-image.php RENAMED
File without changes
{block-templates → acfblocks-templates}/free/acfb-scrollable-image.php RENAMED
File without changes
{block-templates → acfblocks-templates}/free/acfb-socialsharing.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_social_button_text_typo')
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_social_button_text_typo')
{block-templates → acfblocks-templates}/free/acfb-starrating.php RENAMED
@@ -1,7 +1,4 @@
1
  <?php
2
-
3
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
4
-
5
  echo parse_link(
6
  array(
7
  get_field('acfb_rating_before_text_typo')
1
  <?php
 
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_rating_before_text_typo')
{block-templates → acfblocks-templates}/free/acfb-tabs.php RENAMED
@@ -1,7 +1,4 @@
1
  <?php
2
-
3
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
4
-
5
  echo parse_link(
6
  array(
7
  get_field('acfb_tab_title_typo'),
1
  <?php
 
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_tab_title_typo'),
{block-templates → acfblocks-templates}/free/acfb-team.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_team_name_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_team_name_typo'),
{block-templates → acfblocks-templates}/free/acfb-testimonial.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_testimonial_text_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_testimonial_text_typo'),
{block-templates → acfblocks-templates}/free/acfb-toggle.php RENAMED
@@ -1,6 +1,4 @@
1
  <?php
2
- require_once plugin_dir_path( __DIR__ ) . 'functions/function.php';
3
-
4
  echo parse_link(
5
  array(
6
  get_field('acfb_toggle_title_typo'),
1
  <?php
 
 
2
  echo parse_link(
3
  array(
4
  get_field('acfb_toggle_title_typo'),
block-templates/functions/function.php DELETED
@@ -1,56 +0,0 @@
1
- <?php
2
- function parse_link( $fields ) {
3
-
4
- $acfb_families = array();
5
-
6
-
7
- foreach ( $fields as $key => $field ) {
8
-
9
- if (is_array($field) and array_key_exists('font_family', $field) ) {
10
-
11
- $acfb_font_family = $field['font_family'];
12
-
13
- if ( $acfb_font_family !== "" and $acfb_font_family !== NULL and $acfb_font_family !== 'default' ) {
14
- $acfb_families[] = $acfb_font_family;
15
- }
16
-
17
- }
18
-
19
- }
20
-
21
- if (!empty($acfb_families)) {
22
- $family_merges = join('&family=', $acfb_families);
23
-
24
- return "<link href='https://fonts.googleapis.com/css2?family=$family_merges' rel='stylesheet'>";
25
-
26
- } else return "";
27
-
28
-
29
- }
30
-
31
-
32
- function get_family( $family ) {
33
- return str_replace('+', " ", $family);
34
- }
35
-
36
-
37
-
38
-
39
- function getCustomField($field_name, $post_id){
40
-
41
- $selected_field = get_field($field_name);
42
- $selected_field_data = json_decode($selected_field, true);
43
-
44
- return [
45
- 'type' => $selected_field_data['type'],
46
- 'value' => get_field($selected_field_data['name'], $post_id)
47
- ];
48
- }
49
-
50
-
51
- // retrieves the attachment ID from the file URL for acf meta gallery
52
- function acfb_meta_gallery_get_image_id($acfb_meta_gallery_image_url) {
53
- global $wpdb;
54
- $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $acfb_meta_gallery_image_url ));
55
- return $attachment[0];
56
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
extendify-sdk/.editorconfig ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = space
8
+ indent_size = 4
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.yml]
12
+ indent_style = space
13
+ indent_size = 2
14
+
15
+ [*.md]
16
+ trim_trailing_whitespace = false
extendify-sdk/.eslintignore ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ node_modules/*
2
+ vendor/*
3
+ public/build/*
extendify-sdk/.eslintrc.js ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ env: {
3
+ browser: true,
4
+ es2021: true,
5
+ jest: true,
6
+ },
7
+ extends: ['eslint:recommended', 'plugin:react/recommended', 'plugin:react-hooks/recommended'],
8
+ parserOptions: {
9
+ ecmaFeatures: {
10
+ jsx: true,
11
+ },
12
+ sourceType: 'module',
13
+ },
14
+ plugins: ['react'],
15
+ rules: {
16
+ indent: ['error', 4, {
17
+ SwitchCase: 1,
18
+ }],
19
+ quotes: ['error', 'single'],
20
+ 'comma-dangle': ['error', 'always-multiline'],
21
+ 'multiline-ternary': ['error', 'always'],
22
+ 'array-element-newline': ['error', 'consistent'],
23
+ 'no-constant-condition': ['error', {
24
+ checkLoops: false,
25
+ }],
26
+ 'space-before-function-paren': [
27
+ 'error',
28
+ {
29
+ anonymous: 'always',
30
+ named: 'never',
31
+ asyncArrow: 'always',
32
+ },
33
+ ],
34
+ 'react/react-in-jsx-scope': 'off',
35
+ 'function-paren-newline': [
36
+ 'error',
37
+ {
38
+ minItems: 3,
39
+ },
40
+ ],
41
+ 'quote-props': ['error', 'as-needed'],
42
+ 'object-curly-spacing': ['error', 'always'],
43
+ 'no-multiple-empty-lines': [
44
+ 'error',
45
+ {
46
+ max: 1,
47
+ },
48
+ ],
49
+ 'react/prop-types': 0, // TODO: Do we want this required?
50
+ 'lines-around-comment': [
51
+ 'error',
52
+ {
53
+ beforeBlockComment: true,
54
+ allowBlockStart: true,
55
+ },
56
+ ],
57
+ 'object-curly-newline': [
58
+ 'error',
59
+ {
60
+ ObjectExpression: {
61
+ minProperties: 1,
62
+ },
63
+ ObjectPattern: {
64
+ multiline: true,
65
+ },
66
+ ImportDeclaration: {
67
+ multiline: true,
68
+ minProperties: 3,
69
+ },
70
+ ExportDeclaration: {
71
+ multiline: true,
72
+ minProperties: 3,
73
+ },
74
+ },
75
+ ],
76
+ },
77
+ settings: {
78
+ react: {
79
+ version: 'detect',
80
+ },
81
+ },
82
+ }
extendify-sdk/.github/ISSUE_TEMPLATE/bug_report.md ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Screenshots**
24
+ Provide a screenshot of the browser console showing any errors, if applicable ([instructions](https://support.airtable.com/hc/en-us/articles/232313848-How-to-open-the-developer-console)).
25
+ Also include any screenshots that demonstrate the issue more clearly.
26
+
27
+ **Desktop (please complete the following information):**
28
+ - OS: [e.g. iOS]
29
+ - Browser [e.g. chrome, safari]
30
+ - Version [e.g. 22]
31
+
32
+ **Smartphone (please complete the following information):**
33
+ - Device: [e.g. iPhone6]
34
+ - OS: [e.g. iOS8.1]
35
+ - Browser [e.g. stock browser, safari]
36
+ - Version [e.g. 22]
37
+
38
+ **Additional context**
39
+ Add any other context about the problem here.
extendify-sdk/.github/ISSUE_TEMPLATE/feature_request.md ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
extendify-sdk/.github/workflows/build-and-test.yml ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Build and test
2
+ on: [push, pull_request]
3
+ jobs:
4
+ # TODO: create another job for integration testing that includes Cypress, booting up WPO, etc
5
+ # Reference wp-cli: https://github.com/wp-cli/wp-cli/blob/master/.github/workflows/testing.yml
6
+ unit: #-------------------------------------------
7
+ name: PHP ${{ matrix.php }}
8
+ runs-on: ubuntu-latest
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ php: ['7.4']
13
+ steps:
14
+ - name: Check out source code
15
+ uses: actions/checkout@v2
16
+
17
+ - name: Setup PHP
18
+ uses: shivammathur/setup-php@v2
19
+ with:
20
+ php-version: '${{ matrix.php }}'
21
+ extensions: mysql, zip
22
+ coverage: none
23
+ tools: composer:v1, wp-cli, cs2pr, phpcs
24
+
25
+ - name: Get Composer cache directory
26
+ id: composer-cache
27
+ run: |
28
+ echo "::set-output name=dir::$(composer config cache-files-dir)"
29
+
30
+ - name: Use Composer cache
31
+ uses: actions/cache@master
32
+ with:
33
+ path: ${{ steps['composer-cache'].outputs.dir }}
34
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
35
+ restore-keys: |
36
+ ${{ runner.os }}-composer-
37
+
38
+ - name: Install dependencies
39
+ run: composer install --prefer-dist --no-progress --no-suggest
40
+
41
+ - name: Install PHPCS
42
+ run: git clone -b master https://github.com/WordPress/WordPress-Coding-Standards.git ${{ github.workspace }}/wpcs
43
+
44
+ - name: PHPCS check
45
+ run: |
46
+ phpcs --config-set installed_paths ${{ github.workspace }}/vendor/phpcompatibility/phpcompatibility-wp/PHPCompatibilityWP,${{ github.workspace }}/vendor/phpcompatibility/php-compatibility/PHPCompatibility,${{ github.workspace }}/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieSodiumCompat,${{ github.workspace }}/vendor/phpcompatibility/phpcompatibility-paragonie/PHPCompatibilityParagonieRandomCompat,${{ github.workspace }}/wpcs
47
+ phpcs -i
48
+ phpcs -q --report=checkstyle . | cs2pr
49
+
50
+ - name: Install NPM packages
51
+ run: npm ci
52
+ env:
53
+ CYPRESS_INSTALL_BINARY: "0"
54
+
55
+ - name: Build assets
56
+ run: npm run build
57
+
58
+ - name: Test JavaScript
59
+ run: npm run test
60
+
61
+ - name: Lint JavaScript
62
+ run: npm run lint
extendify-sdk/.github/workflows/build-development-zip.yml ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Build development zip file
2
+ on: push
3
+ jobs:
4
+ build:
5
+ name: Build test, and zip
6
+ runs-on: ubuntu-latest
7
+ strategy:
8
+ fail-fast: false
9
+ matrix:
10
+ php: [8.0]
11
+ node-version: [14.x]
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v1
15
+
16
+ - name: Setup PHP
17
+ uses: shivammathur/setup-php@v2
18
+ with:
19
+ php-version: '${{ matrix.php }}'
20
+ tools: composer:v1
21
+
22
+ - name: Get Composer cache directory
23
+ id: composer-cache
24
+ run: |
25
+ echo "::set-output name=dir::$(composer config cache-files-dir)"
26
+ - name: Use Composer cache
27
+ uses: actions/cache@master
28
+ with:
29
+ path: ${{ steps['composer-cache'].outputs.dir }}
30
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
31
+ restore-keys: |
32
+ ${{ runner.os }}-composer-
33
+ - name: Build autoloader
34
+ run: composer install --prefer-dist --no-progress --no-suggest --no-dev
35
+
36
+ - name: Using Node version ${{ matrix.node-version }}
37
+ uses: actions/setup-node@v1
38
+ with:
39
+ node-version: ${{ matrix.node-version }}
40
+ - name: npm install, build, and test
41
+ run: |
42
+ npm ci
43
+ npm run dev
44
+ touch .devbuild
45
+ env:
46
+ CI: true
47
+ - name: Package
48
+ uses: actions/upload-artifact@v2
49
+ with:
50
+ name: extendify-sdk
51
+ retention-days: 5
52
+ path: |
53
+ ${{ github.workspace }}/
54
+ !${{ github.workspace }}/node_modules/
55
+ !${{ github.workspace }}/.github/
56
+ !${{ github.workspace }}/.git/
57
+ !${{ github.workspace }}/src/
58
+ !${{ github.workspace }}/.editorconfig
59
+ !${{ github.workspace }}/.eslintrc.js
60
+ !${{ github.workspace }}/.eslintignore
61
+ !${{ github.workspace }}/.gitignore
62
+ !${{ github.workspace }}/.svgrrc
63
+ !${{ github.workspace }}/.prettierrc.js
64
+ !${{ github.workspace }}/.phpcs.xml.dist
65
+ !${{ github.workspace }}/webpack.config.js
66
+ !${{ github.workspace }}/composer.json
67
+ !${{ github.workspace }}/composer.lock
68
+ !${{ github.workspace }}/package.json
69
+ !${{ github.workspace }}/package-lock.json
70
+ !${{ github.workspace }}/readme.md
extendify-sdk/.github/workflows/force-production-on-main.yml ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Build production assets
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ jobs:
7
+ build:
8
+ name: Build and commit
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ php: [8.0]
14
+ node-version: [14.x]
15
+ steps:
16
+ - name: Checkout code
17
+ uses: actions/checkout@v1
18
+
19
+ - name: Set up git user
20
+ run: git config --global user.name extendify
21
+ - name: Set up git email
22
+ run: git config --global user.name extendify@users.noreply.github.com
23
+
24
+ - name: Setup PHP
25
+ uses: shivammathur/setup-php@v2
26
+ with:
27
+ php-version: '${{ matrix.php }}'
28
+ extensions: mysql, zip
29
+ coverage: none
30
+ tools: composer:v1, wp-cli, cs2pr, phpcs
31
+
32
+ - name: Get Composer cache directory
33
+ id: composer-cache
34
+ run: |
35
+ echo "::set-output name=dir::$(composer config cache-files-dir)"
36
+ - name: Use Composer cache
37
+ uses: actions/cache@master
38
+ with:
39
+ path: ${{ steps['composer-cache'].outputs.dir }}
40
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
41
+ restore-keys: |
42
+ ${{ runner.os }}-composer-
43
+ - name: Build autoloader
44
+ run: composer install --prefer-dist --no-progress --no-suggest --no-dev
45
+
46
+ - name: Using Node version ${{ matrix.node-version }}
47
+ uses: actions/setup-node@v1
48
+ with:
49
+ node-version: ${{ matrix.node-version }}
50
+ - name: npm install, build, and test
51
+ run: |
52
+ npm ci
53
+ npm run build
54
+ env:
55
+ CI: true
56
+ - name: Increment version number
57
+ run: |
58
+ perl -i -pe 's/(Stable tag: )([\d.]+)$/$1.($2+.1)/e' readme.txt
59
+ - name: Commit dist folder if needed #it fails if nothing has changed so we allow an error
60
+ run: git commit -am 'Build produciton assets'
61
+ continue-on-error: true
62
+ - name: Push changed files to main
63
+ uses: ad-m/github-push-action@master
64
+ with:
65
+ github_token: ${{ secrets.GITHUB_TOKEN }}
66
+ branch: main
extendify-sdk/.gitignore ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ node_modules
2
+
3
+ .DS_Store
4
+ .vscode
5
+
6
+ vendor/*
7
+ !vendor/composer
8
+ !vendor/autoload.php
9
+
10
+ wpcs
extendify-sdk/.phpcs.xml.dist ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="extendify-sdk" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">
3
+
4
+ <description>WP Plugin checks</description>
5
+
6
+ <!-- Exclude the Composer Vendor directory. -->
7
+ <exclude-pattern>/vendor/*</exclude-pattern>
8
+
9
+ <exclude-pattern>/cypress/*</exclude-pattern>
10
+ <exclude-pattern>/.github/*</exclude-pattern>
11
+ <exclude-pattern>/tests/*</exclude-pattern>
12
+ <exclude-pattern>/public/*</exclude-pattern>
13
+ <exclude-pattern>/wpcs/*</exclude-pattern>
14
+
15
+ <!-- Exclude the Node Modules directory. -->
16
+ <exclude-pattern>/node_modules/*</exclude-pattern>
17
+
18
+ <!-- Exclude CSS and Javascript files. -->
19
+ <exclude-pattern>*.css</exclude-pattern>
20
+ <exclude-pattern>*.js</exclude-pattern>
21
+
22
+ <!-- Include the WordPress-Extra standard. -->
23
+ <rule ref="WordPress-Extra">
24
+ <!--
25
+ We may want a middle ground though. The best way to do this is add the
26
+ entire ruleset, then rule by rule, remove ones that don't suit a project.
27
+ We can do this by running `phpcs` with the '-s' flag, which allows us to
28
+ see the names of the sniffs reporting errors.
29
+ Once we know the sniff names, we can opt to exclude sniffs which don't
30
+ suit our project like so.
31
+
32
+ The below two examples just show how you can exclude rules.
33
+ They are not intended as advice about which sniffs to exclude.
34
+ -->
35
+
36
+ <!--
37
+ <exclude name="WordPress.WhiteSpace.ControlStructureSpacing"/>
38
+ <exclude name="WordPress.Security.EscapeOutput"/>
39
+ -->
40
+ </rule>
41
+
42
+ <rule ref="WordPress">
43
+ <exclude name="WordPress.Files.FileName.NotHyphenatedLowercase" />
44
+ <exclude name="WordPress.Files.FileName.InvalidClassFileName" />
45
+ <exclude name="WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedNamespaceFound" />
46
+ <exclude name="WordPress.WhiteSpace.ControlStructureSpacing.NoSpaceAfterOpenParenthesis" />
47
+ <exclude name="WordPress.WhiteSpace.ControlStructureSpacing.NoSpaceBeforeCloseParenthesis" />
48
+ <exclude name="WordPress.WhiteSpace.OperatorSpacing.NoSpaceBefore" />
49
+ <exclude name="WordPress.WhiteSpace.OperatorSpacing.NoSpaceAfter" />
50
+ <exclude name="WordPress.WhiteSpace.ControlStructureSpacing.ExtraSpaceAfterCloseParenthesis" />
51
+ <exclude name="WordPress.Arrays.ArrayDeclarationSpacing.NoSpaceAfterArrayOpener" />
52
+ <exclude name="WordPress.Arrays.ArrayDeclarationSpacing.NoSpaceBeforeArrayCloser" />
53
+ <exclude name="WordPress.Arrays.MultipleStatementAlignment.DoubleArrowNotAligned" />
54
+ <exclude name="WordPress.NamingConventions.ValidVariableName.PropertyNotSnakeCase" />
55
+ <exclude name="WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid" />
56
+ <exclude name="WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase" />
57
+ <exclude name="WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase" />
58
+ <exclude name="WordPress.Arrays.ArrayKeySpacingRestrictions.NoSpacesAroundArrayKeys" />
59
+ <exclude name="WordPress.PHP.YodaConditions.NotYoda" />
60
+ <exclude name="WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid" />
61
+ <exclude name="WordPress.NamingConventions.ValidVariableName.InterpolatedVariableNotSnakeCase" />
62
+ </rule>
63
+
64
+ <rule ref="Generic">
65
+ <exclude name="Generic.WhiteSpace.DisallowSpaceIndent.SpacesUsed" />
66
+ <exclude name="Generic.WhiteSpace.DisallowSpaceIndent.SpacesUsed" />
67
+ <exclude name="Generic.PHP.ClosingPHPTag.NotFound" />
68
+ <exclude name="Generic.Files.LowercasedFilename.NotFound" />
69
+ <exclude name="Generic.Formatting.SpaceAfterNot.Incorrect" />
70
+ <exclude name="Generic.Classes.OpeningBraceSameLine.BraceOnNewLine" />
71
+ <exclude name="Generic.Files.EndFileNoNewline.Found" />
72
+ <exclude name="Generic.Functions.OpeningFunctionBraceKernighanRitchie.BraceOnNewLine" />
73
+ <exclude name="Generic.Files.LineLength.TooLong" />
74
+ <exclude name="Generic.Arrays.DisallowShortArraySyntax.Found" />
75
+ <exclude name="Generic.Commenting.Todo.TaskFound" />
76
+ <exclude name="Generic.Formatting.NoSpaceAfterCast.SpaceFound" />
77
+ <exclude name="Generic.Formatting.MultipleStatementAlignment.NotSame" />
78
+ <exclude name="Generic.PHP.RequireStrictTypes.MissingDeclaration" />
79
+ <exclude name="Generic.PHP.UpperCaseConstant.Found" />
80
+ <exclude name="Generic.WhiteSpace.ArbitraryParenthesesSpacing.SpaceBeforeOpen" />
81
+ <exclude name="Generic.WhiteSpace.ArbitraryParenthesesSpacing.SpaceBeforeClose" />
82
+ <exclude name="Generic.WhiteSpace.ArbitraryParenthesesSpacing.SpaceAfterOpen" />
83
+ <exclude name="Generic.WhiteSpace.ArbitraryParenthesesSpacing.SpaceAfterClose" />
84
+ <exclude name="Generic.PHP.ForbiddenFunctions.Found" />
85
+ <exclude name="Generic.Files.InlineHTML.Found" />
86
+ </rule>
87
+ <rule ref="Squiz">
88
+ <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterOpen" />
89
+ <exclude name="Squiz.ControlStructures.ElseIfDeclaration.NotAllowed" />
90
+ <exclude name="Squiz.WhiteSpace.FunctionClosingBraceSpace.SpacingBeforeClose" />
91
+ <exclude name="Squiz.WhiteSpace.FunctionSpacing.AfterLast" />
92
+ <exclude name="Squiz.Files.FileExtension.ClassFound" />
93
+ <exclude name="Squiz.Commenting.FileComment.MissingPackageTag" />
94
+ <exclude name="Squiz.Operators.ComparisonOperatorUsage.NotAllowed" />
95
+ <exclude name="Squiz.WhiteSpace.FunctionSpacing.BeforeFirst" />
96
+ <exclude name="Squiz.Operators.ComparisonOperatorUsage.ImplicitTrue" />
97
+ <exclude name="Squiz.WhiteSpace.FunctionSpacing.After" />
98
+ <exclude name="Squiz.Arrays.ArrayDeclaration.DoubleArrowNotAligned" />
99
+ <exclude name="Squiz.WhiteSpace.FunctionSpacing.Before" />
100
+ <exclude name="Squiz.PHP.DisallowBooleanStatement.Found" />
101
+ <exclude name="Squiz.ControlStructures.InlineIfDeclaration.NoBrackets" />
102
+ <exclude name="Squiz.PHP.DisallowInlineIf.Found" />
103
+ <exclude name="Squiz.PHP.DisallowComparisonAssignment.AssignedComparison" />
104
+ <exclude name="Squiz.PHP.DiscouragedFunctions.Discouraged" />
105
+ <exclude name="Squiz.Functions.GlobalFunction.Found" />
106
+ <exclude name="Squiz.PHP.EmbeddedPhp.ContentBeforeEnd" />
107
+ </rule>
108
+ <rule ref="PEAR">
109
+ <exclude name="PEAR.Functions.FunctionCallSignature.CloseBracketLine" />
110
+ <exclude name="PEAR.Functions.FunctionCallSignature.SpaceAfterOpenBracket" />
111
+ <exclude name="PEAR.Functions.FunctionCallSignature.SpaceBeforeCloseBracket" />
112
+ <exclude name="PEAR.Commenting.FileComment.MissingPackageTag" />
113
+ <exclude name="PEAR.Commenting.FileComment.MissingAuthorTag" />
114
+ <exclude name="PEAR.Commenting.FileComment.MissingCategoryTag" />
115
+ <exclude name="PEAR.Commenting.FileComment.MissingLinkTag" />
116
+ <exclude name="PEAR.Commenting.FileComment.MissingLicenseTag" />
117
+ <exclude name="PEAR.Commenting.FileComment.MissingVersion" />
118
+ <exclude name="PEAR.Commenting.ClassComment.MissingPackageTag" />
119
+ <exclude name="PEAR.Commenting.ClassComment.MissingAuthorTag" />
120
+ <exclude name="PEAR.Commenting.ClassComment.MissingCategoryTag" />
121
+ <exclude name="PEAR.Commenting.ClassComment.MissingLinkTag" />
122
+ <exclude name="PEAR.Commenting.ClassComment.MissingLicenseTag" />
123
+ <exclude name="PEAR.Commenting.ClassComment.MissingVersion" />
124
+ <exclude name="PEAR.NamingConventions.ValidFunctionName.PrivateNoUnderscore" />
125
+ <exclude name="PEAR.Commenting.FileComment.WrongStyle" />
126
+ <exclude name="PEAR.Commenting.FileComment.Missing" />
127
+ <exclude name="PEAR.WhiteSpace.ScopeIndent.IncorrectExact" />
128
+ </rule>
129
+
130
+ <!-- Let's also check that everything is properly documented. -->
131
+ <rule ref="WordPress-Docs"/>
132
+
133
+ <!-- Add in some extra rules from other standards. -->
134
+ <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter"/>
135
+ <!-- <rule ref="Generic.Commenting.Todo"/> -->
136
+
137
+ <!-- Check for PHP cross-version compatibility. -->
138
+ <!--
139
+ To enable this, the PHPCompatibilityWP standard needs
140
+ to be installed.
141
+ See the readme for installation instructions:
142
+ https://github.com/PHPCompatibility/PHPCompatibilityWP
143
+ For more information, also see:
144
+ https://github.com/PHPCompatibility/PHPCompatibility
145
+ -->
146
+
147
+ <config name="testVersion" value="5.6-"/>
148
+ <rule ref="PHPCompatibilityWP"/>
149
+
150
+
151
+ <!--
152
+ To get the optimal benefits of using WPCS, we should add a couple of
153
+ custom properties.
154
+ Adjust the values of these properties to fit our needs.
155
+
156
+ For information on additional custom properties available, check out
157
+ the wiki:
158
+ https://github.com/WordPress/WordPress-Coding-Standards/wiki/Customizable-sniff-properties
159
+ -->
160
+ <config name="minimum_supported_wp_version" value="5.4"/>
161
+
162
+ <rule ref="WordPress.WP.I18n">
163
+ <properties>
164
+ <property name="text_domain" type="array">
165
+ <element value="extendify-sdk"/>
166
+ </property>
167
+ </properties>
168
+ </rule>
169
+
170
+ <rule ref="WordPress.NamingConventions.PrefixAllGlobals">
171
+ <properties>
172
+ <property name="prefixes" type="array">
173
+ <element value="extendifysdk"/>
174
+ </property>
175
+ </properties>
176
+ </rule>
177
+
178
+
179
+ </ruleset>
extendify-sdk/.svgrrc ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ svgo: true,
3
+ svgoConfig: {
4
+ plugins: [
5
+ {
6
+ removeAttrs: {
7
+ attrs: [
8
+ "height",
9
+ "width",
10
+ "x",
11
+ "y",
12
+ ],
13
+ },
14
+ },
15
+ ],
16
+ },
17
+ svgProps: {
18
+ xmlns: "http://www.w3.org/2000/svg",
19
+ },
20
+ }
extendify-sdk/app/Admin.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin.
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk;
7
+
8
+ use Extendify\ExtendifySdk\App;
9
+
10
+ /**
11
+ * This class handles any file loading for the admin area.
12
+ */
13
+ class Admin
14
+ {
15
+
16
+ /**
17
+ * The instance
18
+ *
19
+ * @var $instance
20
+ */
21
+ public static $instance = null;
22
+
23
+ /**
24
+ * Adds various actions to set up the page
25
+ *
26
+ * @return self|void
27
+ */
28
+ public function __construct()
29
+ {
30
+ if (self::$instance) {
31
+ return self::$instance;
32
+ }
33
+
34
+ self::$instance = $this;
35
+ $this->loadScripts();
36
+ }
37
+
38
+ /**
39
+ * Adds scripts to the admin
40
+ *
41
+ * @return void
42
+ */
43
+ public function loadScripts()
44
+ {
45
+ \add_action(
46
+ 'admin_enqueue_scripts',
47
+ function ($hook) {
48
+ if (!$this->checkItsGutenbergPost($hook)) {
49
+ return;
50
+ }
51
+
52
+ $this->addScopedScriptsAndStyles();
53
+ }
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Makes sure we are on the correct page
59
+ *
60
+ * @param string $hook - An optional hook provided by WP to identify the page.
61
+ * @return boolean
62
+ */
63
+ public function checkItsGutenbergPost($hook = '')
64
+ {
65
+ // TODO: Maybe there's a better check here so we can show on other pages too.
66
+ return $hook && in_array($hook, ['post.php', 'post-new.php'], true);
67
+ }
68
+
69
+ /**
70
+ * Adds various JS scripts
71
+ *
72
+ * @return void
73
+ */
74
+ public function addScopedScriptsAndStyles()
75
+ {
76
+ $version = App::$environment === 'PRODUCTION' ? App::$version : uniqid();
77
+
78
+ \wp_register_script(
79
+ App::$slug . '-scripts',
80
+ EXTENDIFYSDK_BASE_URL . 'public/build/extendify-sdk.js',
81
+ [
82
+ 'wp-api',
83
+ 'wp-i18n',
84
+ 'wp-components',
85
+ 'wp-element',
86
+ 'wp-editor',
87
+ ],
88
+ $version,
89
+ true
90
+ );
91
+ \wp_localize_script(
92
+ App::$slug . '-scripts',
93
+ 'extendifySdkData',
94
+ [
95
+ 'root' => \esc_url_raw(rest_url(APP::$slug . '/' . APP::$apiVersion)),
96
+ 'nonce' => \wp_create_nonce('wp_rest'),
97
+ ]
98
+ );
99
+ \wp_enqueue_script(App::$slug . '-scripts');
100
+
101
+ \wp_set_script_translations(App::$slug . '-scripts', App::$textDomain);
102
+
103
+ \wp_enqueue_style(
104
+ App::$slug . '-theme',
105
+ EXTENDIFYSDK_BASE_URL . 'public/build/extendify-sdk.css',
106
+ [],
107
+ $version,
108
+ 'all'
109
+ );
110
+ }
111
+ }
extendify-sdk/app/ApiRouter.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * API router
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk;
7
+
8
+ use Extendify\ExtendifySdk\App;
9
+ use Extendify\ExtendifySdk\Http;
10
+
11
+ /**
12
+ * Simple router for the REST Endpoints
13
+ */
14
+ class ApiRouter extends \WP_REST_Controller
15
+ {
16
+
17
+ /**
18
+ * The class instance.
19
+ *
20
+ * @var $instance
21
+ */
22
+ protected static $instance = null;
23
+
24
+ /**
25
+ * The capablity required for access.
26
+ *
27
+ * @var $capability
28
+ */
29
+ protected $capability;
30
+
31
+
32
+ /**
33
+ * The constructor
34
+ */
35
+ public function __construct()
36
+ {
37
+ $this->capability = 'install_plugins';
38
+ add_filter(
39
+ 'rest_request_before_callbacks',
40
+ // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
41
+ function ($response, $handler, $request) {
42
+ // Add the request to our helper class.
43
+ if ($request->get_header('x_extendify')) {
44
+ Http::init($request);
45
+ }
46
+
47
+ return $response;
48
+ },
49
+ 10,
50
+ 3
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Check the capability
56
+ *
57
+ * @param string $capability - The capability.
58
+ *
59
+ * @return boolean
60
+ */
61
+ public function permission($capability)
62
+ {
63
+ $this->capability = $capability;
64
+ return $this;
65
+ }
66
+
67
+ /**
68
+ * Check the authorization of the request
69
+ *
70
+ * @return boolean
71
+ */
72
+ public function checkPermission()
73
+ {
74
+ // Check for the nonce on the server (used by WP REST).
75
+ if (isset($_SERVER['HTTP_X_WP_NONCE']) && \wp_verify_nonce(sanitize_text_field(wp_unslash($_SERVER['HTTP_X_WP_NONCE'])), 'wp_rest')) {
76
+ return \current_user_can($this->capability);
77
+ }
78
+
79
+ return false;
80
+ }
81
+
82
+ /**
83
+ * Register dynamic routes
84
+ *
85
+ * @param string $namespace - The api name space.
86
+ * @param string $endpoint - The endpoint.
87
+ * @param function $callback - The callback to run.
88
+ *
89
+ * @return void
90
+ */
91
+ public function getHandler($namespace, $endpoint, $callback)
92
+ {
93
+ \register_rest_route(
94
+ $namespace,
95
+ $endpoint,
96
+ [
97
+ 'methods' => 'GET',
98
+ 'callback' => $callback,
99
+ 'permission_callback' => [
100
+ $this,
101
+ 'checkPermission',
102
+ ],
103
+ ]
104
+ );
105
+ }
106
+
107
+ /**
108
+ * The post handler
109
+ *
110
+ * @param string $namespace - The api name space.
111
+ * @param string $endpoint - The endpoint.
112
+ * @param string $callback - The callback to run.
113
+ *
114
+ * @return void
115
+ */
116
+ public function postHandler($namespace, $endpoint, $callback)
117
+ {
118
+ \register_rest_route(
119
+ $namespace,
120
+ $endpoint,
121
+ [
122
+ 'methods' => 'POST',
123
+ 'callback' => $callback,
124
+ 'permission_callback' => [
125
+ $this,
126
+ 'checkPermission',
127
+ ],
128
+ ]
129
+ );
130
+ }
131
+
132
+ /**
133
+ * The caller
134
+ *
135
+ * @param string $name - The name of the method to call.
136
+ * @param array $arguments - The arguments to pass in.
137
+ *
138
+ * @return mixed
139
+ */
140
+ public static function __callStatic($name, array $arguments)
141
+ {
142
+ $name = "{$name}Handler";
143
+ if (is_null(self::$instance)) {
144
+ self::$instance = new static();
145
+ }
146
+
147
+ $r = self::$instance;
148
+ return $r->$name(APP::$slug . '/' . APP::$apiVersion, ...$arguments);
149
+ }
150
+ }
extendify-sdk/app/App.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The App details file
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk;
7
+
8
+ use Extendify\ExtendifySdk\Plugin;
9
+
10
+ /**
11
+ * Controller for handling various app data
12
+ */
13
+ class App
14
+ {
15
+
16
+ /**
17
+ * Plugin name
18
+ *
19
+ * @var string
20
+ */
21
+ public static $name = '';
22
+
23
+ /**
24
+ * Plugin slug
25
+ *
26
+ * @var string
27
+ */
28
+ public static $slug = '';
29
+
30
+ /**
31
+ * Plugin version
32
+ *
33
+ * @var string
34
+ */
35
+ public static $version = '';
36
+
37
+ /**
38
+ * Plugin API REST version
39
+ *
40
+ * @var string
41
+ */
42
+ public static $apiVersion = 'v1';
43
+
44
+ /**
45
+ * Plugin text domain
46
+ *
47
+ * @var string
48
+ */
49
+ public static $textDomain = '';
50
+
51
+ /**
52
+ * Plugin environment
53
+ *
54
+ * @var string
55
+ */
56
+ public static $environment = '';
57
+
58
+ /**
59
+ * Plugin config
60
+ *
61
+ * @var array
62
+ */
63
+ public static $config = [];
64
+
65
+ /**
66
+ * Process the readme file to get version and name
67
+ *
68
+ * @return void
69
+ */
70
+ public function __construct()
71
+ {
72
+ // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
73
+ $readme = file_get_contents(dirname(__DIR__) . '/readme.txt');
74
+
75
+ preg_match('/=== (.+) ===/', $readme, $matches);
76
+ self::$name = $matches[1];
77
+ self::$slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', self::$name), '-'));
78
+
79
+ preg_match('/Stable tag: ([0-9.:]+)/', $readme, $matches);
80
+ self::$version = $matches[1];
81
+
82
+ // An easy way to check if we are in dev mode is to look for a dev specific file.
83
+ $isDev = is_readable(EXTENDIFYSDK_PATH . 'node_modules') || is_readable(EXTENDIFYSDK_PATH . '.devbuild');
84
+ self::$environment = $isDev ? 'DEVELOPMENT' : 'PRODUCTION';
85
+
86
+ self::$textDomain = Plugin::getPluginInfo('TextDomain', self::$slug);
87
+
88
+ // Add the config.
89
+ // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
90
+ $config = file_get_contents(dirname(__DIR__) . '/config.json');
91
+ self::$config = json_decode($config, true);
92
+ }
93
+ }
extendify-sdk/app/Controllers/CategoryController.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Categories
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk\Controllers;
7
+
8
+ use Extendify\ExtendifySdk\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for dealing with categories
16
+ */
17
+ class CategoryController
18
+ {
19
+
20
+ /**
21
+ * Return all categories
22
+ *
23
+ * @return WP_REST_Response|WP_Error
24
+ */
25
+ public static function index()
26
+ {
27
+ $response = Http::get('/airtable-categories', []);
28
+
29
+ if (!isset($response['records']) || empty($response['records'])) {
30
+ return new \WP_Error('nothing_found', \__('Categories not found. Please try again later', 'extendify-sdk'), ['status' => 404]);
31
+ }
32
+
33
+ return new \WP_REST_Response(
34
+ array_map(
35
+ function ($record) {
36
+ return isset($record['fields']['title']) ? $record['fields']['title'] : '';
37
+ },
38
+ $response['records']
39
+ )
40
+ );
41
+ }
42
+ }
extendify-sdk/app/Controllers/PluginController.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Plugins
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk\Controllers;
7
+
8
+ use Extendify\ExtendifySdk\Plugin;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for plugin dependency checking, etc
16
+ */
17
+ class PluginController
18
+ {
19
+
20
+ /**
21
+ * Return all plugins
22
+ *
23
+ * @return array
24
+ */
25
+ public static function index()
26
+ {
27
+ if (! function_exists('get_plugins')) {
28
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
29
+ }
30
+
31
+ return \get_plugins();
32
+ }
33
+
34
+ /**
35
+ * List active plugins
36
+ *
37
+ * @return array
38
+ */
39
+ public static function active()
40
+ {
41
+ return \get_option('active_plugins');
42
+ }
43
+
44
+ /**
45
+ * Install plugins
46
+ *
47
+ * @return array
48
+ */
49
+ public static function install()
50
+ {
51
+ if (!\current_user_can('activate_plugins')) {
52
+ return new \WP_Error('not_allowed', \__('You are not allowed to activate plugins on this site.', 'extendify-sdk'));
53
+ }
54
+
55
+ // $required = json_decode($request->get_param('plugins'), true);
56
+ // foreach ($required as $plugin) {
57
+ // }
58
+ // Editorplus needs to be harded here since it's not using the name/name.php convention
59
+ return Plugin::install_and_activate_plugin('editorplus');
60
+ }
61
+ }
extendify-sdk/app/Controllers/TemplateController.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Controls Http requests
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk\Controllers;
7
+
8
+ use Extendify\ExtendifySdk\Http;
9
+
10
+ if (!defined('ABSPATH')) {
11
+ die('No direct access.');
12
+ }
13
+
14
+ /**
15
+ * The controller for dealing with categories
16
+ */
17
+ class TemplateController
18
+ {
19
+
20
+ /**
21
+ * Return info about a template
22
+ *
23
+ * @param \WP_REST_Request $request - The request.
24
+ * @return WP_REST_Response|WP_Error
25
+ */
26
+ public static function index($request)
27
+ {
28
+ $response = Http::post('/airtable-data', $request->get_params());
29
+
30
+ if (!isset($response['records']) || empty($response['records'])) {
31
+ return new \WP_Error('nothing_found', \__('Templates not found. Please try again later', 'extendify-sdk'), ['status' => 404]);
32
+ }
33
+
34
+ return new \WP_REST_Response($response);
35
+ }
36
+
37
+ /**
38
+ * Return info about a template
39
+ *
40
+ * @param \WP_REST_Request $request - The request.
41
+ * @return WP_REST_Response|WP_Error
42
+ */
43
+ public static function single($request)
44
+ {
45
+ $response = Http::post('/airtable-data', $request->get_params());
46
+
47
+ if (!isset($response['records']) || empty($response['records'])) {
48
+ return new \WP_Error('nothing_found', \__('Templates not found. Please try again later', 'extendify-sdk'), ['status' => 404]);
49
+ }
50
+
51
+ return new \WP_REST_Response($response);
52
+ }
53
+ }
extendify-sdk/app/Http.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper class for making http requests
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk;
7
+
8
+ use Extendify\ExtendifySdk\App;
9
+ use Extendify\ExtendifySdk\User;
10
+
11
+ /**
12
+ * Controller for http communication
13
+ */
14
+ class Http
15
+ {
16
+
17
+ /**
18
+ * The api endpoint
19
+ *
20
+ * @var string
21
+ */
22
+ public $baseUrl = '';
23
+
24
+ /**
25
+ * Request data sent to the server
26
+ *
27
+ * @var array
28
+ */
29
+ public $data = [];
30
+
31
+ /**
32
+ * Any headers required
33
+ *
34
+ * @var array
35
+ */
36
+ public $headers = [];
37
+
38
+ /**
39
+ * The class instance.
40
+ *
41
+ * @var $instance
42
+ */
43
+ protected static $instance = null;
44
+
45
+ /**
46
+ * Set up the base object to send with every request
47
+ *
48
+ * @param \WP_REST_Request $request - The request.
49
+ * @return void
50
+ */
51
+ public function __construct($request)
52
+ {
53
+ // Redundant, but extra prodection!
54
+ if (!\wp_verify_nonce(sanitize_text_field(wp_unslash($request->get_header('x_wp_nonce'))), 'wp_rest')) {
55
+ return;
56
+ }
57
+
58
+ $this->baseUrl = $request->get_header('x_extendify_dev_mode') !== 'false' ? App::$config['api']['dev'] : App::$config['api']['live'];
59
+ $this->data = [
60
+ 'mode' => App::$environment,
61
+ 'uuid' => User::data('uuid'),
62
+ 'sdk_version' => App::$version,
63
+ 'wp_plugins' => $request->get_method() === 'POST' ? array_keys(\get_plugins()) : [],
64
+ ];
65
+
66
+ $this->headers = [
67
+ 'Accept' => 'application/json',
68
+ 'referer' => $request->get_header('referer'),
69
+ 'user_agent' => $request->get_header('user_agent'),
70
+ ];
71
+ }
72
+
73
+ /**
74
+ * Register dynamic routes
75
+ *
76
+ * @param string $endpoint - The endpoint.
77
+ * @param array $data - The data to include.
78
+ * @param array $headers - The headers to include.
79
+ *
80
+ * @return array
81
+ */
82
+ public function getHandler($endpoint, $data = [], $headers = [])
83
+ {
84
+ $url = \esc_url_raw(
85
+ \add_query_arg(
86
+ \urlencode_deep(\urldecode_deep(array_merge($this->data, $data))),
87
+ $this->baseUrl . $endpoint
88
+ )
89
+ );
90
+
91
+ $response = \wp_remote_get(
92
+ $url,
93
+ [
94
+ 'headers' => array_merge($this->headers, $headers),
95
+ ]
96
+ );
97
+
98
+ $responseBody = \wp_remote_retrieve_body($response);
99
+ return json_decode($responseBody, true);
100
+ }
101
+
102
+ /**
103
+ * Register dynamic routes
104
+ *
105
+ * @param string $endpoint - The endpoint.
106
+ * @param array $data - The arguments to include.
107
+ * @param array $headers - The headers to include.
108
+ *
109
+ * @return array
110
+ */
111
+ public function postHandler($endpoint, $data = [], $headers = [])
112
+ {
113
+ $response = \wp_remote_post(
114
+ $this->baseUrl . $endpoint,
115
+ [
116
+ 'headers' => array_merge($this->headers, $headers),
117
+ 'body' => array_merge($this->data, $data),
118
+ ]
119
+ );
120
+
121
+ $responseBody = \wp_remote_retrieve_body($response);
122
+ return json_decode($responseBody, true);
123
+ }
124
+
125
+ /**
126
+ * The caller
127
+ *
128
+ * @param string $name - The name of the method to call.
129
+ * @param array $arguments - The arguments to pass in.
130
+ *
131
+ * @return mixed
132
+ */
133
+ public static function __callStatic($name, array $arguments)
134
+ {
135
+ if ($name === 'init') {
136
+ self::$instance = new static($arguments[0]);
137
+ return;
138
+ }
139
+
140
+ $name = "{$name}Handler";
141
+ $r = self::$instance;
142
+
143
+ return $r->$name(...$arguments);
144
+ }
145
+ }
extendify-sdk/app/Plugin.php ADDED
@@ -0,0 +1,335 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // phpcs:ignoreFile
3
+ // This class was copied from JetPack (mostly)
4
+ // so will be a bit of work to refactor
5
+ /**
6
+ * Manage plugin dependencies
7
+ */
8
+
9
+ namespace Extendify\ExtendifySdk;
10
+
11
+ class Plugin
12
+ {
13
+ /**
14
+ * Install and activate a plugin.
15
+ *
16
+ * @param string $slug Plugin slug.
17
+ *
18
+ * @return bool|WP_Error True if installation succeeded, error object otherwise.
19
+ */
20
+ public static function install_and_activate_plugin($slug)
21
+ {
22
+ $plugin_id = self::get_plugin_id_by_slug($slug);
23
+ if (! $plugin_id) {
24
+ $installed = self::install_plugin($slug);
25
+ if (is_wp_error($installed)) {
26
+ return $installed;
27
+ }
28
+ $plugin_id = self::get_plugin_id_by_slug($slug);
29
+ } elseif (is_plugin_active($plugin_id)) {
30
+ return true; // Already installed and active.
31
+ }
32
+
33
+ if (! current_user_can('activate_plugins')) {
34
+ return new \WP_Error('not_allowed', __('You are not allowed to activate plugins on this site.', 'templates_sdk'));
35
+ }
36
+
37
+ $activated = \activate_plugin($plugin_id);
38
+ if (\is_wp_error($activated)) {
39
+ return $activated;
40
+ }
41
+
42
+ return true;
43
+ }
44
+
45
+ /**
46
+ * Install a plugin.
47
+ *
48
+ * @param string $slug Plugin slug.
49
+ *
50
+ * @return bool|WP_Error True if installation succeeded, error object otherwise.
51
+ */
52
+ public static function install_plugin($slug)
53
+ {
54
+ if (\is_multisite() && !\current_user_can('manage_network')) {
55
+ return new \WP_Error('not_allowed', __('You are not allowed to install plugins on this site.', 'templates_sdk'));
56
+ }
57
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
58
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
59
+ require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
60
+ require_once ABSPATH . 'wp-admin/includes/file.php';
61
+ require_once ABSPATH . 'wp-admin/includes/misc.php';
62
+ $installer = new \Plugin_Upgrader(new Skin());
63
+ $zip_url = self::generate_wordpress_org_plugin_download_link($slug);
64
+
65
+ $result = $installer->install($zip_url);
66
+
67
+ if (is_wp_error($result)) {
68
+ return $result;
69
+ }
70
+
71
+ $plugin = self::get_plugin_id_by_slug($slug);
72
+ $error_code = 'install_error';
73
+ if (! $plugin) {
74
+ $error = __('There was an error installing your plugin', 'templates_sdk');
75
+ }
76
+
77
+ if (! $result) {
78
+ $error_code = $installer->skin->get_main_error_code();
79
+ $message = $installer->skin->get_main_error_message();
80
+ $error = $message ? $message : __('An unknown error occurred during installation', 'templates_sdk');
81
+ }
82
+
83
+ if (! empty($error)) {
84
+ return new \WP_Error($error_code, $error, 400);
85
+ }
86
+
87
+ return (array) $installer->skin->get_upgrade_messages();
88
+ }
89
+
90
+ /**
91
+ * Get WordPress.org zip download link from a plugin slug
92
+ *
93
+ * @param string $plugin_slug Plugin slug.
94
+ */
95
+ protected static function generate_wordpress_org_plugin_download_link($plugin_slug)
96
+ {
97
+ return "https://downloads.wordpress.org/plugin/$plugin_slug.latest-stable.zip";
98
+ }
99
+
100
+ /**
101
+ * Get the plugin ID (composed of the plugin slug and the name of the main plugin file) from a plugin slug.
102
+ *
103
+ * @param string $slug Plugin slug.
104
+ */
105
+ public static function get_plugin_id_by_slug($slug)
106
+ {
107
+ // Check if get_plugins() function exists. This is required on the front end of the
108
+ // site, since it is in a file that is normally only loaded in the admin.
109
+ if (! function_exists('get_plugins')) {
110
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
111
+ }
112
+
113
+ /** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
114
+ $plugins = apply_filters('all_plugins', get_plugins());
115
+ if (! is_array($plugins)) {
116
+ return false;
117
+ }
118
+
119
+ foreach ($plugins as $plugin_file => $plugin_data) {
120
+ if (self::get_slug_from_file_path($plugin_file) === $slug) {
121
+ return $plugin_file;
122
+ }
123
+ }
124
+
125
+ return false;
126
+ }
127
+
128
+ /**
129
+ * Get the plugin slug from the plugin ID (composed of the plugin slug and the name of the main plugin file)
130
+ *
131
+ * @param string $plugin_file Plugin file (ID -- e.g. hello-dolly/hello.php).
132
+ */
133
+ protected static function get_slug_from_file_path($plugin_file)
134
+ {
135
+ // Similar to get_plugin_slug() method.
136
+ $slug = dirname($plugin_file);
137
+ if ('.' === $slug) {
138
+ $slug = preg_replace('/(.+)\.php$/', '$1', $plugin_file);
139
+ }
140
+
141
+ return $slug;
142
+ }
143
+
144
+ /**
145
+ * Get the activation status for a plugin.
146
+ *
147
+ * @since 8.9.0
148
+ *
149
+ * @param string $plugin_file The plugin file to check.
150
+ * @return string Either 'network-active', 'active' or 'inactive'.
151
+ */
152
+ public static function get_plugin_status($plugin_file)
153
+ {
154
+ if (is_plugin_active_for_network($plugin_file)) {
155
+ return 'network-active';
156
+ }
157
+
158
+ if (is_plugin_active($plugin_file)) {
159
+ return 'active';
160
+ }
161
+
162
+ return 'inactive';
163
+ }
164
+
165
+ /**
166
+ * Returns a list of all plugins in the site.
167
+ *
168
+ * @since 8.9.0
169
+ * @uses get_plugins()
170
+ *
171
+ * @return array
172
+ */
173
+ public static function get_plugins()
174
+ {
175
+ if (! function_exists('get_plugins')) {
176
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
177
+ }
178
+ /** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
179
+ $plugins = apply_filters('all_plugins', get_plugins());
180
+
181
+ if (is_array($plugins) && ! empty($plugins)) {
182
+ foreach ($plugins as $plugin_slug => $plugin_data) {
183
+ $plugins[ $plugin_slug ]['active'] = in_array(
184
+ self::get_plugin_status($plugin_slug),
185
+ array( 'active', 'network-active' ),
186
+ true
187
+ );
188
+ }
189
+ return $plugins;
190
+ }
191
+
192
+ return array();
193
+ }
194
+
195
+ /**
196
+ * Will return info about a plugin
197
+ *
198
+ * @param string $identifier The key of the plugin info.
199
+ * @param string $plugin_id The plugin identifier string 'editorplus-sdk.
200
+ * @return string
201
+ */
202
+ public static function getPluginInfo($identifier, $plugin_id)
203
+ {
204
+ if (!function_exists('get_plugins')) {
205
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
206
+ }
207
+
208
+ foreach (get_plugins() as $plugin => $data) {
209
+ if ($data[$identifier] === $plugin_id) {
210
+ return $plugin;
211
+ }
212
+ }
213
+
214
+ return false;
215
+ }
216
+ }
217
+
218
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
219
+ require_once ABSPATH . 'wp-admin/includes/file.php';
220
+
221
+ /**
222
+ * Allows us to capture that the site doesn't have proper file system access.
223
+ * In order to update the plugin.
224
+ */
225
+ class Skin extends \Automatic_Upgrader_Skin
226
+ {
227
+ /**
228
+ * Stores the last error key;
229
+ **/
230
+ protected $main_error_code = 'install_error';
231
+
232
+ /**
233
+ * Stores the last error message.
234
+ **/
235
+ protected $main_error_message = 'An unknown error occurred during installation';
236
+
237
+ /**
238
+ * Overwrites the set_upgrader to be able to tell if we e ven have the ability to write to the files.
239
+ *
240
+ * @param WP_Upgrader $upgrader
241
+ *
242
+ */
243
+ public function set_upgrader(&$upgrader)
244
+ {
245
+ parent::set_upgrader($upgrader);
246
+
247
+ // Check if we even have permission to.
248
+ $result = $upgrader->fs_connect(array( WP_CONTENT_DIR, WP_PLUGIN_DIR ));
249
+ if (! $result) {
250
+ // set the string here since they are not available just yet
251
+ $upgrader->generic_strings();
252
+ $this->feedback('fs_unavailable');
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Overwrites the error function
258
+ */
259
+ public function error($error)
260
+ {
261
+ if (is_wp_error($error)) {
262
+ $this->feedback($error);
263
+ }
264
+ }
265
+
266
+ private function set_main_error_code($code)
267
+ {
268
+ // Don't set the process_failed as code since it is not that helpful unless we don't have one already set.
269
+ $this->main_error_code = ($code === 'process_failed' && $this->main_error_code ? $this->main_error_code : $code);
270
+ }
271
+
272
+ private function set_main_error_message($message, $code)
273
+ {
274
+ // Don't set the process_failed as message since it is not that helpful unless we don't have one already set.
275
+ $this->main_error_message = ($code === 'process_failed' && $this->main_error_code ? $this->main_error_code : $message);
276
+ }
277
+
278
+ public function get_main_error_code()
279
+ {
280
+ return $this->main_error_code;
281
+ }
282
+
283
+ public function get_main_error_message()
284
+ {
285
+ return $this->main_error_message;
286
+ }
287
+
288
+ /**
289
+ * Overwrites the feedback function
290
+ *
291
+ * @param string|array|WP_Error $data Data.
292
+ * @param mixed ...$args Optional text replacements.
293
+ */
294
+ public function feedback($data, ...$args)
295
+ {
296
+ $current_error = null;
297
+ if (is_wp_error($data)) {
298
+ $this->set_main_error_code($data->get_error_code());
299
+ $string = $data->get_error_message();
300
+ } elseif (is_array($data)) {
301
+ return;
302
+ } else {
303
+ $string = $data;
304
+ }
305
+
306
+ if (! empty($this->upgrader->strings[$string])) {
307
+ $this->set_main_error_code($string);
308
+
309
+ $current_error = $string;
310
+ $string = $this->upgrader->strings[$string];
311
+ }
312
+
313
+ if (strpos($string, '%') !== false) {
314
+ if (! empty($args)) {
315
+ $string = vsprintf($string, $args);
316
+ }
317
+ }
318
+
319
+ $string = trim($string);
320
+ $string = wp_kses(
321
+ $string,
322
+ array(
323
+ 'a' => array(
324
+ 'href' => true
325
+ ),
326
+ 'br' => true,
327
+ 'em' => true,
328
+ 'strong' => true,
329
+ )
330
+ );
331
+
332
+ $this->set_main_error_message($string, $current_error);
333
+ $this->messages[] = $string;
334
+ }
335
+ }
extendify-sdk/app/User.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper class for interacting with the user
4
+ */
5
+
6
+ namespace Extendify\ExtendifySdk;
7
+
8
+ /**
9
+ * Helper class for interacting with the user
10
+ */
11
+ class User
12
+ {
13
+
14
+ /**
15
+ * User unique, anonymous identifier
16
+ *
17
+ * @var string
18
+ */
19
+ public $uuid = '';
20
+
21
+ /**
22
+ * A WP user
23
+ *
24
+ * @var \WP_User
25
+ */
26
+ protected $user = null;
27
+
28
+ /**
29
+ * The DB key for scoping
30
+ *
31
+ * @var string
32
+ */
33
+ protected $key = 'extendifysdk_';
34
+
35
+ /**
36
+ * The class instance.
37
+ *
38
+ * @var $instance
39
+ */
40
+ protected static $instance = null;
41
+
42
+ /**
43
+ * Set up the user
44
+ *
45
+ * @param WP_User $user - A WP User object.
46
+ * @return void
47
+ */
48
+ public function __construct($user)
49
+ {
50
+ $this->user = $user;
51
+ }
52
+
53
+ /**
54
+ * Return the user ID
55
+ *
56
+ * @return void
57
+ */
58
+ private function setupUuid()
59
+ {
60
+ $uuid = \get_user_meta($this->user->ID, $this->key . 'uuid', true);
61
+ if (!$uuid) {
62
+ $id = \wp_hash(\wp_json_encode($this->user));
63
+ \update_user_meta($this->user->ID, $this->key . 'uuid', $id);
64
+ }
65
+
66
+ $this->uuid = $uuid;
67
+ }
68
+
69
+ /**
70
+ * Returns data about the user
71
+ * Use it like User::data('ID') to get the user id
72
+ *
73
+ * @param string $arguments - Right now a string of arguments, like ID.
74
+ * @return mixed - Data about the user.
75
+ */
76
+ private function dataHandler($arguments)
77
+ {
78
+ // Right now assume a single argument, but could expand to multiple.
79
+ if (isset($this->user->$arguments)) {
80
+ return $this->user->$arguments;
81
+ }
82
+
83
+ return \get_user_meta($this->user->ID, $this->key . $arguments, true);
84
+ }
85
+
86
+ /**
87
+ * Allows to dynamically setup the user with uuid
88
+ * Use it like User::data('ID') to get the user id
89
+ *
90
+ * @param string $name - The name of the method to call.
91
+ * @param array $arguments - The arguments to pass in.
92
+ *
93
+ * @return mixed
94
+ */
95
+ public static function __callStatic($name, array $arguments)
96
+ {
97
+ $name = "{$name}Handler";
98
+ if (is_null(self::$instance)) {
99
+ require_once ABSPATH . 'wp-includes/pluggable.php';
100
+ self::$instance = new static(\wp_get_current_user());
101
+ $r = self::$instance;
102
+ $r->setupUuid();
103
+ }
104
+
105
+ $r = self::$instance;
106
+ return $r->$name(...$arguments);
107
+ }
108
+ }
extendify-sdk/bootstrap.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Bootstrap the application
4
+ */
5
+
6
+ use Extendify\ExtendifySdk\Admin;
7
+
8
+ if (!defined('ABSPATH')) {
9
+ die('No direct access.');
10
+ }
11
+
12
+ if (!defined('EXTENDIFYSDK_PATH')) {
13
+ define('EXTENDIFYSDK_PATH', \plugin_dir_path(__FILE__));
14
+ }
15
+
16
+ if (is_readable(EXTENDIFYSDK_PATH . 'vendor/autoload.php')) {
17
+ require EXTENDIFYSDK_PATH . 'vendor/autoload.php';
18
+ }
19
+
20
+ $extendifysdkAdmin = new Admin();
21
+
22
+ require EXTENDIFYSDK_PATH . 'routes/api.php';
23
+
24
+
25
+ \add_action(
26
+ 'init',
27
+ function () {
28
+ \load_plugin_textdomain('extendify-sdk', false, EXTENDIFYSDK_PATH . 'languages');
29
+ }
30
+ );
extendify-sdk/composer.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "extendify/extendify-sdk",
3
+ "description": "",
4
+ "type": "wordpress-plugin",
5
+ "require-dev": {
6
+ "johnpbloch/wordpress-core": "*",
7
+ "phpunit/phpunit": "^9.4",
8
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7",
9
+ "phpcompatibility/phpcompatibility-wp": "*"
10
+ },
11
+ "autoload": {
12
+ "psr-4": {
13
+ "Extendify\\ExtendifySdk\\": "app/"
14
+ }
15
+ }
16
+ }
extendify-sdk/composer.lock ADDED
@@ -0,0 +1,2456 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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": "baa355db890fc2cda65b09056f92cc5b",
8
+ "packages": [],
9
+ "packages-dev": [
10
+ {
11
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
12
+ "version": "v0.7.1",
13
+ "source": {
14
+ "type": "git",
15
+ "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
16
+ "reference": "fe390591e0241955f22eb9ba327d137e501c771c"
17
+ },
18
+ "dist": {
19
+ "type": "zip",
20
+ "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c",
21
+ "reference": "fe390591e0241955f22eb9ba327d137e501c771c",
22
+ "shasum": ""
23
+ },
24
+ "require": {
25
+ "composer-plugin-api": "^1.0 || ^2.0",
26
+ "php": ">=5.3",
27
+ "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0"
28
+ },
29
+ "require-dev": {
30
+ "composer/composer": "*",
31
+ "phpcompatibility/php-compatibility": "^9.0",
32
+ "sensiolabs/security-checker": "^4.1.0"
33
+ },
34
+ "type": "composer-plugin",
35
+ "extra": {
36
+ "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
37
+ },
38
+ "autoload": {
39
+ "psr-4": {
40
+ "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
41
+ }
42
+ },
43
+ "notification-url": "https://packagist.org/downloads/",
44
+ "license": [
45
+ "MIT"
46
+ ],
47
+ "authors": [
48
+ {
49
+ "name": "Franck Nijhof",
50
+ "email": "franck.nijhof@dealerdirect.com",
51
+ "homepage": "http://www.frenck.nl",
52
+ "role": "Developer / IT Manager"
53
+ }
54
+ ],
55
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
56
+ "homepage": "http://www.dealerdirect.com",
57
+ "keywords": [
58
+ "PHPCodeSniffer",
59
+ "PHP_CodeSniffer",
60
+ "code quality",
61
+ "codesniffer",
62
+ "composer",
63
+ "installer",
64
+ "phpcs",
65
+ "plugin",
66
+ "qa",
67
+ "quality",
68
+ "standard",
69
+ "standards",
70
+ "style guide",
71
+ "stylecheck",
72
+ "tests"
73
+ ],
74
+ "support": {
75
+ "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
76
+ "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
77
+ },
78
+ "time": "2020-12-07T18:04:37+00:00"
79
+ },
80
+ {
81
+ "name": "doctrine/instantiator",
82
+ "version": "1.4.0",
83
+ "source": {
84
+ "type": "git",
85
+ "url": "https://github.com/doctrine/instantiator.git",
86
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
87
+ },
88
+ "dist": {
89
+ "type": "zip",
90
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
91
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
92
+ "shasum": ""
93
+ },
94
+ "require": {
95
+ "php": "^7.1 || ^8.0"
96
+ },
97
+ "require-dev": {
98
+ "doctrine/coding-standard": "^8.0",
99
+ "ext-pdo": "*",
100
+ "ext-phar": "*",
101
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
102
+ "phpstan/phpstan": "^0.12",
103
+ "phpstan/phpstan-phpunit": "^0.12",
104
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
105
+ },
106
+ "type": "library",
107
+ "autoload": {
108
+ "psr-4": {
109
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
110
+ }
111
+ },
112
+ "notification-url": "https://packagist.org/downloads/",
113
+ "license": [
114
+ "MIT"
115
+ ],
116
+ "authors": [
117
+ {
118
+ "name": "Marco Pivetta",
119
+ "email": "ocramius@gmail.com",
120
+ "homepage": "https://ocramius.github.io/"
121
+ }
122
+ ],
123
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
124
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
125
+ "keywords": [
126
+ "constructor",
127
+ "instantiate"
128
+ ],
129
+ "support": {
130
+ "issues": "https://github.com/doctrine/instantiator/issues",
131
+ "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
132
+ },
133
+ "funding": [
134
+ {
135
+ "url": "https://www.doctrine-project.org/sponsorship.html",
136
+ "type": "custom"
137
+ },
138
+ {
139
+ "url": "https://www.patreon.com/phpdoctrine",
140
+ "type": "patreon"
141
+ },
142
+ {
143
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
144
+ "type": "tidelift"
145
+ }
146
+ ],
147
+ "time": "2020-11-10T18:47:58+00:00"
148
+ },
149
+ {
150
+ "name": "johnpbloch/wordpress-core",
151
+ "version": "5.7.0",
152
+ "source": {
153
+ "type": "git",
154
+ "url": "https://github.com/johnpbloch/wordpress-core.git",
155
+ "reference": "8b057056692ca196aaa7a7ddd915f29426922c6d"
156
+ },
157
+ "dist": {
158
+ "type": "zip",
159
+ "url": "https://api.github.com/repos/johnpbloch/wordpress-core/zipball/8b057056692ca196aaa7a7ddd915f29426922c6d",
160
+ "reference": "8b057056692ca196aaa7a7ddd915f29426922c6d",
161
+ "shasum": ""
162
+ },
163
+ "require": {
164
+ "ext-json": "*",
165
+ "php": ">=5.6.20"
166
+ },
167
+ "provide": {
168
+ "wordpress/core-implementation": "5.7.0"
169
+ },
170
+ "type": "wordpress-core",
171
+ "notification-url": "https://packagist.org/downloads/",
172
+ "license": [
173
+ "GPL-2.0-or-later"
174
+ ],
175
+ "authors": [
176
+ {
177
+ "name": "WordPress Community",
178
+ "homepage": "https://wordpress.org/about/"
179
+ }
180
+ ],
181
+ "description": "WordPress is open source software you can use to create a beautiful website, blog, or app.",
182
+ "homepage": "https://wordpress.org/",
183
+ "keywords": [
184
+ "blog",
185
+ "cms",
186
+ "wordpress"
187
+ ],
188
+ "support": {
189
+ "forum": "https://wordpress.org/support/",
190
+ "irc": "irc://irc.freenode.net/wordpress",
191
+ "issues": "https://core.trac.wordpress.org/",
192
+ "source": "https://core.trac.wordpress.org/browser",
193
+ "wiki": "https://codex.wordpress.org/"
194
+ },
195
+ "time": "2021-03-09T20:32:23+00:00"
196
+ },
197
+ {
198
+ "name": "myclabs/deep-copy",
199
+ "version": "1.10.2",
200
+ "source": {
201
+ "type": "git",
202
+ "url": "https://github.com/myclabs/DeepCopy.git",
203
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
204
+ },
205
+ "dist": {
206
+ "type": "zip",
207
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
208
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
209
+ "shasum": ""
210
+ },
211
+ "require": {
212
+ "php": "^7.1 || ^8.0"
213
+ },
214
+ "replace": {
215
+ "myclabs/deep-copy": "self.version"
216
+ },
217
+ "require-dev": {
218
+ "doctrine/collections": "^1.0",
219
+ "doctrine/common": "^2.6",
220
+ "phpunit/phpunit": "^7.1"
221
+ },
222
+ "type": "library",
223
+ "autoload": {
224
+ "psr-4": {
225
+ "DeepCopy\\": "src/DeepCopy/"
226
+ },
227
+ "files": [
228
+ "src/DeepCopy/deep_copy.php"
229
+ ]
230
+ },
231
+ "notification-url": "https://packagist.org/downloads/",
232
+ "license": [
233
+ "MIT"
234
+ ],
235
+ "description": "Create deep copies (clones) of your objects",
236
+ "keywords": [
237
+ "clone",
238
+ "copy",
239
+ "duplicate",
240
+ "object",
241
+ "object graph"
242
+ ],
243
+ "support": {
244
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
245
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
246
+ },
247
+ "funding": [
248
+ {
249
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
250
+ "type": "tidelift"
251
+ }
252
+ ],
253
+ "time": "2020-11-13T09:40:50+00:00"
254
+ },
255
+ {
256
+ "name": "nikic/php-parser",
257
+ "version": "v4.10.4",
258
+ "source": {
259
+ "type": "git",
260
+ "url": "https://github.com/nikic/PHP-Parser.git",
261
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
262
+ },
263
+ "dist": {
264
+ "type": "zip",
265
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
266
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
267
+ "shasum": ""
268
+ },
269
+ "require": {
270
+ "ext-tokenizer": "*",
271
+ "php": ">=7.0"
272
+ },
273
+ "require-dev": {
274
+ "ircmaxell/php-yacc": "^0.0.7",
275
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
276
+ },
277
+ "bin": [
278
+ "bin/php-parse"
279
+ ],
280
+ "type": "library",
281
+ "extra": {
282
+ "branch-alias": {
283
+ "dev-master": "4.9-dev"
284
+ }
285
+ },
286
+ "autoload": {
287
+ "psr-4": {
288
+ "PhpParser\\": "lib/PhpParser"
289
+ }
290
+ },
291
+ "notification-url": "https://packagist.org/downloads/",
292
+ "license": [
293
+ "BSD-3-Clause"
294
+ ],
295
+ "authors": [
296
+ {
297
+ "name": "Nikita Popov"
298
+ }
299
+ ],
300
+ "description": "A PHP parser written in PHP",
301
+ "keywords": [
302
+ "parser",
303
+ "php"
304
+ ],
305
+ "support": {
306
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
307
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4"
308
+ },
309
+ "time": "2020-12-20T10:01:03+00:00"
310
+ },
311
+ {
312
+ "name": "phar-io/manifest",
313
+ "version": "2.0.1",
314
+ "source": {
315
+ "type": "git",
316
+ "url": "https://github.com/phar-io/manifest.git",
317
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
318
+ },
319
+ "dist": {
320
+ "type": "zip",
321
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
322
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
323
+ "shasum": ""
324
+ },
325
+ "require": {
326
+ "ext-dom": "*",
327
+ "ext-phar": "*",
328
+ "ext-xmlwriter": "*",
329
+ "phar-io/version": "^3.0.1",
330
+ "php": "^7.2 || ^8.0"
331
+ },
332
+ "type": "library",
333
+ "extra": {
334
+ "branch-alias": {
335
+ "dev-master": "2.0.x-dev"
336
+ }
337
+ },
338
+ "autoload": {
339
+ "classmap": [
340
+ "src/"
341
+ ]
342
+ },
343
+ "notification-url": "https://packagist.org/downloads/",
344
+ "license": [
345
+ "BSD-3-Clause"
346
+ ],
347
+ "authors": [
348
+ {
349
+ "name": "Arne Blankerts",
350
+ "email": "arne@blankerts.de",
351
+ "role": "Developer"
352
+ },
353
+ {
354
+ "name": "Sebastian Heuer",
355
+ "email": "sebastian@phpeople.de",
356
+ "role": "Developer"
357
+ },
358
+ {
359
+ "name": "Sebastian Bergmann",
360
+ "email": "sebastian@phpunit.de",
361
+ "role": "Developer"
362
+ }
363
+ ],
364
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
365
+ "support": {
366
+ "issues": "https://github.com/phar-io/manifest/issues",
367
+ "source": "https://github.com/phar-io/manifest/tree/master"
368
+ },
369
+ "time": "2020-06-27T14:33:11+00:00"
370
+ },
371
+ {
372
+ "name": "phar-io/version",
373
+ "version": "3.1.0",
374
+ "source": {
375
+ "type": "git",
376
+ "url": "https://github.com/phar-io/version.git",
377
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182"
378
+ },
379
+ "dist": {
380
+ "type": "zip",
381
+ "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
382
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182",
383
+ "shasum": ""
384
+ },
385
+ "require": {
386
+ "php": "^7.2 || ^8.0"
387
+ },
388
+ "type": "library",
389
+ "autoload": {
390
+ "classmap": [
391
+ "src/"
392
+ ]
393
+ },
394
+ "notification-url": "https://packagist.org/downloads/",
395
+ "license": [
396
+ "BSD-3-Clause"
397
+ ],
398
+ "authors": [
399
+ {
400
+ "name": "Arne Blankerts",
401
+ "email": "arne@blankerts.de",
402
+ "role": "Developer"
403
+ },
404
+ {
405
+ "name": "Sebastian Heuer",
406
+ "email": "sebastian@phpeople.de",
407
+ "role": "Developer"
408
+ },
409
+ {
410
+ "name": "Sebastian Bergmann",
411
+ "email": "sebastian@phpunit.de",
412
+ "role": "Developer"
413
+ }
414
+ ],
415
+ "description": "Library for handling version information and constraints",
416
+ "support": {
417
+ "issues": "https://github.com/phar-io/version/issues",
418
+ "source": "https://github.com/phar-io/version/tree/3.1.0"
419
+ },
420
+ "time": "2021-02-23T14:00:09+00:00"
421
+ },
422
+ {
423
+ "name": "phpcompatibility/php-compatibility",
424
+ "version": "9.3.5",
425
+ "source": {
426
+ "type": "git",
427
+ "url": "https://github.com/PHPCompatibility/PHPCompatibility.git",
428
+ "reference": "9fb324479acf6f39452e0655d2429cc0d3914243"
429
+ },
430
+ "dist": {
431
+ "type": "zip",
432
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243",
433
+ "reference": "9fb324479acf6f39452e0655d2429cc0d3914243",
434
+ "shasum": ""
435
+ },
436
+ "require": {
437
+ "php": ">=5.3",
438
+ "squizlabs/php_codesniffer": "^2.3 || ^3.0.2"
439
+ },
440
+ "conflict": {
441
+ "squizlabs/php_codesniffer": "2.6.2"
442
+ },
443
+ "require-dev": {
444
+ "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0"
445
+ },
446
+ "suggest": {
447
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.",
448
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
449
+ },
450
+ "type": "phpcodesniffer-standard",
451
+ "notification-url": "https://packagist.org/downloads/",
452
+ "license": [
453
+ "LGPL-3.0-or-later"
454
+ ],
455
+ "authors": [
456
+ {
457
+ "name": "Wim Godden",
458
+ "homepage": "https://github.com/wimg",
459
+ "role": "lead"
460
+ },
461
+ {
462
+ "name": "Juliette Reinders Folmer",
463
+ "homepage": "https://github.com/jrfnl",
464
+ "role": "lead"
465
+ },
466
+ {
467
+ "name": "Contributors",
468
+ "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors"
469
+ }
470
+ ],
471
+ "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.",
472
+ "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
473
+ "keywords": [
474
+ "compatibility",
475
+ "phpcs",
476
+ "standards"
477
+ ],
478
+ "support": {
479
+ "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues",
480
+ "source": "https://github.com/PHPCompatibility/PHPCompatibility"
481
+ },
482
+ "time": "2019-12-27T09:44:58+00:00"
483
+ },
484
+ {
485
+ "name": "phpcompatibility/phpcompatibility-paragonie",
486
+ "version": "1.3.1",
487
+ "source": {
488
+ "type": "git",
489
+ "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git",
490
+ "reference": "ddabec839cc003651f2ce695c938686d1086cf43"
491
+ },
492
+ "dist": {
493
+ "type": "zip",
494
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43",
495
+ "reference": "ddabec839cc003651f2ce695c938686d1086cf43",
496
+ "shasum": ""
497
+ },
498
+ "require": {
499
+ "phpcompatibility/php-compatibility": "^9.0"
500
+ },
501
+ "require-dev": {
502
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7",
503
+ "paragonie/random_compat": "dev-master",
504
+ "paragonie/sodium_compat": "dev-master"
505
+ },
506
+ "suggest": {
507
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
508
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
509
+ },
510
+ "type": "phpcodesniffer-standard",
511
+ "notification-url": "https://packagist.org/downloads/",
512
+ "license": [
513
+ "LGPL-3.0-or-later"
514
+ ],
515
+ "authors": [
516
+ {
517
+ "name": "Wim Godden",
518
+ "role": "lead"
519
+ },
520
+ {
521
+ "name": "Juliette Reinders Folmer",
522
+ "role": "lead"
523
+ }
524
+ ],
525
+ "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.",
526
+ "homepage": "http://phpcompatibility.com/",
527
+ "keywords": [
528
+ "compatibility",
529
+ "paragonie",
530
+ "phpcs",
531
+ "polyfill",
532
+ "standards"
533
+ ],
534
+ "support": {
535
+ "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues",
536
+ "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie"
537
+ },
538
+ "time": "2021-02-15T10:24:51+00:00"
539
+ },
540
+ {
541
+ "name": "phpcompatibility/phpcompatibility-wp",
542
+ "version": "2.1.1",
543
+ "source": {
544
+ "type": "git",
545
+ "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git",
546
+ "reference": "b7dc0cd7a8f767ccac5e7637550ea1c50a67b09e"
547
+ },
548
+ "dist": {
549
+ "type": "zip",
550
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/b7dc0cd7a8f767ccac5e7637550ea1c50a67b09e",
551
+ "reference": "b7dc0cd7a8f767ccac5e7637550ea1c50a67b09e",
552
+ "shasum": ""
553
+ },
554
+ "require": {
555
+ "phpcompatibility/php-compatibility": "^9.0",
556
+ "phpcompatibility/phpcompatibility-paragonie": "^1.0"
557
+ },
558
+ "require-dev": {
559
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7"
560
+ },
561
+ "suggest": {
562
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
563
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
564
+ },
565
+ "type": "phpcodesniffer-standard",
566
+ "notification-url": "https://packagist.org/downloads/",
567
+ "license": [
568
+ "LGPL-3.0-or-later"
569
+ ],
570
+ "authors": [
571
+ {
572
+ "name": "Wim Godden",
573
+ "role": "lead"
574
+ },
575
+ {
576
+ "name": "Juliette Reinders Folmer",
577
+ "role": "lead"
578
+ }
579
+ ],
580
+ "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.",
581
+ "homepage": "http://phpcompatibility.com/",
582
+ "keywords": [
583
+ "compatibility",
584
+ "phpcs",
585
+ "standards",
586
+ "wordpress"
587
+ ],
588
+ "support": {
589
+ "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues",
590
+ "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP"
591
+ },
592
+ "time": "2021-02-15T12:58:46+00:00"
593
+ },
594
+ {
595
+ "name": "phpdocumentor/reflection-common",
596
+ "version": "2.2.0",
597
+ "source": {
598
+ "type": "git",
599
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
600
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
601
+ },
602
+ "dist": {
603
+ "type": "zip",
604
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
605
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
606
+ "shasum": ""
607
+ },
608
+ "require": {
609
+ "php": "^7.2 || ^8.0"
610
+ },
611
+ "type": "library",
612
+ "extra": {
613
+ "branch-alias": {
614
+ "dev-2.x": "2.x-dev"
615
+ }
616
+ },
617
+ "autoload": {
618
+ "psr-4": {
619
+ "phpDocumentor\\Reflection\\": "src/"
620
+ }
621
+ },
622
+ "notification-url": "https://packagist.org/downloads/",
623
+ "license": [
624
+ "MIT"
625
+ ],
626
+ "authors": [
627
+ {
628
+ "name": "Jaap van Otterdijk",
629
+ "email": "opensource@ijaap.nl"
630
+ }
631
+ ],
632
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
633
+ "homepage": "http://www.phpdoc.org",
634
+ "keywords": [
635
+ "FQSEN",
636
+ "phpDocumentor",
637
+ "phpdoc",
638
+ "reflection",
639
+ "static analysis"
640
+ ],
641
+ "support": {
642
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
643
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
644
+ },
645
+ "time": "2020-06-27T09:03:43+00:00"
646
+ },
647
+ {
648
+ "name": "phpdocumentor/reflection-docblock",
649
+ "version": "5.2.2",
650
+ "source": {
651
+ "type": "git",
652
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
653
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
654
+ },
655
+ "dist": {
656
+ "type": "zip",
657
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
658
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
659
+ "shasum": ""
660
+ },
661
+ "require": {
662
+ "ext-filter": "*",
663
+ "php": "^7.2 || ^8.0",
664
+ "phpdocumentor/reflection-common": "^2.2",
665
+ "phpdocumentor/type-resolver": "^1.3",
666
+ "webmozart/assert": "^1.9.1"
667
+ },
668
+ "require-dev": {
669
+ "mockery/mockery": "~1.3.2"
670
+ },
671
+ "type": "library",
672
+ "extra": {
673
+ "branch-alias": {
674
+ "dev-master": "5.x-dev"
675
+ }
676
+ },
677
+ "autoload": {
678
+ "psr-4": {
679
+ "phpDocumentor\\Reflection\\": "src"
680
+ }
681
+ },
682
+ "notification-url": "https://packagist.org/downloads/",
683
+ "license": [
684
+ "MIT"
685
+ ],
686
+ "authors": [
687
+ {
688
+ "name": "Mike van Riel",
689
+ "email": "me@mikevanriel.com"
690
+ },
691
+ {
692
+ "name": "Jaap van Otterdijk",
693
+ "email": "account@ijaap.nl"
694
+ }
695
+ ],
696
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
697
+ "support": {
698
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
699
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
700
+ },
701
+ "time": "2020-09-03T19:13:55+00:00"
702
+ },
703
+ {
704
+ "name": "phpdocumentor/type-resolver",
705
+ "version": "1.4.0",
706
+ "source": {
707
+ "type": "git",
708
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
709
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
710
+ },
711
+ "dist": {
712
+ "type": "zip",
713
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
714
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
715
+ "shasum": ""
716
+ },
717
+ "require": {
718
+ "php": "^7.2 || ^8.0",
719
+ "phpdocumentor/reflection-common": "^2.0"
720
+ },
721
+ "require-dev": {
722
+ "ext-tokenizer": "*"
723
+ },
724
+ "type": "library",
725
+ "extra": {
726
+ "branch-alias": {
727
+ "dev-1.x": "1.x-dev"
728
+ }
729
+ },
730
+ "autoload": {
731
+ "psr-4": {
732
+ "phpDocumentor\\Reflection\\": "src"
733
+ }
734
+ },
735
+ "notification-url": "https://packagist.org/downloads/",
736
+ "license": [
737
+ "MIT"
738
+ ],
739
+ "authors": [
740
+ {
741
+ "name": "Mike van Riel",
742
+ "email": "me@mikevanriel.com"
743
+ }
744
+ ],
745
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
746
+ "support": {
747
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
748
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
749
+ },
750
+ "time": "2020-09-17T18:55:26+00:00"
751
+ },
752
+ {
753
+ "name": "phpspec/prophecy",
754
+ "version": "1.13.0",
755
+ "source": {
756
+ "type": "git",
757
+ "url": "https://github.com/phpspec/prophecy.git",
758
+ "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
759
+ },
760
+ "dist": {
761
+ "type": "zip",
762
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
763
+ "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
764
+ "shasum": ""
765
+ },
766
+ "require": {
767
+ "doctrine/instantiator": "^1.2",
768
+ "php": "^7.2 || ~8.0, <8.1",
769
+ "phpdocumentor/reflection-docblock": "^5.2",
770
+ "sebastian/comparator": "^3.0 || ^4.0",
771
+ "sebastian/recursion-context": "^3.0 || ^4.0"
772
+ },
773
+ "require-dev": {
774
+ "phpspec/phpspec": "^6.0",
775
+ "phpunit/phpunit": "^8.0 || ^9.0"
776
+ },
777
+ "type": "library",
778
+ "extra": {
779
+ "branch-alias": {
780
+ "dev-master": "1.11.x-dev"
781
+ }
782
+ },
783
+ "autoload": {
784
+ "psr-4": {
785
+ "Prophecy\\": "src/Prophecy"
786
+ }
787
+ },
788
+ "notification-url": "https://packagist.org/downloads/",
789
+ "license": [
790
+ "MIT"
791
+ ],
792
+ "authors": [
793
+ {
794
+ "name": "Konstantin Kudryashov",
795
+ "email": "ever.zet@gmail.com",
796
+ "homepage": "http://everzet.com"
797
+ },
798
+ {
799
+ "name": "Marcello Duarte",
800
+ "email": "marcello.duarte@gmail.com"
801
+ }
802
+ ],
803
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
804
+ "homepage": "https://github.com/phpspec/prophecy",
805
+ "keywords": [
806
+ "Double",
807
+ "Dummy",
808
+ "fake",
809
+ "mock",
810
+ "spy",
811
+ "stub"
812
+ ],
813
+ "support": {
814
+ "issues": "https://github.com/phpspec/prophecy/issues",
815
+ "source": "https://github.com/phpspec/prophecy/tree/1.13.0"
816
+ },
817
+ "time": "2021-03-17T13:42:18+00:00"
818
+ },
819
+ {
820
+ "name": "phpunit/php-code-coverage",
821
+ "version": "9.2.6",
822
+ "source": {
823
+ "type": "git",
824
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
825
+ "reference": "f6293e1b30a2354e8428e004689671b83871edde"
826
+ },
827
+ "dist": {
828
+ "type": "zip",
829
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde",
830
+ "reference": "f6293e1b30a2354e8428e004689671b83871edde",
831
+ "shasum": ""
832
+ },
833
+ "require": {
834
+ "ext-dom": "*",
835
+ "ext-libxml": "*",
836
+ "ext-xmlwriter": "*",
837
+ "nikic/php-parser": "^4.10.2",
838
+ "php": ">=7.3",
839
+ "phpunit/php-file-iterator": "^3.0.3",
840
+ "phpunit/php-text-template": "^2.0.2",
841
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
842
+ "sebastian/complexity": "^2.0",
843
+ "sebastian/environment": "^5.1.2",
844
+ "sebastian/lines-of-code": "^1.0.3",
845
+ "sebastian/version": "^3.0.1",
846
+ "theseer/tokenizer": "^1.2.0"
847
+ },
848
+ "require-dev": {
849
+ "phpunit/phpunit": "^9.3"
850
+ },
851
+ "suggest": {
852
+ "ext-pcov": "*",
853
+ "ext-xdebug": "*"
854
+ },
855
+ "type": "library",
856
+ "extra": {
857
+ "branch-alias": {
858
+ "dev-master": "9.2-dev"
859
+ }
860
+ },
861
+ "autoload": {
862
+ "classmap": [
863
+ "src/"
864
+ ]
865
+ },
866
+ "notification-url": "https://packagist.org/downloads/",
867
+ "license": [
868
+ "BSD-3-Clause"
869
+ ],
870
+ "authors": [
871
+ {
872
+ "name": "Sebastian Bergmann",
873
+ "email": "sebastian@phpunit.de",
874
+ "role": "lead"
875
+ }
876
+ ],
877
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
878
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
879
+ "keywords": [
880
+ "coverage",
881
+ "testing",
882
+ "xunit"
883
+ ],
884
+ "support": {
885
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
886
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6"
887
+ },
888
+ "funding": [
889
+ {
890
+ "url": "https://github.com/sebastianbergmann",
891
+ "type": "github"
892
+ }
893
+ ],
894
+ "time": "2021-03-28T07:26:59+00:00"
895
+ },
896
+ {
897
+ "name": "phpunit/php-file-iterator",
898
+ "version": "3.0.5",
899
+ "source": {
900
+ "type": "git",
901
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
902
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
903
+ },
904
+ "dist": {
905
+ "type": "zip",
906
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
907
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
908
+ "shasum": ""
909
+ },
910
+ "require": {
911
+ "php": ">=7.3"
912
+ },
913
+ "require-dev": {
914
+ "phpunit/phpunit": "^9.3"
915
+ },
916
+ "type": "library",
917
+ "extra": {
918
+ "branch-alias": {
919
+ "dev-master": "3.0-dev"
920
+ }
921
+ },
922
+ "autoload": {
923
+ "classmap": [
924
+ "src/"
925
+ ]
926
+ },
927
+ "notification-url": "https://packagist.org/downloads/",
928
+ "license": [
929
+ "BSD-3-Clause"
930
+ ],
931
+ "authors": [
932
+ {
933
+ "name": "Sebastian Bergmann",
934
+ "email": "sebastian@phpunit.de",
935
+ "role": "lead"
936
+ }
937
+ ],
938
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
939
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
940
+ "keywords": [
941
+ "filesystem",
942
+ "iterator"
943
+ ],
944
+ "support": {
945
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
946
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
947
+ },
948
+ "funding": [
949
+ {
950
+ "url": "https://github.com/sebastianbergmann",
951
+ "type": "github"
952
+ }
953
+ ],
954
+ "time": "2020-09-28T05:57:25+00:00"
955
+ },
956
+ {
957
+ "name": "phpunit/php-invoker",
958
+ "version": "3.1.1",
959
+ "source": {
960
+ "type": "git",
961
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
962
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
963
+ },
964
+ "dist": {
965
+ "type": "zip",
966
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
967
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
968
+ "shasum": ""
969
+ },
970
+ "require": {
971
+ "php": ">=7.3"
972
+ },
973
+ "require-dev": {
974
+ "ext-pcntl": "*",
975
+ "phpunit/phpunit": "^9.3"
976
+ },
977
+ "suggest": {
978
+ "ext-pcntl": "*"
979
+ },
980
+ "type": "library",
981
+ "extra": {
982
+ "branch-alias": {
983
+ "dev-master": "3.1-dev"
984
+ }
985
+ },
986
+ "autoload": {
987
+ "classmap": [
988
+ "src/"
989
+ ]
990
+ },
991
+ "notification-url": "https://packagist.org/downloads/",
992
+ "license": [
993
+ "BSD-3-Clause"
994
+ ],
995
+ "authors": [
996
+ {
997
+ "name": "Sebastian Bergmann",
998
+ "email": "sebastian@phpunit.de",
999
+ "role": "lead"
1000
+ }
1001
+ ],
1002
+ "description": "Invoke callables with a timeout",
1003
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
1004
+ "keywords": [
1005
+ "process"
1006
+ ],
1007
+ "support": {
1008
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
1009
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
1010
+ },
1011
+ "funding": [
1012
+ {
1013
+ "url": "https://github.com/sebastianbergmann",
1014
+ "type": "github"
1015
+ }
1016
+ ],
1017
+ "time": "2020-09-28T05:58:55+00:00"
1018
+ },
1019
+ {
1020
+ "name": "phpunit/php-text-template",
1021
+ "version": "2.0.4",
1022
+ "source": {
1023
+ "type": "git",
1024
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
1025
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
1026
+ },
1027
+ "dist": {
1028
+ "type": "zip",
1029
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
1030
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
1031
+ "shasum": ""
1032
+ },
1033
+ "require": {
1034
+ "php": ">=7.3"
1035
+ },
1036
+ "require-dev": {
1037
+ "phpunit/phpunit": "^9.3"
1038
+ },
1039
+ "type": "library",
1040
+ "extra": {
1041
+ "branch-alias": {
1042
+ "dev-master": "2.0-dev"
1043
+ }
1044
+ },
1045
+ "autoload": {
1046
+ "classmap": [
1047
+ "src/"
1048
+ ]
1049
+ },
1050
+ "notification-url": "https://packagist.org/downloads/",
1051
+ "license": [
1052
+ "BSD-3-Clause"
1053
+ ],
1054
+ "authors": [
1055
+ {
1056
+ "name": "Sebastian Bergmann",
1057
+ "email": "sebastian@phpunit.de",
1058
+ "role": "lead"
1059
+ }
1060
+ ],
1061
+ "description": "Simple template engine.",
1062
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1063
+ "keywords": [
1064
+ "template"
1065
+ ],
1066
+ "support": {
1067
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
1068
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
1069
+ },
1070
+ "funding": [
1071
+ {
1072
+ "url": "https://github.com/sebastianbergmann",
1073
+ "type": "github"
1074
+ }
1075
+ ],
1076
+ "time": "2020-10-26T05:33:50+00:00"
1077
+ },
1078
+ {
1079
+ "name": "phpunit/php-timer",
1080
+ "version": "5.0.3",
1081
+ "source": {
1082
+ "type": "git",
1083
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
1084
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
1085
+ },
1086
+ "dist": {
1087
+ "type": "zip",
1088
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
1089
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
1090
+ "shasum": ""
1091
+ },
1092
+ "require": {
1093
+ "php": ">=7.3"
1094
+ },
1095
+ "require-dev": {
1096
+ "phpunit/phpunit": "^9.3"
1097
+ },
1098
+ "type": "library",
1099
+ "extra": {
1100
+ "branch-alias": {
1101
+ "dev-master": "5.0-dev"
1102
+ }
1103
+ },
1104
+ "autoload": {
1105
+ "classmap": [
1106
+ "src/"
1107
+ ]
1108
+ },
1109
+ "notification-url": "https://packagist.org/downloads/",
1110
+ "license": [
1111
+ "BSD-3-Clause"
1112
+ ],
1113
+ "authors": [
1114
+ {
1115
+ "name": "Sebastian Bergmann",
1116
+ "email": "sebastian@phpunit.de",
1117
+ "role": "lead"
1118
+ }
1119
+ ],
1120
+ "description": "Utility class for timing",
1121
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
1122
+ "keywords": [
1123
+ "timer"
1124
+ ],
1125
+ "support": {
1126
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
1127
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
1128
+ },
1129
+ "funding": [
1130
+ {
1131
+ "url": "https://github.com/sebastianbergmann",
1132
+ "type": "github"
1133
+ }
1134
+ ],
1135
+ "time": "2020-10-26T13:16:10+00:00"
1136
+ },
1137
+ {
1138
+ "name": "phpunit/phpunit",
1139
+ "version": "9.5.4",
1140
+ "source": {
1141
+ "type": "git",
1142
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
1143
+ "reference": "c73c6737305e779771147af66c96ca6a7ed8a741"
1144
+ },
1145
+ "dist": {
1146
+ "type": "zip",
1147
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741",
1148
+ "reference": "c73c6737305e779771147af66c96ca6a7ed8a741",
1149
+ "shasum": ""
1150
+ },
1151
+ "require": {
1152
+ "doctrine/instantiator": "^1.3.1",
1153
+ "ext-dom": "*",
1154
+ "ext-json": "*",
1155
+ "ext-libxml": "*",
1156
+ "ext-mbstring": "*",
1157
+ "ext-xml": "*",
1158
+ "ext-xmlwriter": "*",
1159
+ "myclabs/deep-copy": "^1.10.1",
1160
+ "phar-io/manifest": "^2.0.1",
1161
+ "phar-io/version": "^3.0.2",
1162
+ "php": ">=7.3",
1163
+ "phpspec/prophecy": "^1.12.1",
1164
+ "phpunit/php-code-coverage": "^9.2.3",
1165
+ "phpunit/php-file-iterator": "^3.0.5",
1166
+ "phpunit/php-invoker": "^3.1.1",
1167
+ "phpunit/php-text-template": "^2.0.3",
1168
+ "phpunit/php-timer": "^5.0.2",
1169
+ "sebastian/cli-parser": "^1.0.1",
1170
+ "sebastian/code-unit": "^1.0.6",
1171
+ "sebastian/comparator": "^4.0.5",
1172
+ "sebastian/diff": "^4.0.3",
1173
+ "sebastian/environment": "^5.1.3",
1174
+ "sebastian/exporter": "^4.0.3",
1175
+ "sebastian/global-state": "^5.0.1",
1176
+ "sebastian/object-enumerator": "^4.0.3",
1177
+ "sebastian/resource-operations": "^3.0.3",
1178
+ "sebastian/type": "^2.3",
1179
+ "sebastian/version": "^3.0.2"
1180
+ },
1181
+ "require-dev": {
1182
+ "ext-pdo": "*",
1183
+ "phpspec/prophecy-phpunit": "^2.0.1"
1184
+ },
1185
+ "suggest": {
1186
+ "ext-soap": "*",
1187
+ "ext-xdebug": "*"
1188
+ },
1189
+ "bin": [
1190
+ "phpunit"
1191
+ ],
1192
+ "type": "library",
1193
+ "extra": {
1194
+ "branch-alias": {
1195
+ "dev-master": "9.5-dev"
1196
+ }
1197
+ },
1198
+ "autoload": {
1199
+ "classmap": [
1200
+ "src/"
1201
+ ],
1202
+ "files": [
1203
+ "src/Framework/Assert/Functions.php"
1204
+ ]
1205
+ },
1206
+ "notification-url": "https://packagist.org/downloads/",
1207
+ "license": [
1208
+ "BSD-3-Clause"
1209
+ ],
1210
+ "authors": [
1211
+ {
1212
+ "name": "Sebastian Bergmann",
1213
+ "email": "sebastian@phpunit.de",
1214
+ "role": "lead"
1215
+ }
1216
+ ],
1217
+ "description": "The PHP Unit Testing framework.",
1218
+ "homepage": "https://phpunit.de/",
1219
+ "keywords": [
1220
+ "phpunit",
1221
+ "testing",
1222
+ "xunit"
1223
+ ],
1224
+ "support": {
1225
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
1226
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4"
1227
+ },
1228
+ "funding": [
1229
+ {
1230
+ "url": "https://phpunit.de/donate.html",
1231
+ "type": "custom"
1232
+ },
1233
+ {
1234
+ "url": "https://github.com/sebastianbergmann",
1235
+ "type": "github"
1236
+ }
1237
+ ],
1238
+ "time": "2021-03-23T07:16:29+00:00"
1239
+ },
1240
+ {
1241
+ "name": "sebastian/cli-parser",
1242
+ "version": "1.0.1",
1243
+ "source": {
1244
+ "type": "git",
1245
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
1246
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
1247
+ },
1248
+ "dist": {
1249
+ "type": "zip",
1250
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1251
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1252
+ "shasum": ""
1253
+ },
1254
+ "require": {
1255
+ "php": ">=7.3"
1256
+ },
1257
+ "require-dev": {
1258
+ "phpunit/phpunit": "^9.3"
1259
+ },
1260
+ "type": "library",
1261
+ "extra": {
1262
+ "branch-alias": {
1263
+ "dev-master": "1.0-dev"
1264
+ }
1265
+ },
1266
+ "autoload": {
1267
+ "classmap": [
1268
+ "src/"
1269
+ ]
1270
+ },
1271
+ "notification-url": "https://packagist.org/downloads/",
1272
+ "license": [
1273
+ "BSD-3-Clause"
1274
+ ],
1275
+ "authors": [
1276
+ {
1277
+ "name": "Sebastian Bergmann",
1278
+ "email": "sebastian@phpunit.de",
1279
+ "role": "lead"
1280
+ }
1281
+ ],
1282
+ "description": "Library for parsing CLI options",
1283
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
1284
+ "support": {
1285
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
1286
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
1287
+ },
1288
+ "funding": [
1289
+ {
1290
+ "url": "https://github.com/sebastianbergmann",
1291
+ "type": "github"
1292
+ }
1293
+ ],
1294
+ "time": "2020-09-28T06:08:49+00:00"
1295
+ },
1296
+ {
1297
+ "name": "sebastian/code-unit",
1298
+ "version": "1.0.8",
1299
+ "source": {
1300
+ "type": "git",
1301
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
1302
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
1303
+ },
1304
+ "dist": {
1305
+ "type": "zip",
1306
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
1307
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
1308
+ "shasum": ""
1309
+ },
1310
+ "require": {
1311
+ "php": ">=7.3"
1312
+ },
1313
+ "require-dev": {
1314
+ "phpunit/phpunit": "^9.3"
1315
+ },
1316
+ "type": "library",
1317
+ "extra": {
1318
+ "branch-alias": {
1319
+ "dev-master": "1.0-dev"
1320
+ }
1321
+ },
1322
+ "autoload": {
1323
+ "classmap": [
1324
+ "src/"
1325
+ ]
1326
+ },
1327
+ "notification-url": "https://packagist.org/downloads/",
1328
+ "license": [
1329
+ "BSD-3-Clause"
1330
+ ],
1331
+ "authors": [
1332
+ {
1333
+ "name": "Sebastian Bergmann",
1334
+ "email": "sebastian@phpunit.de",
1335
+ "role": "lead"
1336
+ }
1337
+ ],
1338
+ "description": "Collection of value objects that represent the PHP code units",
1339
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
1340
+ "support": {
1341
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
1342
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
1343
+ },
1344
+ "funding": [
1345
+ {
1346
+ "url": "https://github.com/sebastianbergmann",
1347
+ "type": "github"
1348
+ }
1349
+ ],
1350
+ "time": "2020-10-26T13:08:54+00:00"
1351
+ },
1352
+ {
1353
+ "name": "sebastian/code-unit-reverse-lookup",
1354
+ "version": "2.0.3",
1355
+ "source": {
1356
+ "type": "git",
1357
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1358
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
1359
+ },
1360
+ "dist": {
1361
+ "type": "zip",
1362
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1363
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1364
+ "shasum": ""
1365
+ },
1366
+ "require": {
1367
+ "php": ">=7.3"
1368
+ },
1369
+ "require-dev": {
1370
+ "phpunit/phpunit": "^9.3"
1371
+ },
1372
+ "type": "library",
1373
+ "extra": {
1374
+ "branch-alias": {
1375
+ "dev-master": "2.0-dev"
1376
+ }
1377
+ },
1378
+ "autoload": {
1379
+ "classmap": [
1380
+ "src/"
1381
+ ]
1382
+ },
1383
+ "notification-url": "https://packagist.org/downloads/",
1384
+ "license": [
1385
+ "BSD-3-Clause"
1386
+ ],
1387
+ "authors": [
1388
+ {
1389
+ "name": "Sebastian Bergmann",
1390
+ "email": "sebastian@phpunit.de"
1391
+ }
1392
+ ],
1393
+ "description": "Looks up which function or method a line of code belongs to",
1394
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1395
+ "support": {
1396
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
1397
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
1398
+ },
1399
+ "funding": [
1400
+ {
1401
+ "url": "https://github.com/sebastianbergmann",
1402
+ "type": "github"
1403
+ }
1404
+ ],
1405
+ "time": "2020-09-28T05:30:19+00:00"
1406
+ },
1407
+ {
1408
+ "name": "sebastian/comparator",
1409
+ "version": "4.0.6",
1410
+ "source": {
1411
+ "type": "git",
1412
+ "url": "https://github.com/sebastianbergmann/comparator.git",
1413
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
1414
+ },
1415
+ "dist": {
1416
+ "type": "zip",
1417
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
1418
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
1419
+ "shasum": ""
1420
+ },
1421
+ "require": {
1422
+ "php": ">=7.3",
1423
+ "sebastian/diff": "^4.0",
1424
+ "sebastian/exporter": "^4.0"
1425
+ },
1426
+ "require-dev": {
1427
+ "phpunit/phpunit": "^9.3"
1428
+ },
1429
+ "type": "library",
1430
+ "extra": {
1431
+ "branch-alias": {
1432
+ "dev-master": "4.0-dev"
1433
+ }
1434
+ },
1435
+ "autoload": {
1436
+ "classmap": [
1437
+ "src/"
1438
+ ]
1439
+ },
1440
+ "notification-url": "https://packagist.org/downloads/",
1441
+ "license": [
1442
+ "BSD-3-Clause"
1443
+ ],
1444
+ "authors": [
1445
+ {
1446
+ "name": "Sebastian Bergmann",
1447
+ "email": "sebastian@phpunit.de"
1448
+ },
1449
+ {
1450
+ "name": "Jeff Welch",
1451
+ "email": "whatthejeff@gmail.com"
1452
+ },
1453
+ {
1454
+ "name": "Volker Dusch",
1455
+ "email": "github@wallbash.com"
1456
+ },
1457
+ {
1458
+ "name": "Bernhard Schussek",
1459
+ "email": "bschussek@2bepublished.at"
1460
+ }
1461
+ ],
1462
+ "description": "Provides the functionality to compare PHP values for equality",
1463
+ "homepage": "https://github.com/sebastianbergmann/comparator",
1464
+ "keywords": [
1465
+ "comparator",
1466
+ "compare",
1467
+ "equality"
1468
+ ],
1469
+ "support": {
1470
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
1471
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
1472
+ },
1473
+ "funding": [
1474
+ {
1475
+ "url": "https://github.com/sebastianbergmann",
1476
+ "type": "github"
1477
+ }
1478
+ ],
1479
+ "time": "2020-10-26T15:49:45+00:00"
1480
+ },
1481
+ {
1482
+ "name": "sebastian/complexity",
1483
+ "version": "2.0.2",
1484
+ "source": {
1485
+ "type": "git",
1486
+ "url": "https://github.com/sebastianbergmann/complexity.git",
1487
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
1488
+ },
1489
+ "dist": {
1490
+ "type": "zip",
1491
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
1492
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
1493
+ "shasum": ""
1494
+ },
1495
+ "require": {
1496
+ "nikic/php-parser": "^4.7",
1497
+ "php": ">=7.3"
1498
+ },
1499
+ "require-dev": {
1500
+ "phpunit/phpunit": "^9.3"
1501
+ },
1502
+ "type": "library",
1503
+ "extra": {
1504
+ "branch-alias": {
1505
+ "dev-master": "2.0-dev"
1506
+ }
1507
+ },
1508
+ "autoload": {
1509
+ "classmap": [
1510
+ "src/"
1511
+ ]
1512
+ },
1513
+ "notification-url": "https://packagist.org/downloads/",
1514
+ "license": [
1515
+ "BSD-3-Clause"
1516
+ ],
1517
+ "authors": [
1518
+ {
1519
+ "name": "Sebastian Bergmann",
1520
+ "email": "sebastian@phpunit.de",
1521
+ "role": "lead"
1522
+ }
1523
+ ],
1524
+ "description": "Library for calculating the complexity of PHP code units",
1525
+ "homepage": "https://github.com/sebastianbergmann/complexity",
1526
+ "support": {
1527
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
1528
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
1529
+ },
1530
+ "funding": [
1531
+ {
1532
+ "url": "https://github.com/sebastianbergmann",
1533
+ "type": "github"
1534
+ }
1535
+ ],
1536
+ "time": "2020-10-26T15:52:27+00:00"
1537
+ },
1538
+ {
1539
+ "name": "sebastian/diff",
1540
+ "version": "4.0.4",
1541
+ "source": {
1542
+ "type": "git",
1543
+ "url": "https://github.com/sebastianbergmann/diff.git",
1544
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
1545
+ },
1546
+ "dist": {
1547
+ "type": "zip",
1548
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
1549
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
1550
+ "shasum": ""
1551
+ },
1552
+ "require": {
1553
+ "php": ">=7.3"
1554
+ },
1555
+ "require-dev": {
1556
+ "phpunit/phpunit": "^9.3",
1557
+ "symfony/process": "^4.2 || ^5"
1558
+ },
1559
+ "type": "library",
1560
+ "extra": {
1561
+ "branch-alias": {
1562
+ "dev-master": "4.0-dev"
1563
+ }
1564
+ },
1565
+ "autoload": {
1566
+ "classmap": [
1567
+ "src/"
1568
+ ]
1569
+ },
1570
+ "notification-url": "https://packagist.org/downloads/",
1571
+ "license": [
1572
+ "BSD-3-Clause"
1573
+ ],
1574
+ "authors": [
1575
+ {
1576
+ "name": "Sebastian Bergmann",
1577
+ "email": "sebastian@phpunit.de"
1578
+ },
1579
+ {
1580
+ "name": "Kore Nordmann",
1581
+ "email": "mail@kore-nordmann.de"
1582
+ }
1583
+ ],
1584
+ "description": "Diff implementation",
1585
+ "homepage": "https://github.com/sebastianbergmann/diff",
1586
+ "keywords": [
1587
+ "diff",
1588
+ "udiff",
1589
+ "unidiff",
1590
+ "unified diff"
1591
+ ],
1592
+ "support": {
1593
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
1594
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
1595
+ },
1596
+ "funding": [
1597
+ {
1598
+ "url": "https://github.com/sebastianbergmann",
1599
+ "type": "github"
1600
+ }
1601
+ ],
1602
+ "time": "2020-10-26T13:10:38+00:00"
1603
+ },
1604
+ {
1605
+ "name": "sebastian/environment",
1606
+ "version": "5.1.3",
1607
+ "source": {
1608
+ "type": "git",
1609
+ "url": "https://github.com/sebastianbergmann/environment.git",
1610
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
1611
+ },
1612
+ "dist": {
1613
+ "type": "zip",
1614
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
1615
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
1616
+ "shasum": ""
1617
+ },
1618
+ "require": {
1619
+ "php": ">=7.3"
1620
+ },
1621
+ "require-dev": {
1622
+ "phpunit/phpunit": "^9.3"
1623
+ },
1624
+ "suggest": {
1625
+ "ext-posix": "*"
1626
+ },
1627
+ "type": "library",
1628
+ "extra": {
1629
+ "branch-alias": {
1630
+ "dev-master": "5.1-dev"
1631
+ }
1632
+ },
1633
+ "autoload": {
1634
+ "classmap": [
1635
+ "src/"
1636
+ ]
1637
+ },
1638
+ "notification-url": "https://packagist.org/downloads/",
1639
+ "license": [
1640
+ "BSD-3-Clause"
1641
+ ],
1642
+ "authors": [
1643
+ {
1644
+ "name": "Sebastian Bergmann",
1645
+ "email": "sebastian@phpunit.de"
1646
+ }
1647
+ ],
1648
+ "description": "Provides functionality to handle HHVM/PHP environments",
1649
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
1650
+ "keywords": [
1651
+ "Xdebug",
1652
+ "environment",
1653
+ "hhvm"
1654
+ ],
1655
+ "support": {
1656
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
1657
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
1658
+ },
1659
+ "funding": [
1660
+ {
1661
+ "url": "https://github.com/sebastianbergmann",
1662
+ "type": "github"
1663
+ }
1664
+ ],
1665
+ "time": "2020-09-28T05:52:38+00:00"
1666
+ },
1667
+ {
1668
+ "name": "sebastian/exporter",
1669
+ "version": "4.0.3",
1670
+ "source": {
1671
+ "type": "git",
1672
+ "url": "https://github.com/sebastianbergmann/exporter.git",
1673
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
1674
+ },
1675
+ "dist": {
1676
+ "type": "zip",
1677
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
1678
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
1679
+ "shasum": ""
1680
+ },
1681
+ "require": {
1682
+ "php": ">=7.3",
1683
+ "sebastian/recursion-context": "^4.0"
1684
+ },
1685
+ "require-dev": {
1686
+ "ext-mbstring": "*",
1687
+ "phpunit/phpunit": "^9.3"
1688
+ },
1689
+ "type": "library",
1690
+ "extra": {
1691
+ "branch-alias": {
1692
+ "dev-master": "4.0-dev"
1693
+ }
1694
+ },
1695
+ "autoload": {
1696
+ "classmap": [
1697
+ "src/"
1698
+ ]
1699
+ },
1700
+ "notification-url": "https://packagist.org/downloads/",
1701
+ "license": [
1702
+ "BSD-3-Clause"
1703
+ ],
1704
+ "authors": [
1705
+ {
1706
+ "name": "Sebastian Bergmann",
1707
+ "email": "sebastian@phpunit.de"
1708
+ },
1709
+ {
1710
+ "name": "Jeff Welch",
1711
+ "email": "whatthejeff@gmail.com"
1712
+ },
1713
+ {
1714
+ "name": "Volker Dusch",
1715
+ "email": "github@wallbash.com"
1716
+ },
1717
+ {
1718
+ "name": "Adam Harvey",
1719
+ "email": "aharvey@php.net"
1720
+ },
1721
+ {
1722
+ "name": "Bernhard Schussek",
1723
+ "email": "bschussek@gmail.com"
1724
+ }
1725
+ ],
1726
+ "description": "Provides the functionality to export PHP variables for visualization",
1727
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
1728
+ "keywords": [
1729
+ "export",
1730
+ "exporter"
1731
+ ],
1732
+ "support": {
1733
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
1734
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
1735
+ },
1736
+ "funding": [
1737
+ {
1738
+ "url": "https://github.com/sebastianbergmann",
1739
+ "type": "github"
1740
+ }
1741
+ ],
1742
+ "time": "2020-09-28T05:24:23+00:00"
1743
+ },
1744
+ {
1745
+ "name": "sebastian/global-state",
1746
+ "version": "5.0.2",
1747
+ "source": {
1748
+ "type": "git",
1749
+ "url": "https://github.com/sebastianbergmann/global-state.git",
1750
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
1751
+ },
1752
+ "dist": {
1753
+ "type": "zip",
1754
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
1755
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
1756
+ "shasum": ""
1757
+ },
1758
+ "require": {
1759
+ "php": ">=7.3",
1760
+ "sebastian/object-reflector": "^2.0",
1761
+ "sebastian/recursion-context": "^4.0"
1762
+ },
1763
+ "require-dev": {
1764
+ "ext-dom": "*",
1765
+ "phpunit/phpunit": "^9.3"
1766
+ },
1767
+ "suggest": {
1768
+ "ext-uopz": "*"
1769
+ },
1770
+ "type": "library",
1771
+ "extra": {
1772
+ "branch-alias": {
1773
+ "dev-master": "5.0-dev"
1774
+ }
1775
+ },
1776
+ "autoload": {
1777
+ "classmap": [
1778
+ "src/"
1779
+ ]
1780
+ },
1781
+ "notification-url": "https://packagist.org/downloads/",
1782
+ "license": [
1783
+ "BSD-3-Clause"
1784
+ ],
1785
+ "authors": [
1786
+ {
1787
+ "name": "Sebastian Bergmann",
1788
+ "email": "sebastian@phpunit.de"
1789
+ }
1790
+ ],
1791
+ "description": "Snapshotting of global state",
1792
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
1793
+ "keywords": [
1794
+ "global state"
1795
+ ],
1796
+ "support": {
1797
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
1798
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2"
1799
+ },
1800
+ "funding": [
1801
+ {
1802
+ "url": "https://github.com/sebastianbergmann",
1803
+ "type": "github"
1804
+ }
1805
+ ],
1806
+ "time": "2020-10-26T15:55:19+00:00"
1807
+ },
1808
+ {
1809
+ "name": "sebastian/lines-of-code",
1810
+ "version": "1.0.3",
1811
+ "source": {
1812
+ "type": "git",
1813
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
1814
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
1815
+ },
1816
+ "dist": {
1817
+ "type": "zip",
1818
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
1819
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
1820
+ "shasum": ""
1821
+ },
1822
+ "require": {
1823
+ "nikic/php-parser": "^4.6",
1824
+ "php": ">=7.3"
1825
+ },
1826
+ "require-dev": {
1827
+ "phpunit/phpunit": "^9.3"
1828
+ },
1829
+ "type": "library",
1830
+ "extra": {
1831
+ "branch-alias": {
1832
+ "dev-master": "1.0-dev"
1833
+ }
1834
+ },
1835
+ "autoload": {
1836
+ "classmap": [
1837
+ "src/"
1838
+ ]
1839
+ },
1840
+ "notification-url": "https://packagist.org/downloads/",
1841
+ "license": [
1842
+ "BSD-3-Clause"
1843
+ ],
1844
+ "authors": [
1845
+ {
1846
+ "name": "Sebastian Bergmann",
1847
+ "email": "sebastian@phpunit.de",
1848
+ "role": "lead"
1849
+ }
1850
+ ],
1851
+ "description": "Library for counting the lines of code in PHP source code",
1852
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
1853
+ "support": {
1854
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
1855
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
1856
+ },
1857
+ "funding": [
1858
+ {
1859
+ "url": "https://github.com/sebastianbergmann",
1860
+ "type": "github"
1861
+ }
1862
+ ],
1863
+ "time": "2020-11-28T06:42:11+00:00"
1864
+ },
1865
+ {
1866
+ "name": "sebastian/object-enumerator",
1867
+ "version": "4.0.4",
1868
+ "source": {
1869
+ "type": "git",
1870
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
1871
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
1872
+ },
1873
+ "dist": {
1874
+ "type": "zip",
1875
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
1876
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
1877
+ "shasum": ""
1878
+ },
1879
+ "require": {
1880
+ "php": ">=7.3",
1881
+ "sebastian/object-reflector": "^2.0",
1882
+ "sebastian/recursion-context": "^4.0"
1883
+ },
1884
+ "require-dev": {
1885
+ "phpunit/phpunit": "^9.3"
1886
+ },
1887
+ "type": "library",
1888
+ "extra": {
1889
+ "branch-alias": {
1890
+ "dev-master": "4.0-dev"
1891
+ }
1892
+ },
1893
+ "autoload": {
1894
+ "classmap": [
1895
+ "src/"
1896
+ ]
1897
+ },
1898
+ "notification-url": "https://packagist.org/downloads/",
1899
+ "license": [
1900
+ "BSD-3-Clause"
1901
+ ],
1902
+ "authors": [
1903
+ {
1904
+ "name": "Sebastian Bergmann",
1905
+ "email": "sebastian@phpunit.de"
1906
+ }
1907
+ ],
1908
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
1909
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
1910
+ "support": {
1911
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
1912
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
1913
+ },
1914
+ "funding": [
1915
+ {
1916
+ "url": "https://github.com/sebastianbergmann",
1917
+ "type": "github"
1918
+ }
1919
+ ],
1920
+ "time": "2020-10-26T13:12:34+00:00"
1921
+ },
1922
+ {
1923
+ "name": "sebastian/object-reflector",
1924
+ "version": "2.0.4",
1925
+ "source": {
1926
+ "type": "git",
1927
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
1928
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
1929
+ },
1930
+ "dist": {
1931
+ "type": "zip",
1932
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
1933
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
1934
+ "shasum": ""
1935
+ },
1936
+ "require": {
1937
+ "php": ">=7.3"
1938
+ },
1939
+ "require-dev": {
1940
+ "phpunit/phpunit": "^9.3"
1941
+ },
1942
+ "type": "library",
1943
+ "extra": {
1944
+ "branch-alias": {
1945
+ "dev-master": "2.0-dev"
1946
+ }
1947
+ },
1948
+ "autoload": {
1949
+ "classmap": [
1950
+ "src/"
1951
+ ]
1952
+ },
1953
+ "notification-url": "https://packagist.org/downloads/",
1954
+ "license": [
1955
+ "BSD-3-Clause"
1956
+ ],
1957
+ "authors": [
1958
+ {
1959
+ "name": "Sebastian Bergmann",
1960
+ "email": "sebastian@phpunit.de"
1961
+ }
1962
+ ],
1963
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
1964
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
1965
+ "support": {
1966
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
1967
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
1968
+ },
1969
+ "funding": [
1970
+ {
1971
+ "url": "https://github.com/sebastianbergmann",
1972
+ "type": "github"
1973
+ }
1974
+ ],
1975
+ "time": "2020-10-26T13:14:26+00:00"
1976
+ },
1977
+ {
1978
+ "name": "sebastian/recursion-context",
1979
+ "version": "4.0.4",
1980
+ "source": {
1981
+ "type": "git",
1982
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
1983
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
1984
+ },
1985
+ "dist": {
1986
+ "type": "zip",
1987
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
1988
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
1989
+ "shasum": ""
1990
+ },
1991
+ "require": {
1992
+ "php": ">=7.3"
1993
+ },
1994
+ "require-dev": {
1995
+ "phpunit/phpunit": "^9.3"
1996
+ },
1997
+ "type": "library",
1998
+ "extra": {
1999
+ "branch-alias": {
2000
+ "dev-master": "4.0-dev"
2001
+ }
2002
+ },
2003
+ "autoload": {
2004
+ "classmap": [
2005
+ "src/"
2006
+ ]
2007
+ },
2008
+ "notification-url": "https://packagist.org/downloads/",
2009
+ "license": [
2010
+ "BSD-3-Clause"
2011
+ ],
2012
+ "authors": [
2013
+ {
2014
+ "name": "Sebastian Bergmann",
2015
+ "email": "sebastian@phpunit.de"
2016
+ },
2017
+ {
2018
+ "name": "Jeff Welch",
2019
+ "email": "whatthejeff@gmail.com"
2020
+ },
2021
+ {
2022
+ "name": "Adam Harvey",
2023
+ "email": "aharvey@php.net"
2024
+ }
2025
+ ],
2026
+ "description": "Provides functionality to recursively process PHP variables",
2027
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2028
+ "support": {
2029
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
2030
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
2031
+ },
2032
+ "funding": [
2033
+ {
2034
+ "url": "https://github.com/sebastianbergmann",
2035
+ "type": "github"
2036
+ }
2037
+ ],
2038
+ "time": "2020-10-26T13:17:30+00:00"
2039
+ },
2040
+ {
2041
+ "name": "sebastian/resource-operations",
2042
+ "version": "3.0.3",
2043
+ "source": {
2044
+ "type": "git",
2045
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
2046
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
2047
+ },
2048
+ "dist": {
2049
+ "type": "zip",
2050
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2051
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2052
+ "shasum": ""
2053
+ },
2054
+ "require": {
2055
+ "php": ">=7.3"
2056
+ },
2057
+ "require-dev": {
2058
+ "phpunit/phpunit": "^9.0"
2059
+ },
2060
+ "type": "library",
2061
+ "extra": {
2062
+ "branch-alias": {
2063
+ "dev-master": "3.0-dev"
2064
+ }
2065
+ },
2066
+ "autoload": {
2067
+ "classmap": [
2068
+ "src/"
2069
+ ]
2070
+ },
2071
+ "notification-url": "https://packagist.org/downloads/",
2072
+ "license": [
2073
+ "BSD-3-Clause"
2074
+ ],
2075
+ "authors": [
2076
+ {
2077
+ "name": "Sebastian Bergmann",
2078
+ "email": "sebastian@phpunit.de"
2079
+ }
2080
+ ],
2081
+ "description": "Provides a list of PHP built-in functions that operate on resources",
2082
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2083
+ "support": {
2084
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
2085
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
2086
+ },
2087
+ "funding": [
2088
+ {
2089
+ "url": "https://github.com/sebastianbergmann",
2090
+ "type": "github"
2091
+ }
2092
+ ],
2093
+ "time": "2020-09-28T06:45:17+00:00"
2094
+ },
2095
+ {
2096
+ "name": "sebastian/type",
2097
+ "version": "2.3.1",
2098
+ "source": {
2099
+ "type": "git",
2100
+ "url": "https://github.com/sebastianbergmann/type.git",
2101
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
2102
+ },
2103
+ "dist": {
2104
+ "type": "zip",
2105
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
2106
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
2107
+ "shasum": ""
2108
+ },
2109
+ "require": {
2110
+ "php": ">=7.3"
2111
+ },
2112
+ "require-dev": {
2113
+ "phpunit/phpunit": "^9.3"
2114
+ },
2115
+ "type": "library",
2116
+ "extra": {
2117
+ "branch-alias": {
2118
+ "dev-master": "2.3-dev"
2119
+ }
2120
+ },
2121
+ "autoload": {
2122
+ "classmap": [
2123
+ "src/"
2124
+ ]
2125
+ },
2126
+ "notification-url": "https://packagist.org/downloads/",
2127
+ "license": [
2128
+ "BSD-3-Clause"
2129
+ ],
2130
+ "authors": [
2131
+ {
2132
+ "name": "Sebastian Bergmann",
2133
+ "email": "sebastian@phpunit.de",
2134
+ "role": "lead"
2135
+ }
2136
+ ],
2137
+ "description": "Collection of value objects that represent the types of the PHP type system",
2138
+ "homepage": "https://github.com/sebastianbergmann/type",
2139
+ "support": {
2140
+ "issues": "https://github.com/sebastianbergmann/type/issues",
2141
+ "source": "https://github.com/sebastianbergmann/type/tree/2.3.1"
2142
+ },
2143
+ "funding": [
2144
+ {
2145
+ "url": "https://github.com/sebastianbergmann",
2146
+ "type": "github"
2147
+ }
2148
+ ],
2149
+ "time": "2020-10-26T13:18:59+00:00"
2150
+ },
2151
+ {
2152
+ "name": "sebastian/version",
2153
+ "version": "3.0.2",
2154
+ "source": {
2155
+ "type": "git",
2156
+ "url": "https://github.com/sebastianbergmann/version.git",
2157
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
2158
+ },
2159
+ "dist": {
2160
+ "type": "zip",
2161
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
2162
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
2163
+ "shasum": ""
2164
+ },
2165
+ "require": {
2166
+ "php": ">=7.3"
2167
+ },
2168
+ "type": "library",
2169
+ "extra": {
2170
+ "branch-alias": {
2171
+ "dev-master": "3.0-dev"
2172
+ }
2173
+ },
2174
+ "autoload": {
2175
+ "classmap": [
2176
+ "src/"
2177
+ ]
2178
+ },
2179
+ "notification-url": "https://packagist.org/downloads/",
2180
+ "license": [
2181
+ "BSD-3-Clause"
2182
+ ],
2183
+ "authors": [
2184
+ {
2185
+ "name": "Sebastian Bergmann",
2186
+ "email": "sebastian@phpunit.de",
2187
+ "role": "lead"
2188
+ }
2189
+ ],
2190
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2191
+ "homepage": "https://github.com/sebastianbergmann/version",
2192
+ "support": {
2193
+ "issues": "https://github.com/sebastianbergmann/version/issues",
2194
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
2195
+ },
2196
+ "funding": [
2197
+ {
2198
+ "url": "https://github.com/sebastianbergmann",
2199
+ "type": "github"
2200
+ }
2201
+ ],
2202
+ "time": "2020-09-28T06:39:44+00:00"
2203
+ },
2204
+ {
2205
+ "name": "squizlabs/php_codesniffer",
2206
+ "version": "3.6.0",
2207
+ "source": {
2208
+ "type": "git",
2209
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
2210
+ "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625"
2211
+ },
2212
+ "dist": {
2213
+ "type": "zip",
2214
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625",
2215
+ "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625",
2216
+ "shasum": ""
2217
+ },
2218
+ "require": {
2219
+ "ext-simplexml": "*",
2220
+ "ext-tokenizer": "*",
2221
+ "ext-xmlwriter": "*",
2222
+ "php": ">=5.4.0"
2223
+ },
2224
+ "require-dev": {
2225
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
2226
+ },
2227
+ "bin": [
2228
+ "bin/phpcs",
2229
+ "bin/phpcbf"
2230
+ ],
2231
+ "type": "library",
2232
+ "extra": {
2233
+ "branch-alias": {
2234
+ "dev-master": "3.x-dev"
2235
+ }
2236
+ },
2237
+ "notification-url": "https://packagist.org/downloads/",
2238
+ "license": [
2239
+ "BSD-3-Clause"
2240
+ ],
2241
+ "authors": [
2242
+ {
2243
+ "name": "Greg Sherwood",
2244
+ "role": "lead"
2245
+ }
2246
+ ],
2247
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
2248
+ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
2249
+ "keywords": [
2250
+ "phpcs",
2251
+ "standards"
2252
+ ],
2253
+ "support": {
2254
+ "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
2255
+ "source": "https://github.com/squizlabs/PHP_CodeSniffer",
2256
+ "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
2257
+ },
2258
+ "time": "2021-04-09T00:54:41+00:00"
2259
+ },
2260
+ {
2261
+ "name": "symfony/polyfill-ctype",
2262
+ "version": "v1.22.1",
2263
+ "source": {
2264
+ "type": "git",
2265
+ "url": "https://github.com/symfony/polyfill-ctype.git",
2266
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
2267
+ },
2268
+ "dist": {
2269
+ "type": "zip",
2270
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
2271
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
2272
+ "shasum": ""
2273
+ },
2274
+ "require": {
2275
+ "php": ">=7.1"
2276
+ },
2277
+ "suggest": {
2278
+ "ext-ctype": "For best performance"
2279
+ },
2280
+ "type": "library",
2281
+ "extra": {
2282
+ "branch-alias": {
2283
+ "dev-main": "1.22-dev"
2284
+ },
2285
+ "thanks": {
2286
+ "name": "symfony/polyfill",
2287
+ "url": "https://github.com/symfony/polyfill"
2288
+ }
2289
+ },
2290
+ "autoload": {
2291
+ "psr-4": {
2292
+ "Symfony\\Polyfill\\Ctype\\": ""
2293
+ },
2294
+ "files": [
2295
+ "bootstrap.php"
2296
+ ]
2297
+ },
2298
+ "notification-url": "https://packagist.org/downloads/",
2299
+ "license": [
2300
+ "MIT"
2301
+ ],
2302
+ "authors": [
2303
+ {
2304
+ "name": "Gert de Pagter",
2305
+ "email": "BackEndTea@gmail.com"
2306
+ },
2307
+ {
2308
+ "name": "Symfony Community",
2309
+ "homepage": "https://symfony.com/contributors"
2310
+ }
2311
+ ],
2312
+ "description": "Symfony polyfill for ctype functions",
2313
+ "homepage": "https://symfony.com",
2314
+ "keywords": [
2315
+ "compatibility",
2316
+ "ctype",
2317
+ "polyfill",
2318
+ "portable"
2319
+ ],
2320
+ "support": {
2321
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1"
2322
+ },
2323
+ "funding": [
2324
+ {
2325
+ "url": "https://symfony.com/sponsor",
2326
+ "type": "custom"
2327
+ },
2328
+ {
2329
+ "url": "https://github.com/fabpot",
2330
+ "type": "github"
2331
+ },
2332
+ {
2333
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2334
+ "type": "tidelift"
2335
+ }
2336
+ ],
2337
+ "time": "2021-01-07T16:49:33+00:00"
2338
+ },
2339
+ {
2340
+ "name": "theseer/tokenizer",
2341
+ "version": "1.2.0",
2342
+ "source": {
2343
+ "type": "git",
2344
+ "url": "https://github.com/theseer/tokenizer.git",
2345
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
2346
+ },
2347
+ "dist": {
2348
+ "type": "zip",
2349
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
2350
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
2351
+ "shasum": ""
2352
+ },
2353
+ "require": {
2354
+ "ext-dom": "*",
2355
+ "ext-tokenizer": "*",
2356
+ "ext-xmlwriter": "*",
2357
+ "php": "^7.2 || ^8.0"
2358
+ },
2359
+ "type": "library",
2360
+ "autoload": {
2361
+ "classmap": [
2362
+ "src/"
2363
+ ]
2364
+ },
2365
+ "notification-url": "https://packagist.org/downloads/",
2366
+ "license": [
2367
+ "BSD-3-Clause"
2368
+ ],
2369
+ "authors": [
2370
+ {
2371
+ "name": "Arne Blankerts",
2372
+ "email": "arne@blankerts.de",
2373
+ "role": "Developer"
2374
+ }
2375
+ ],
2376
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2377
+ "support": {
2378
+ "issues": "https://github.com/theseer/tokenizer/issues",
2379
+ "source": "https://github.com/theseer/tokenizer/tree/master"
2380
+ },
2381
+ "funding": [
2382
+ {
2383
+ "url": "https://github.com/theseer",
2384
+ "type": "github"
2385
+ }
2386
+ ],
2387
+ "time": "2020-07-12T23:59:07+00:00"
2388
+ },
2389
+ {
2390
+ "name": "webmozart/assert",
2391
+ "version": "1.10.0",
2392
+ "source": {
2393
+ "type": "git",
2394
+ "url": "https://github.com/webmozarts/assert.git",
2395
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
2396
+ },
2397
+ "dist": {
2398
+ "type": "zip",
2399
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
2400
+ "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
2401
+ "shasum": ""
2402
+ },
2403
+ "require": {
2404
+ "php": "^7.2 || ^8.0",
2405
+ "symfony/polyfill-ctype": "^1.8"
2406
+ },
2407
+ "conflict": {
2408
+ "phpstan/phpstan": "<0.12.20",
2409
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
2410
+ },
2411
+ "require-dev": {
2412
+ "phpunit/phpunit": "^8.5.13"
2413
+ },
2414
+ "type": "library",
2415
+ "extra": {
2416
+ "branch-alias": {
2417
+ "dev-master": "1.10-dev"
2418
+ }
2419
+ },
2420
+ "autoload": {
2421
+ "psr-4": {
2422
+ "Webmozart\\Assert\\": "src/"
2423
+ }
2424
+ },
2425
+ "notification-url": "https://packagist.org/downloads/",
2426
+ "license": [
2427
+ "MIT"
2428
+ ],
2429
+ "authors": [
2430
+ {
2431
+ "name": "Bernhard Schussek",
2432
+ "email": "bschussek@gmail.com"
2433
+ }
2434
+ ],
2435
+ "description": "Assertions to validate method input/output with nice error messages.",
2436
+ "keywords": [
2437
+ "assert",
2438
+ "check",
2439
+ "validate"
2440
+ ],
2441
+ "support": {
2442
+ "issues": "https://github.com/webmozarts/assert/issues",
2443
+ "source": "https://github.com/webmozarts/assert/tree/1.10.0"
2444
+ },
2445
+ "time": "2021-03-09T10:59:23+00:00"
2446
+ }
2447
+ ],
2448
+ "aliases": [],
2449
+ "minimum-stability": "stable",
2450
+ "stability-flags": [],
2451
+ "prefer-stable": false,
2452
+ "prefer-lowest": false,
2453
+ "platform": [],
2454
+ "platform-dev": [],
2455
+ "plugin-api-version": "2.0.0"
2456
+ }
extendify-sdk/config.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ {
2
+ "api": {
3
+ "live": "https://dashboard.extendify.com/api",
4
+ "dev": "https://testing.extendify.com/api"
5
+ }
6
+ }
extendify-sdk/extendify-sdk.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Name: Extendify SDK
4
+ * Description: SDK for viewing and accessing the Extendify template library.
5
+ * Version: 1.0.0
6
+ * Author: Extendify
7
+ * Text Domain: extendify-sdk
8
+ */
9
+
10
+ if (!defined('ABSPATH')) {
11
+ exit;
12
+ }
13
+
14
+ if (!class_exists('ExtendifySdk')) :
15
+
16
+ /**
17
+ * The Extendify Sdk
18
+ */
19
+ // phpcs:ignore Squiz.Classes.ClassFileName.NoMatch,Squiz.Commenting.ClassComment.Missing,PEAR.Commenting.ClassComment.Missing
20
+ final class ExtendifySdk
21
+ {
22
+
23
+ /**
24
+ * Var to make sure we only load once
25
+ *
26
+ * @var boolean $loaded
27
+ */
28
+ public static $loaded = false;
29
+
30
+ /**
31
+ * Set up the SDK
32
+ *
33
+ * @return void
34
+ */
35
+ public function __invoke()
36
+ {
37
+ if (version_compare(PHP_VERSION, '5.6', '<') || version_compare($GLOBALS['wp_version'], '5.4', '<')) {
38
+ return;
39
+ }
40
+
41
+ if (!self::$loaded) {
42
+ self::$loaded = true;
43
+ require dirname(__FILE__) . '/bootstrap.php';
44
+ $app = new Extendify\ExtendifySdk\App();
45
+ if (!defined('EXTENDIFYSDK_BASE_URL')) {
46
+ define('EXTENDIFYSDK_BASE_URL', plugin_dir_url(__FILE__));
47
+ }
48
+ }
49
+ }
50
+ // phpcs:ignore Squiz.Classes.ClassDeclaration.SpaceBeforeCloseBrace
51
+ }
52
+
53
+ $extendifySdk = new ExtendifySdk();
54
+ $extendifySdk();
55
+ endif;
extendify-sdk/loader.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Use this file to load in the SDK from another plugin
4
+ * Example: require_once plugin_dir_path(__FILE__) . 'extendify-templates-sdk/loader.php';
5
+ */
6
+
7
+ if (!defined('ABSPATH')) {
8
+ exit;
9
+ }
10
+
11
+ if (!function_exists('extendifysdkCheckPluginInstalled')) {
12
+ /**
13
+ * Will be truthy if the plugin is installed.
14
+ *
15
+ * @param string $name name of the plugin 'extendify-sdk'.
16
+ * @return bool|string - will return path, ex. 'extendify-sdk/extendify-sdk.php'.
17
+ */
18
+ function extendifysdkCheckPluginInstalled($name)
19
+ {
20
+ if (!function_exists('get_plugins')) {
21
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
22
+ }
23
+
24
+ foreach (get_plugins() as $plugin => $data) {
25
+ if ($data['TextDomain'] === $name) {
26
+ return $plugin;
27
+ }
28
+ }
29
+
30
+ return false;
31
+ }
32
+ }//end if
33
+
34
+ // If the template SDK development build is installed, default to that.
35
+ $extendifysdkSdk = extendifysdkCheckPluginInstalled('extendify-sdk');
36
+
37
+ if ($extendifysdkSdk) {
38
+ // Only if it's deactivated.
39
+ if (is_plugin_active($extendifysdkSdk)) {
40
+ return false;
41
+ }
42
+ }
43
+
44
+ // If Editor Plus is installed, next default to that.
45
+ $extendifysdkEditorPlus = extendifysdkCheckPluginInstalled('editorplus');
46
+ if ($extendifysdkEditorPlus) {
47
+ // Only if it's deactivated.
48
+ if (is_plugin_active($extendifysdkEditorPlus)) {
49
+ // Only if we aren't currently inside Editor Plus.
50
+ if (strpos(basename(__DIR__), 'editorplus') === -1) {
51
+ return false;
52
+ }
53
+ }
54
+ }
55
+
56
+ // Next is first come, first serve.
57
+ if (class_exists('ExtendifySdk')) {
58
+ return false;
59
+ }
60
+
61
+ require_once plugin_dir_path(__FILE__) . 'extendify-sdk.php';
extendify-sdk/package-lock.json ADDED
@@ -0,0 +1,16573 @@