Version Description
- New: Access to the Extendify template and pattern library
Download this release
Release Info
Developer | munirkamal |
Plugin | ![]() |
Version | 2.6.0 |
Comparing to | |
See all releases |
Code changes from version 2.5.1 to 2.6.0
- acf-blocks.php +52 -4
- {block-templates → acfblocks-templates}/free/acfb-accordion.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-business-hours.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-clicktotweet.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-counternumber.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-divider.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-facebook-page.php +0 -0
- {block-templates → acfblocks-templates}/free/acfb-fb-like-button.php +0 -0
- {block-templates → acfblocks-templates}/free/acfb-image-slider.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-meta-display.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-multibuttons.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-photocollage.php +0 -0
- {block-templates → acfblocks-templates}/free/acfb-posts.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-pricelist.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-pricingbox.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-progressbar.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-random-image.php +0 -0
- {block-templates → acfblocks-templates}/free/acfb-scrollable-image.php +0 -0
- {block-templates → acfblocks-templates}/free/acfb-socialsharing.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-starrating.php +0 -3
- {block-templates → acfblocks-templates}/free/acfb-tabs.php +0 -3
- {block-templates → acfblocks-templates}/free/acfb-team.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-testimonial.php +0 -2
- {block-templates → acfblocks-templates}/free/acfb-toggle.php +0 -2
- block-templates/functions/function.php +0 -56
- extendify-sdk/.editorconfig +16 -0
- extendify-sdk/.eslintignore +3 -0
- extendify-sdk/.eslintrc.js +82 -0
- extendify-sdk/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
- extendify-sdk/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- extendify-sdk/.github/workflows/build-and-test.yml +62 -0
- extendify-sdk/.github/workflows/build-development-zip.yml +70 -0
- extendify-sdk/.github/workflows/force-production-on-main.yml +66 -0
- extendify-sdk/.gitignore +10 -0
- extendify-sdk/.phpcs.xml.dist +179 -0
- extendify-sdk/.svgrrc +20 -0
- extendify-sdk/app/Admin.php +111 -0
- extendify-sdk/app/ApiRouter.php +150 -0
- extendify-sdk/app/App.php +93 -0
- extendify-sdk/app/Controllers/CategoryController.php +42 -0
- extendify-sdk/app/Controllers/PluginController.php +61 -0
- extendify-sdk/app/Controllers/TemplateController.php +53 -0
- extendify-sdk/app/Http.php +145 -0
- extendify-sdk/app/Plugin.php +335 -0
- extendify-sdk/app/User.php +108 -0
- extendify-sdk/bootstrap.php +30 -0
- extendify-sdk/composer.json +16 -0
- extendify-sdk/composer.lock +2456 -0
- extendify-sdk/config.json +6 -0
- extendify-sdk/extendify-sdk.php +55 -0
- extendify-sdk/loader.php +61 -0
- extendify-sdk/package-lock.json +16573 -0
- extendify-sdk/package.json +57 -0
- extendify-sdk/public/.gitkeep +0 -0
- extendify-sdk/public/build/extendify-sdk.css +2 -0
- extendify-sdk/public/build/extendify-sdk.js +2 -0
- extendify-sdk/public/build/extendify-sdk.js.LICENSE.txt +5 -0
- extendify-sdk/readme.md +15 -0
- extendify-sdk/readme.txt +5 -0
- extendify-sdk/routes/api.php +26 -0
- extendify-sdk/src/gutenberg/api/Categories.js +9 -0
- extendify-sdk/src/gutenberg/api/Plugins.js +23 -0
- extendify-sdk/src/gutenberg/api/Templates.js +25 -0
- extendify-sdk/src/gutenberg/api/index.js +65 -0
- extendify-sdk/src/gutenberg/assets/icons/index.js +51 -0
- extendify-sdk/src/gutenberg/base/templates-library/index.js +47 -0
- extendify-sdk/src/gutenberg/components/library-auth/api-form.js +89 -0
- extendify-sdk/src/gutenberg/components/library-auth/index.js +67 -0
- extendify-sdk/src/gutenberg/components/library-auth/style.scss +24 -0
- extendify-sdk/src/gutenberg/components/library-content/index.js +83 -0
- extendify-sdk/src/gutenberg/components/library-content/style.scss +49 -0
- extendify-sdk/src/gutenberg/components/library-imports-counter/index.js +38 -0
- extendify-sdk/src/gutenberg/components/library-imports-counter/style.scss +0 -0
- extendify-sdk/src/gutenberg/components/library-load-more/index.js +113 -0
- extendify-sdk/src/gutenberg/components/library-load-more/style.scss +4 -0
- extendify-sdk/src/gutenberg/components/library-modal/index.js +163 -0
- extendify-sdk/src/gutenberg/components/library-modal/style.scss +66 -0
- extendify-sdk/src/gutenberg/components/library-not-found/index.js +37 -0
- extendify-sdk/src/gutenberg/components/library-not-found/style.scss +5 -0
- extendify-sdk/src/gutenberg/components/library-search/index.js +45 -0
- extendify-sdk/src/gutenberg/components/library-sidebar-section/index.js +18 -0
- extendify-sdk/src/gutenberg/components/library-sidebar-section/style.scss +10 -0
- extendify-sdk/src/gutenberg/components/library-sidebar/index.js +227 -0
- extendify-sdk/src/gutenberg/components/library-sidebar/style.scss +44 -0
- extendify-sdk/src/gutenberg/components/library-template-preview/index.js +192 -0
- extendify-sdk/src/gutenberg/components/library-template-preview/style.scss +71 -0
- extendify-sdk/src/gutenberg/components/library-template/index.js +89 -0
- extendify-sdk/src/gutenberg/components/library-template/style.scss +27 -0
- extendify-sdk/src/gutenberg/functions/index.js +112 -0
- extendify-sdk/src/gutenberg/global/index.js +1 -0
- extendify-sdk/src/gutenberg/listeners/index.js +5 -0
- extendify-sdk/src/gutenberg/listeners/softerror-encountered.js +28 -0
- extendify-sdk/src/gutenberg/listeners/template-inserted.js +9 -0
- extendify-sdk/src/gutenberg/middleware/hasPluginsActivated/ActivatePluginsModal.js +64 -0
- extendify-sdk/src/gutenberg/middleware/hasPluginsActivated/ActivatingModal.js +70 -0
- extendify-sdk/src/gutenberg/middleware/hasPluginsActivated/index.js +22 -0
- extendify-sdk/src/gutenberg/middleware/hasRequiredPlugins/InstallingModal.js +69 -0
- extendify-sdk/src/gutenberg/middleware/hasRequiredPlugins/RequiredPluginsModal.js +69 -0
- extendify-sdk/src/gutenberg/middleware/hasRequiredPlugins/index.js +22 -0
- extendify-sdk/src/gutenberg/middleware/helpers.js +63 -0
- extendify-sdk/src/gutenberg/middleware/index.js +49 -0
- extendify-sdk/src/gutenberg/middleware/needsPageReload/ReloadRequiredModal.js +46 -0
- extendify-sdk/src/gutenberg/middleware/needsPageReload/index.js +18 -0
- extendify-sdk/src/gutenberg/plugins/header-btn/index.js +65 -0
- extendify-sdk/src/gutenberg/plugins/header-btn/style.scss +10 -0
- extendify-sdk/src/gutenberg/plugins/index.js +2 -0
- extendify-sdk/src/gutenberg/plugins/more-menu-btn/index.js +64 -0
- extendify-sdk/src/gutenberg/plugins/more-menu-btn/style.scss +5 -0
- extendify-sdk/src/gutenberg/scss/_mixins.scss +62 -0
- extendify-sdk/src/gutenberg/scss/_variables.scss +0 -0
- extendify-sdk/src/gutenberg/store/actions/index.js +118 -0
- extendify-sdk/src/gutenberg/store/controls/index.js +9 -0
- extendify-sdk/src/gutenberg/store/index.js +42 -0
- extendify-sdk/src/gutenberg/store/reducer/index.js +167 -0
- extendify-sdk/src/gutenberg/store/resolvers/index.js +25 -0
- extendify-sdk/src/gutenberg/store/selectors/index.js +138 -0
- extendify-sdk/src/index.js +25 -0
- extendify-sdk/src/style.scss +47 -0
- extendify-sdk/vendor/autoload.php +7 -0
- extendify-sdk/vendor/composer/ClassLoader.php +445 -0
- extendify-sdk/vendor/composer/InstalledVersions.php +654 -0
- extendify-sdk/vendor/composer/LICENSE +21 -0
- extendify-sdk/vendor/composer/autoload_classmap.php +9 -0
- extendify-sdk/vendor/composer/autoload_namespaces.php +9 -0
- extendify-sdk/vendor/composer/autoload_psr4.php +10 -0
- extendify-sdk/vendor/composer/autoload_real.php +55 -0
- extendify-sdk/vendor/composer/autoload_static.php +31 -0
- extendify-sdk/vendor/composer/installed.json +1 -0
- extendify-sdk/vendor/composer/installed.php +395 -0
- extendify-sdk/webpack.config.js +140 -0
- 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.
|
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( '
|
406 |
require $theme_template;
|
407 |
} else {
|
408 |
// Nothing found, let's look in our plugin
|
409 |
-
$free_template = plugin_dir_path( __FILE__ ) . '
|
410 |
-
$pro_template = plugin_dir_path( __FILE__ ) . '
|
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 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|