├── index.php ├── classes ├── index.php ├── class-starter-plugin-taxonomy.php ├── class-starter-plugin.php ├── class-starter-plugin-admin.php ├── class-starter-plugin-post-type.php └── class-starter-plugin-settings.php ├── .gitignore ├── codecov.yml ├── .wp-env.json ├── package.json ├── phpunit.xml.dist ├── .github └── workflows │ ├── plugin-check.yml │ └── ci.yml ├── phpcs.xml ├── starter-plugin.php ├── tests ├── bootstrap.php └── test-starter-plugin.php ├── composer.json ├── readme.txt ├── .travis.yml ├── .phpcs.xml.dist └── composer.lock /index.php: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | tests/ 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /.github/workflows/plugin-check.yml: -------------------------------------------------------------------------------- 1 | name: 'Plugin Check' 2 | on: # rebuild any PRs and main branch changes 3 | pull_request: 4 | push: 5 | branches: 6 | - trunk 7 | - 'releases/*' 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Run plugin check 17 | uses: wordpress/plugin-check-action@v1 18 | with: 19 | exclude-checks: 'trademarks,file_type' 20 | exclude-directories: '.github,bin,vendor' 21 | 22 | -------------------------------------------------------------------------------- /phpcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | WooCommerce extension PHP_CodeSniffer ruleset. 4 | 5 | 6 | tests/ 7 | */node_modules/* 8 | */vendor/* 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | tests/ 21 | 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Unit Tests Coverage 2 | on: [push, pull_request] 3 | jobs: 4 | run: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - name: Start wp-env 8 | uses: godaddy-wordpress/setup-wp-env@v1 9 | with: 10 | core: 'WordPress/WordPress' 11 | phpVersion: '8.2' 12 | plugins: '["."]' 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | - name: Install dependencies 16 | run: composer self-update && composer install && composer dump-autoload 17 | - name: Run tests and collect coverage 18 | run: vendor/bin/phpunit --coverage-clover coverage.xml . 19 | - name: Upload coverage to Codecov 20 | uses: codecov/codecov-action@v4-beta 21 | env: 22 | CODECOV_TOKEN: ${{ secrets.CODECOV_ORG_TOKEN }} 23 | -------------------------------------------------------------------------------- /starter-plugin.php: -------------------------------------------------------------------------------- 1 | Add New" screen in your WordPress dashboard, or by using the following steps: 26 | 27 | 1. Download the plugin via WordPress.org. 28 | 1. Upload the ZIP file through the "Plugins > Add New > Upload" screen in your WordPress dashboard. 29 | 1. Activate the plugin through the 'Plugins' menu in WordPress 30 | 1. Visit the settings screen and configure, as desired. 31 | 32 | == Frequently Asked Questions == 33 | 34 | = How do I contribute? = 35 | 36 | We encourage everyone to contribute their ideas, thoughts and code snippets. This can be done by forking the [repository over at GitHub](http://github.com/mattyza/starter-plugin/). 37 | 38 | == Screenshots == 39 | 40 | 1. The settings screen. 41 | 42 | 43 | == Upgrade Notice == 44 | 45 | = 1.0.0 = 46 | * XXXX-XX-XX 47 | * Initial release. Woo! 48 | 49 | == Changelog == 50 | 51 | = 1.0.0 = 52 | * XXXX-XX-XX 53 | * Initial release. Woo! -------------------------------------------------------------------------------- /tests/test-starter-plugin.php: -------------------------------------------------------------------------------- 1 | starter_plugin = new Starter_Plugin(); 20 | } 21 | 22 | public function tear_down() { 23 | parent::tear_down(); 24 | } 25 | 26 | public function test_has_correct_token() { 27 | $has_correct_token = ( 'starter-plugin' === $this->starter_plugin->token ); 28 | 29 | $this->assertTrue( $has_correct_token ); 30 | } 31 | 32 | public function test_has_admin_interface() { 33 | $has_admin_interface = ( is_a( $this->starter_plugin->admin, 'Starter_Plugin_Admin' ) ); 34 | 35 | $this->assertTrue( $has_admin_interface ); 36 | } 37 | 38 | public function test_has_settings_interface() { 39 | $has_settings_interface = ( is_a( $this->starter_plugin->settings, 'Starter_Plugin_Settings' ) ); 40 | 41 | $this->assertTrue( $has_settings_interface ); 42 | } 43 | 44 | public function test_has_post_types() { 45 | $has_post_types = ( 0 < count( $this->starter_plugin->post_types ) ); 46 | 47 | $this->assertTrue( $has_post_types ); 48 | } 49 | 50 | public function test_has_load_plugin_textdomain() { 51 | $has_load_plugin_textdomain = ( is_int( has_action( 'init', [ $this->starter_plugin, 'load_plugin_textdomain' ] ) ) ); 52 | 53 | $this->assertTrue( $has_load_plugin_textdomain ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | dist: trusty 3 | 4 | language: php 5 | 6 | notifications: 7 | email: 8 | on_success: never 9 | on_failure: change 10 | 11 | branches: 12 | only: 13 | - master 14 | 15 | cache: 16 | directories: 17 | - $HOME/.composer/cache 18 | 19 | matrix: 20 | include: 21 | - php: 7.4 22 | env: WP_VERSION=latest 23 | - php: 7.3 24 | env: WP_VERSION=latest 25 | - php: 7.2 26 | env: WP_VERSION=latest 27 | - php: 7.1 28 | env: WP_VERSION=latest 29 | - php: 7.0 30 | env: WP_VERSION=latest 31 | - php: 5.6 32 | env: WP_VERSION=4.0.0 33 | - php: 5.6 34 | env: WP_VERSION=latest 35 | - php: 5.6 36 | env: WP_VERSION=trunk 37 | - php: 5.6 38 | env: WP_TRAVISCI=phpcs 39 | 40 | before_script: 41 | - export PATH="$HOME/.composer/vendor/bin:$PATH" 42 | - | 43 | if [ -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ]; then 44 | phpenv config-rm xdebug.ini 45 | else 46 | echo "xdebug.ini does not exist" 47 | fi 48 | - | 49 | if [[ ! -z "$WP_VERSION" ]] ; then 50 | bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION 51 | composer global require "phpunit/phpunit=4.8.*|5.7.*" 52 | fi 53 | - | 54 | if [[ "$WP_TRAVISCI" == "phpcs" ]] ; then 55 | composer global require wp-coding-standards/wpcs 56 | composer global require phpcompatibility/php-compatibility 57 | composer global require phpcompatibility/phpcompatibility-paragonie 58 | composer global require phpcompatibility/phpcompatibility-wp 59 | phpcs --config-set installed_paths $HOME/.composer/vendor/wp-coding-standards/wpcs,$HOME/.composer/vendor/phpcompatibility/php-compatibility,$HOME/.composer/vendor/phpcompatibility/phpcompatibility-paragonie,$HOME/.composer/vendor/phpcompatibility/phpcompatibility-wp 60 | fi 61 | 62 | script: 63 | - | 64 | if [[ ! -z "$WP_VERSION" ]] ; then 65 | phpunit 66 | WP_MULTISITE=1 phpunit 67 | fi 68 | - | 69 | if [[ "$WP_TRAVISCI" == "phpcs" ]] ; then 70 | phpcs 71 | fi 72 | -------------------------------------------------------------------------------- /.phpcs.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | Generally-applicable sniffs for WordPress plugins. 4 | 5 | 6 | . 7 | /vendor/ 8 | /node_modules/ 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /classes/class-starter-plugin-taxonomy.php: -------------------------------------------------------------------------------- 1 | post_type = $post_type; 70 | $this->token = esc_attr( $token ); 71 | $this->singular = esc_html( $singular ); 72 | $this->plural = esc_html( $plural ); 73 | 74 | if ( '' === $this->singular ) { 75 | $this->singular = __( 'Category', 'starter-plugin' ); 76 | } 77 | if ( '' === $this->plural ) { 78 | $this->plural = __( 'Categories', 'starter-plugin' ); 79 | } 80 | 81 | $this->args = wp_parse_args( $args, $this->get_default_args() ); 82 | 83 | add_action( 'init', array( $this, 'register' ) ); 84 | } 85 | 86 | /** 87 | * Return an array of default arguments. 88 | * @access private 89 | * @since 1.3.0 90 | * @return array Default arguments. 91 | */ 92 | private function get_default_args () { 93 | return array( 94 | 'labels' => $this->get_default_labels(), 95 | 'public' => true, 96 | 'hierarchical' => true, 97 | 'show_ui' => true, 98 | 'show_in_rest' => true, 99 | 'show_admin_column' => true, 100 | 'query_var' => true, 101 | 'show_in_nav_menus' => false, 102 | 'show_tagcloud' => false, 103 | ); 104 | } 105 | 106 | /** 107 | * Return an array of default labels. 108 | * @access private 109 | * @since 1.3.0 110 | * @return array Default labels. 111 | */ 112 | private function get_default_labels () { 113 | return array( 114 | 'name' => $this->plural, 115 | 'singular_name' => $this->singular, 116 | /* translators: taxonomy name, in plural */ 117 | 'search_items' => sprintf( __( 'Search %s', 'starter-plugin' ), $this->plural ), 118 | /* translators: taxonomy name, in plural */ 119 | 'all_items' => sprintf( __( 'All %s', 'starter-plugin' ), $this->plural ), 120 | /* translators: taxonomy name, in singular */ 121 | 'parent_item' => sprintf( __( 'Parent %s', 'starter-plugin' ), $this->singular ), 122 | /* translators: taxonomy name, in singular */ 123 | 'parent_item_colon' => sprintf( __( 'Parent %s:', 'starter-plugin' ), $this->singular ), 124 | /* translators: taxonomy name, in singular */ 125 | 'edit_item' => sprintf( __( 'Edit %s', 'starter-plugin' ), $this->singular ), 126 | /* translators: taxonomy name, in singular */ 127 | 'update_item' => sprintf( __( 'Update %s', 'starter-plugin' ), $this->singular ), 128 | /* translators: taxonomy name, in singular */ 129 | 'add_new_item' => sprintf( __( 'Add New %s', 'starter-plugin' ), $this->singular ), 130 | /* translators: taxonomy name, in singular */ 131 | 'new_item_name' => sprintf( __( 'New %s Name', 'starter-plugin' ), $this->singular ), 132 | 'menu_name' => $this->plural, 133 | ); 134 | } 135 | 136 | /** 137 | * Register the taxonomy. 138 | * @access public 139 | * @since 1.3.0 140 | * @return void 141 | */ 142 | public function register () { 143 | register_taxonomy( esc_attr( $this->token ), esc_attr( $this->post_type ), (array) $this->args ); 144 | } 145 | } 146 | 147 | -------------------------------------------------------------------------------- /classes/class-starter-plugin.php: -------------------------------------------------------------------------------- 1 | token = 'starter-plugin'; 94 | $this->plugin_url = plugin_dir_url( __FILE__ ); 95 | $this->plugin_path = plugin_dir_path( __FILE__ ); 96 | $this->version = '1.0.0'; 97 | 98 | // Admin - Start 99 | require_once 'class-starter-plugin-settings.php'; 100 | $this->settings = Starter_Plugin_Settings::instance(); 101 | 102 | if ( is_admin() ) { 103 | require_once 'class-starter-plugin-admin.php'; 104 | $this->admin = Starter_Plugin_Admin::instance(); 105 | } 106 | // Admin - End 107 | 108 | // Post Types - Start 109 | require_once 'class-starter-plugin-post-type.php'; 110 | require_once 'class-starter-plugin-taxonomy.php'; 111 | 112 | // Register an example post type. To register other post types, duplicate this line. 113 | $this->post_types['thing'] = new Starter_Plugin_Post_Type( 'thing', __( 'Thing', 'starter-plugin' ), __( 'Things', 'starter-plugin' ), array( 'menu_icon' => 'dashicons-carrot' ) ); 114 | 115 | // Register an example taxonomy, connected to our post type. To register other taxonomies, duplicate this line. 116 | $this->taxonomies['thing-category'] = new Starter_Plugin_Taxonomy(); 117 | // Post Types - End 118 | register_activation_hook( __FILE__, array( $this, 'install' ) ); 119 | 120 | add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); 121 | } 122 | 123 | /** 124 | * Main Starter_Plugin Instance 125 | * 126 | * Ensures only one instance of Starter_Plugin is loaded or can be loaded. 127 | * 128 | * @since 1.0.0 129 | * @static 130 | * @see Starter_Plugin() 131 | * @return Main Starter_Plugin instance 132 | */ 133 | public static function instance () { 134 | if ( is_null( self::$instance ) ) { 135 | self::$instance = new self(); 136 | } 137 | return self::$instance; 138 | } 139 | 140 | /** 141 | * Load the localisation file. 142 | * @access public 143 | * @since 1.0.0 144 | */ 145 | public function load_plugin_textdomain() { 146 | load_plugin_textdomain( 'starter-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); 147 | } 148 | 149 | /** 150 | * Cloning is forbidden. 151 | * @access public 152 | * @since 1.0.0 153 | */ 154 | public function __clone () {} 155 | 156 | /** 157 | * Unserializing instances of this class is forbidden. 158 | * @access public 159 | * @since 1.0.0 160 | */ 161 | public function __wakeup () {} 162 | 163 | /** 164 | * Installation. Runs on activation. 165 | * @access public 166 | * @since 1.0.0 167 | */ 168 | public function install () { 169 | $this->log_version_number(); 170 | } 171 | 172 | /** 173 | * Log the plugin version number. 174 | * @access private 175 | * @since 1.0.0 176 | */ 177 | private function log_version_number () { 178 | // Log the version number. 179 | update_option( $this->token . '-version', $this->version ); 180 | } 181 | } 182 | -------------------------------------------------------------------------------- /classes/class-starter-plugin-admin.php: -------------------------------------------------------------------------------- 1 | hook = add_submenu_page( 'options-general.php', __( 'Starter Plugin Settings', 'starter-plugin' ), __( 'Starter Plugin', 'starter-plugin' ), 'manage_options', 'starter-plugin', array( $this, 'settings_screen' ) ); 69 | } 70 | 71 | /** 72 | * Output the markup for the settings screen. 73 | * @access public 74 | * @since 1.0.0 75 | * @return void 76 | */ 77 | public function settings_screen () { 78 | global $title; 79 | $sections = Starter_Plugin()->settings->get_settings_sections(); 80 | $tab = $this->get_current_tab( $sections ); 81 | ?> 82 |
83 | admin_header_html( $sections, $title ); 85 | ?> 86 |
87 | 92 |
93 |
94 | settings->get_settings_sections(); 105 | if ( 0 < count( $sections ) ) { 106 | foreach ( $sections as $k => $v ) { 107 | register_setting( 'starter-plugin-settings-' . sanitize_title_with_dashes( $k ), 'starter-plugin-' . $k, array( $this, 'validate_settings' ) ); 108 | add_settings_section( sanitize_title_with_dashes( $k ), $v, array( $this, 'render_settings' ), 'starter-plugin-' . $k, $k, $k ); 109 | } 110 | } 111 | } 112 | 113 | /** 114 | * Render the settings. 115 | * @access public 116 | * @param array $args arguments. 117 | * @since 1.0.0 118 | * @return void 119 | */ 120 | public function render_settings ( $args ) { 121 | $token = $args['id']; 122 | $fields = Starter_Plugin()->settings->get_settings_fields( $token ); 123 | 124 | if ( 0 < count( $fields ) ) { 125 | foreach ( $fields as $k => $v ) { 126 | $args = $v; 127 | $args['id'] = $k; 128 | 129 | add_settings_field( $k, $v['name'], array( Starter_Plugin()->settings, 'render_field' ), 'starter-plugin-' . $token, $v['section'], $args ); 130 | } 131 | } 132 | } 133 | 134 | /** 135 | * Validate the settings. 136 | * @access public 137 | * @since 1.0.0 138 | * @param array $input Inputted data. 139 | * @return array Validated data. 140 | */ 141 | public function validate_settings ( $input ) { 142 | $sections = Starter_Plugin()->settings->get_settings_sections(); 143 | $tab = $this->_get_current_tab( $sections ); 144 | return Starter_Plugin()->settings->validate_settings( $input, $tab ); 145 | } 146 | 147 | /** 148 | * Return marked up HTML for the header tag on the settings screen. 149 | * @access public 150 | * @since 1.0.0 151 | * @param array $sections Sections to scan through. 152 | * @param string $title Title to use, if only one section is present. 153 | * @return string The current tab key. 154 | */ 155 | public function get_admin_header_html ( $sections, $title ) { 156 | $defaults = array( 157 | 'tag' => 'h2', 158 | 'atts' => array( 'class' => 'starter-plugin-wrapper' ), 159 | 'content' => $title, 160 | ); 161 | 162 | $args = $this->get_admin_header_data( $sections, $title ); 163 | 164 | $args = wp_parse_args( $args, $defaults ); 165 | 166 | $atts = ''; 167 | if ( 0 < count( $args['atts'] ) ) { 168 | foreach ( $args['atts'] as $k => $v ) { 169 | $atts .= ' ' . esc_attr( $k ) . '="' . esc_attr( $v ) . '"'; 170 | } 171 | } 172 | 173 | $response = '<' . esc_attr( $args['tag'] ) . $atts . '>' . $args['content'] . '' . "\n"; 174 | 175 | return $response; 176 | } 177 | 178 | /** 179 | * Print marked up HTML for the header tag on the settings screen. 180 | * @access public 181 | * @since 1.0.0 182 | * @param array $sections Sections to scan through. 183 | * @param string $title Title to use, if only one section is present. 184 | * @return string The current tab key. 185 | */ 186 | public function admin_header_html ( $sections, $title ) { 187 | echo $this->get_admin_header_html( $sections, $title ); /* phpcs:ignore */ 188 | } 189 | 190 | /** 191 | * Return the current tab key. 192 | * @access private 193 | * @since 1.0.0 194 | * @param array $sections Sections to scan through for a section key. 195 | * @return string The current tab key. 196 | */ 197 | private function get_current_tab ( $sections = array() ) { 198 | $response = key( $sections ); 199 | 200 | if ( isset( $_GET['tab'] ) && check_admin_referer( 'starter_plugin_switch_settings_tab', 'starter_plugin_switch_settings_tab' ) ) { 201 | $response = sanitize_title_with_dashes( $_GET['tab'] ); 202 | } 203 | 204 | return $response; 205 | } 206 | 207 | /** 208 | * Return an array of data, used to construct the header tag. 209 | * @access private 210 | * @since 1.0.0 211 | * @param array $sections Sections to scan through. 212 | * @param string $title Title to use, if only one section is present. 213 | * @return array An array of data with which to mark up the header HTML. 214 | */ 215 | private function get_admin_header_data ( $sections, $title ) { 216 | $response = array( 217 | 'tag' => 'h2', 218 | 'atts' => array( 'class' => 'starter-plugin-wrapper' ), 219 | 'content' => $title, 220 | ); 221 | 222 | if ( is_array( $sections ) && 1 < count( $sections ) ) { 223 | $response['content'] = ''; 224 | $response['atts']['class'] = 'nav-tab-wrapper'; 225 | 226 | $tab = $this->get_current_tab( $sections ); 227 | 228 | foreach ( $sections as $key => $value ) { 229 | $class = 'nav-tab'; 230 | if ( $tab === $key ) { 231 | $class .= ' nav-tab-active'; 232 | } 233 | 234 | $response['content'] .= '' . esc_html( $value ) . ''; 235 | } 236 | } 237 | 238 | return (array) apply_filters( 'starter_plugin_get_admin_header_data', $response ); 239 | } 240 | } 241 | -------------------------------------------------------------------------------- /classes/class-starter-plugin-post-type.php: -------------------------------------------------------------------------------- 1 | post_type = $post_type; 57 | $this->singular = $singular; 58 | $this->plural = $plural; 59 | $this->args = $args; 60 | 61 | add_action( 'init', array( $this, 'register_post_type' ) ); 62 | 63 | if ( is_admin() ) { 64 | global $pagenow, $wp_query; 65 | 66 | add_action( 'admin_menu', array( $this, 'meta_box_setup' ), 20 ); 67 | add_action( 'save_post', array( $this, 'meta_box_save' ) ); 68 | add_filter( 'enter_title_here', array( $this, 'enter_title_here' ) ); 69 | add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) ); 70 | add_filter( 'manage_edit-' . $this->post_type . '_columns', array( $this, 'register_custom_column_headings' ), 10, 1 ); 71 | add_action( 'manage_posts_custom_column', array( $this, 'register_custom_columns' ), 10, 2 ); 72 | } 73 | 74 | add_action( 'after_setup_theme', array( $this, 'ensure_post_thumbnails_support' ) ); 75 | add_action( 'after_theme_setup', array( $this, 'register_image_sizes' ) ); 76 | } 77 | 78 | /** 79 | * Register the post type. 80 | * @access public 81 | * @return void 82 | */ 83 | public function register_post_type () { 84 | $labels = array( 85 | 'name' => $this->plural, 86 | 'singular_name' => $this->singular, 87 | 'add_new' => _x( 'Add New', 'thing', 'starter-plugin' ), /* translators: add new post */ 88 | 'add_new_item' => sprintf( __( 'Add New %s', 'starter-plugin' ), $this->singular ), /* translators: 'Add new' label for post type entry */ 89 | 'edit_item' => sprintf( __( 'Edit %s', 'starter-plugin' ), $this->singular ), /* translators: 'Edit' label for post type entry */ 90 | 'new_item' => sprintf( __( 'New %s', 'starter-plugin' ), $this->singular ), /* translators: 'New' label for post type entry containing post type singular name */ 91 | 'all_items' => sprintf( __( 'All %s', 'starter-plugin' ), $this->plural ), /* translators: 'All' label for post type entries */ 92 | 'view_item' => sprintf( __( 'View %s', 'starter-plugin' ), $this->singular ), /* translators: 'View' label for post type entry containing singular name */ 93 | 'search_items' => sprintf( __( 'Search %s', 'starter-plugin' ), $this->plural ), /* translators: 'Search' label for post type entry containing plural name */ 94 | 'not_found' => sprintf( __( 'No %s Found', 'starter-plugin' ), $this->plural ), /* translators: 'Not found' label for post type entry containing plural name */ 95 | 'not_found_in_trash' => sprintf( __( 'No %s Found In Trash', 'starter-plugin' ), $this->plural ), /* translators: 'Not found' label for post type entry containing plural name, looking at trash */ 96 | 'parent_item_colon' => '', 97 | 'menu_name' => $this->plural, 98 | ); 99 | 100 | $single_slug = sanitize_title_with_dashes( $this->singular ); 101 | $single_slug = apply_filters( 'starter_plugin_single_slug', $single_slug ); 102 | 103 | $archive_slug = sanitize_title_with_dashes( $this->plural ); 104 | $archive_slug = apply_filters( 'starter_plugin_archive_slug', $archive_slug ); 105 | 106 | $defaults = array( 107 | 'labels' => $labels, 108 | 'public' => true, 109 | 'publicly_queryable' => true, 110 | 'show_ui' => true, 111 | 'show_in_menu' => true, 112 | 'show_in_rest' => true, 113 | 'query_var' => true, 114 | 'rewrite' => array( 'slug' => $single_slug ), 115 | 'capability_type' => 'post', 116 | 'has_archive' => $archive_slug, 117 | 'hierarchical' => false, 118 | 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'page-attributes' ), 119 | 'menu_position' => 5, 120 | 'menu_icon' => 'dashicons-smiley', 121 | ); 122 | 123 | $args = wp_parse_args( $this->args, $defaults ); 124 | 125 | register_post_type( $this->post_type, $args ); 126 | } 127 | 128 | /** 129 | * Add custom columns for the "manage" screen of this post type. 130 | * @access public 131 | * @param string $column_name 132 | * @param int $id 133 | * @since 1.0.0 134 | * @return void 135 | */ 136 | public function register_custom_columns ( $column_name, $id ) { 137 | global $post; 138 | 139 | if ( $post->post_type !== $this->post_type ) { 140 | return; 141 | } 142 | 143 | switch ( $column_name ) { 144 | case 'image': 145 | $this->get_image( $id, 40, false ); 146 | break; 147 | 148 | default: 149 | break; 150 | } 151 | } 152 | 153 | /** 154 | * Add custom column headings for the "manage" screen of this post type. 155 | * @access public 156 | * @param array $defaults 157 | * @since 1.0.0 158 | * @return void 159 | */ 160 | public function register_custom_column_headings ( $defaults ) { 161 | $new_columns = array( 'image' => __( 'Image', 'starter-plugin' ) ); 162 | 163 | $last_item = array(); 164 | 165 | if ( isset( $defaults['date'] ) ) { 166 | unset( $defaults['date'] ); } 167 | 168 | if ( count( $defaults ) > 2 ) { 169 | $last_item = array_slice( $defaults, -1 ); 170 | 171 | array_pop( $defaults ); 172 | } 173 | $defaults = array_merge( $defaults, $new_columns ); 174 | 175 | if ( is_array( $last_item ) && 0 < count( $last_item ) ) { 176 | foreach ( $last_item as $k => $v ) { 177 | $defaults[ $k ] = $v; 178 | break; 179 | } 180 | } 181 | 182 | return $defaults; 183 | } 184 | 185 | /** 186 | * Update messages for the post type admin. 187 | * @since 1.0.0 188 | * @param array $messages Array of messages for all post types. 189 | * @return array Modified array. 190 | */ 191 | public function updated_messages ( $messages ) { 192 | global $post, $post_ID; 193 | 194 | $messages[ $this->post_type ] = array( 195 | 0 => '', // Unused. Messages start at index 1. 196 | /* translators: 'Updated' notice for post type entry, 1: opening anchor, 2: closing anchor, 3: singular name, 4: lowercase singular name */ 197 | 1 => sprintf( __( '%3$s updated. %1$sView %4$s%2$s', 'starter-plugin' ), '', '', $this->singular, strtolower( $this->singular ) ), 198 | 2 => __( 'Custom field updated.', 'starter-plugin' ), 199 | 3 => __( 'Custom field deleted.', 'starter-plugin' ), 200 | /* translators: %s: date and time of the revision */ 201 | 4 => sprintf( __( '%s updated.', 'starter-plugin' ), $this->singular ), 202 | /* translators: 1: singular name. 2: Revision post title. */ 203 | 5 => isset( $_GET['revision'] ) ? sprintf( __( '%1$s restored to revision from %2$s', 'starter-plugin' ), $this->singular, wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, /* phpcs:ignore */ 204 | /* translators: 1: singular name. 2: lowercase singular name. 3: opening anchor. 4: closing anchor. */ 205 | 6 => sprintf( __( '%1$s published. %3$sView %2$s%4$s', 'starter-plugin' ), $this->singular, strtolower( $this->singular ), '', '' ), 206 | /* translators: 1: singular name. */ 207 | 7 => sprintf( __( '%s saved.', 'starter-plugin' ), $this->singular ), 208 | /* translators: 1: singular name. 2: lowercase singular name. 3: opening anchor. 4: closing anchor. */ 209 | 8 => sprintf( __( '%1$s submitted. %2$sPreview %3$s%4$s', 'starter-plugin' ), $this->singular, strtolower( $this->singular ), '', '' ), 210 | 9 => sprintf( 211 | /* translators: 1: singular name. 2: lowercase singular name. 3: scheduled date wrapped in "strong" tags. 4: opening anchor. 5: closing anchor. */ 212 | __( '%1$s scheduled for: %3$s. %4$sPreview %2$s%5$s', 'starter-plugin' ), 213 | $this->singular, 214 | strtolower( $this->singular ), 215 | '' . date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) . '', 216 | '', 217 | '' 218 | ), 219 | /* translators: 1: singular name. 2: lowercase singular name. 3: opening anchor. 4: closing anchor. */ 220 | 10 => sprintf( __( '%1$s draft updated. %2$sPreview %3$s%4$s', 'starter-plugin' ), $this->singular, strtolower( $this->singular ), '', '' ), 221 | ); 222 | 223 | return $messages; 224 | } 225 | 226 | /** 227 | * Setup the meta box. 228 | * @access public 229 | * @since 1.0.0 230 | * @return void 231 | */ 232 | public function meta_box_setup () { 233 | add_meta_box( $this->post_type . '-data', __( 'Thing Details', 'starter-plugin' ), array( $this, 'meta_box_content' ), $this->post_type, 'side', 'high' ); 234 | } 235 | 236 | /** 237 | * The contents of our meta box. 238 | * @access public 239 | * @since 1.0.0 240 | * @return void 241 | */ 242 | public function meta_box_content () { 243 | global $post_id; 244 | $fields = get_post_custom( $post_id ); 245 | $field_data = $this->get_custom_fields_settings(); 246 | 247 | $html = ''; 248 | 249 | $html .= ''; 250 | 251 | if ( 0 < count( $field_data ) ) : 252 | foreach ( $field_data as $k => $v ) : 253 | $data = $v['default']; 254 | if ( isset( $fields[ '_' . $k ] ) && isset( $fields[ '_' . $k ][0] ) ) { 255 | $data = $fields[ '_' . $k ][0]; 256 | } 257 | ?> 258 |

259 |

260 |

261 | post_type ) { 278 | return $post_id; 279 | } 280 | 281 | if ( ! isset( $_POST[ 'starter_plugin_' . $this->post_type . '_noonce' ] ) || ! wp_verify_nonce( $_POST[ 'starter_plugin_' . $this->post_type . '_noonce' ], plugin_basename( dirname( Starter_Plugin()->plugin_path ) ) ) ) { 282 | return $post_id; 283 | } 284 | 285 | if ( isset( $_POST['post_type'] ) && 'page' === esc_attr( $_POST['post_type'] ) ) { 286 | if ( ! current_user_can( 'edit_page', $post_id ) ) { 287 | return $post_id; 288 | } 289 | } else { 290 | if ( ! current_user_can( 'edit_post', $post_id ) ) { 291 | return $post_id; 292 | } 293 | } 294 | 295 | $field_data = $this->get_custom_fields_settings(); 296 | $fields = array_keys( $field_data ); 297 | 298 | foreach ( $fields as $f ) { 299 | 300 | ${$f} = wp_strip_all_tags( trim( $_POST[ $f ] ) ); 301 | 302 | // Escape the URLs. 303 | if ( 'url' === $field_data[ $f ]['type'] ) { 304 | ${$f} = esc_url( ${$f} ); 305 | } 306 | 307 | if ( '' === get_post_meta( $post_id, '_' . $f ) ) { 308 | add_post_meta( $post_id, '_' . $f, ${$f}, true ); 309 | } elseif ( get_post_meta( $post_id, '_' . $f, true ) !== ${$f} ) { 310 | update_post_meta( $post_id, '_' . $f, ${$f} ); 311 | } elseif ( '' === ${$f} ) { 312 | delete_post_meta( $post_id, '_' . $f, get_post_meta( $post_id, '_' . $f, true ) ); 313 | } 314 | } 315 | } 316 | 317 | /** 318 | * Customise the "Enter title here" text. 319 | * @access public 320 | * @since 1.0.0 321 | * @param string $title 322 | * @return void 323 | */ 324 | public function enter_title_here ( $title ) { 325 | if ( get_post_type() === $this->post_type ) { 326 | $title = __( 'Enter the thing title here', 'starter-plugin' ); 327 | } 328 | return $title; 329 | } 330 | 331 | /** 332 | * Get the settings for the custom fields. 333 | * @access public 334 | * @since 1.0.0 335 | * @return array 336 | */ 337 | public function get_custom_fields_settings () { 338 | $fields = array(); 339 | 340 | $fields['url'] = array( 341 | 'name' => __( 'URL', 'starter-plugin' ), 342 | 'description' => __( 'Enter a URL that applies to this thing (for example: http://domain.com/).', 'starter-plugin' ), 343 | 'type' => 'url', 344 | 'default' => '', 345 | 'section' => 'info', 346 | ); 347 | 348 | return apply_filters( 'starter_plugin_custom_fields_settings', $fields ); 349 | } 350 | 351 | /** 352 | * Get the image for the given ID. 353 | * @param int $id Post ID. 354 | * @param mixed $size Image dimension. (default: "thumbnail") 355 | * @param boolean $return Whether to return the result, or to output to the browser. Default: return. 356 | * @since 1.0.0 357 | * @return string tag. 358 | */ 359 | protected function get_image ( $id, $size = 'thumbnail', $return = true ) { 360 | $response = ''; 361 | 362 | if ( has_post_thumbnail( $id ) ) { 363 | // If not a string or an array, and not an integer, default to 150x9999. 364 | if ( ( is_int( $size ) || ( 0 < intval( $size ) ) ) && ! is_array( $size ) ) { 365 | $size = array( intval( $size ), intval( $size ) ); 366 | } elseif ( ! is_string( $size ) && ! is_array( $size ) ) { 367 | $size = array( 150, 9999 ); 368 | } 369 | $response = get_the_post_thumbnail( intval( $id ), $size ); 370 | } 371 | 372 | if ( true === $return ) { 373 | return $response; 374 | } else { 375 | echo $response; /* phpcs:ignore */ 376 | } 377 | } 378 | 379 | /** 380 | * Register image sizes. 381 | * @access public 382 | * @since 1.0.0 383 | */ 384 | public function register_image_sizes () { 385 | if ( function_exists( 'add_image_size' ) ) { 386 | add_image_size( $this->post_type . '-thumbnail', 150, 9999 ); // 150 pixels wide (and unlimited height) 387 | } 388 | } 389 | 390 | /** 391 | * Run on activation. 392 | * @access public 393 | * @since 1.0.0 394 | */ 395 | public function activation () { 396 | $this->flush_rewrite_rules(); 397 | } 398 | 399 | /** 400 | * Flush the rewrite rules 401 | * @access public 402 | * @since 1.0.0 403 | */ 404 | private function flush_rewrite_rules () { 405 | $this->register_post_type(); 406 | flush_rewrite_rules(); 407 | } 408 | 409 | /** 410 | * Ensure that "post-thumbnails" support is available for those themes that don't register it. 411 | * @access public 412 | * @since 1.0.0 413 | */ 414 | public function ensure_post_thumbnails_support () { 415 | if ( ! current_theme_supports( 'post-thumbnails' ) ) { 416 | add_theme_support( 'post-thumbnails' ); } 417 | } 418 | } 419 | -------------------------------------------------------------------------------- /classes/class-starter-plugin-settings.php: -------------------------------------------------------------------------------- 1 | get_settings_fields( $section ); 67 | 68 | foreach ( $input as $k => $v ) { 69 | if ( ! isset( $fields[ $k ] ) ) { 70 | continue; 71 | } 72 | 73 | // Determine if a method is available for validating this field. 74 | $method = 'validate_field_' . $fields[ $k ]['type']; 75 | 76 | if ( ! method_exists( $this, $method ) ) { 77 | if ( true === (bool) apply_filters( 'starter_plugin_validate_field_' . $fields[ $k ]['type'] . '_use_default', true ) ) { 78 | $method = 'validate_field_text'; 79 | } else { 80 | $method = ''; 81 | } 82 | } 83 | 84 | // If we have an internal method for validation, filter and apply it. 85 | if ( '' !== $method ) { 86 | add_filter( 'starter_plugin_validate_field_' . $fields[ $k ]['type'], array( $this, $method ) ); 87 | } 88 | 89 | $method_output = apply_filters( 'starter_plugin_validate_field_' . $fields[ $k ]['type'], $v, $fields[ $k ] ); 90 | 91 | if ( ! is_wp_error( $method_output ) ) { 92 | $input[ $k ] = $method_output; 93 | } 94 | } 95 | } 96 | return $input; 97 | } 98 | 99 | /** 100 | * Validate the given data, assuming it is from a text input field. 101 | * @access public 102 | * @since 6.0.0 103 | * @return void 104 | */ 105 | public function validate_field_text ( $v ) { 106 | return (string) wp_kses_post( $v ); 107 | } 108 | 109 | /** 110 | * Validate the given data, assuming it is from a textarea field. 111 | * @access public 112 | * @since 6.0.0 113 | * @return void 114 | */ 115 | public function validate_field_textarea ( $v ) { 116 | // Allow iframe, object and embed tags in textarea fields. 117 | $allowed = wp_kses_allowed_html( 'post' ); 118 | $allowed['iframe'] = array( 119 | 'src' => true, 120 | 'width' => true, 121 | 'height' => true, 122 | 'id' => true, 123 | 'class' => true, 124 | 'name' => true, 125 | ); 126 | $allowed['object'] = array( 127 | 'src' => true, 128 | 'width' => true, 129 | 'height' => true, 130 | 'id' => true, 131 | 'class' => true, 132 | 'name' => true, 133 | ); 134 | $allowed['embed'] = array( 135 | 'src' => true, 136 | 'width' => true, 137 | 'height' => true, 138 | 'id' => true, 139 | 'class' => true, 140 | 'name' => true, 141 | ); 142 | 143 | return wp_kses( $v, $allowed ); 144 | } 145 | 146 | /** 147 | * Validate the given data, assuming it is from a checkbox input field. 148 | * @access public 149 | * @since 6.0.0 150 | * @param string $v 151 | * @return string 152 | */ 153 | public function validate_field_checkbox ( $v ) { 154 | if ( 'true' !== $v ) { 155 | return 'false'; 156 | } else { 157 | return 'true'; 158 | } 159 | } 160 | 161 | /** 162 | * Validate the given data, assuming it is from a URL field. 163 | * @access public 164 | * @since 6.0.0 165 | * @param string $v 166 | * @return string 167 | */ 168 | public function validate_field_url ( $v ) { 169 | return trim( esc_url( $v ) ); 170 | } 171 | 172 | /** 173 | * Render a field of a given type. 174 | * @access public 175 | * @since 1.0.0 176 | * @param array $args The field parameters. 177 | * @return void 178 | */ 179 | public function render_field ( $args ) { 180 | if ( ! in_array( $args['type'], $this->get_supported_fields(), true ) ) { 181 | return ''; // Supported field type sanity check. 182 | } 183 | 184 | // Make sure we have some kind of default, if the key isn't set. 185 | if ( ! isset( $args['default'] ) ) { 186 | $args['default'] = ''; 187 | } 188 | 189 | $method = 'render_field_' . $args['type']; 190 | 191 | if ( ! method_exists( $this, $method ) ) { 192 | $method = 'render_field_text'; 193 | } 194 | 195 | // Construct the key. 196 | $key = Starter_Plugin()->token . '-' . $args['section'] . '[' . $args['id'] . ']'; 197 | 198 | echo $this->$method( $key, $args ); /* phpcs:ignore */ 199 | 200 | // Output the description, if the current field allows it. 201 | if ( isset( $args['type'] ) && ! in_array( $args['type'], (array) apply_filters( 'starter_plugin_no_description_fields', array( 'checkbox' ) ), true ) ) { 202 | if ( isset( $args['description'] ) ) { 203 | $description = $args['description']; 204 | if ( in_array( $args['type'], (array) apply_filters( 'starter_plugin_new_line_description_fields', array( 'textarea', 'select' ) ), true ) ) { 205 | $description = wpautop( $description ); 206 | } 207 | echo '

' . wp_kses_post( $description ) . '

'; 208 | } 209 | } 210 | } 211 | 212 | /** 213 | * Retrieve the settings fields details 214 | * @access public 215 | * @since 1.0.0 216 | * @return array Settings fields. 217 | */ 218 | public function get_settings_sections () { 219 | $settings_sections = array(); 220 | 221 | $settings_sections['standard-fields'] = __( 'Standard Fields', 'starter-plugin' ); 222 | $settings_sections['special-fields'] = __( 'Special Fields', 'starter-plugin' ); 223 | // Add your new sections below here. 224 | // Admin tabs will be created for each section. 225 | // Don't forget to add fields for the section in the get_settings_fields() function below 226 | 227 | return (array) apply_filters( 'starter_plugin_settings_sections', $settings_sections ); 228 | } 229 | 230 | /** 231 | * Retrieve the settings fields details 232 | * @access public 233 | * @param string $section field section. 234 | * @since 1.0.0 235 | * @return array Settings fields. 236 | */ 237 | public function get_settings_fields ( $section ) { 238 | $settings_fields = array(); 239 | // Declare the default settings fields. 240 | 241 | switch ( $section ) { 242 | case 'standard-fields': 243 | $settings_fields['text'] = array( 244 | 'name' => __( 'Example Text Input', 'starter-plugin' ), 245 | 'type' => 'text', 246 | 'default' => '', 247 | 'section' => 'standard-fields', 248 | 'description' => __( 'Place the field description text here.', 'starter-plugin' ), 249 | ); 250 | $settings_fields['textarea'] = array( 251 | 'name' => __( 'Example Textarea', 'starter-plugin' ), 252 | 'type' => 'textarea', 253 | 'default' => '', 254 | 'section' => 'standard-fields', 255 | 'description' => __( 'Place the field description text here.', 'starter-plugin' ), 256 | ); 257 | $settings_fields['checkbox'] = array( 258 | 'name' => __( 'Example Checkbox', 'starter-plugin' ), 259 | 'type' => 'checkbox', 260 | 'default' => '', 261 | 'section' => 'standard-fields', 262 | 'description' => __( 'Place the field description text here.', 'starter-plugin' ), 263 | ); 264 | $settings_fields['radio'] = array( 265 | 'name' => __( 'Example Radio Buttons', 'starter-plugin' ), 266 | 'type' => 'radio', 267 | 'default' => '', 268 | 'section' => 'standard-fields', 269 | 'options' => array( 270 | 'one' => __( 'One', 'starter-plugin' ), 271 | 'two' => __( 'Two', 'starter-plugin' ), 272 | 'three' => __( 'Three', 'starter-plugin' ), 273 | ), 274 | 'description' => __( 'Place the field description text here.', 'starter-plugin' ), 275 | ); 276 | $settings_fields['select'] = array( 277 | 'name' => __( 'Example Select', 'starter-plugin' ), 278 | 'type' => 'select', 279 | 'default' => '', 280 | 'section' => 'standard-fields', 281 | 'options' => array( 282 | 'one' => __( 'One', 'starter-plugin' ), 283 | 'two' => __( 'Two', 'starter-plugin' ), 284 | 'three' => __( 'Three', 'starter-plugin' ), 285 | ), 286 | 'description' => __( 'Place the field description text here.', 'starter-plugin' ), 287 | ); 288 | 289 | break; 290 | case 'special-fields': 291 | $settings_fields['select_taxonomy'] = array( 292 | 'name' => __( 'Example Taxonomy Selector', 'starter-plugin' ), 293 | 'type' => 'select_taxonomy', 294 | 'default' => '', 295 | 'section' => 'special-fields', 296 | 'description' => __( 'Place the field description text here.', 'starter-plugin' ), 297 | ); 298 | 299 | break; 300 | default: 301 | # code... 302 | break; 303 | } 304 | 305 | return (array) apply_filters( 'starter_plugin_settings_fields', $settings_fields ); 306 | } 307 | 308 | /** 309 | * Render HTML markup for the "text" field type. 310 | * @access protected 311 | * @since 6.0.0 312 | * @param string $key The unique ID of this field. 313 | * @param array $args Arguments used to construct this field. 314 | * @return string HTML markup for the field. 315 | */ 316 | protected function render_field_text ( $key, $args ) { 317 | $html = '' . "\n"; 318 | return $html; 319 | } 320 | 321 | /** 322 | * Render HTML markup for the "radio" field type. 323 | * @access protected 324 | * @since 6.0.0 325 | * @param string $key The unique ID of this field. 326 | * @param array $args Arguments used to construct this field. 327 | * @return string HTML markup for the field. 328 | */ 329 | protected function render_field_radio ( $key, $args ) { 330 | $html = ''; 331 | if ( isset( $args['options'] ) && ( 0 < count( (array) $args['options'] ) ) ) { 332 | $html = ''; 333 | foreach ( $args['options'] as $k => $v ) { 334 | $html .= 'get_value( $args['id'], $args['default'], $args['section'] ) ), $k, false ) . ' /> ' . esc_html( $v ) . '
' . "\n"; 335 | } 336 | } 337 | return $html; 338 | } 339 | 340 | /** 341 | * Render HTML markup for the "textarea" field type. 342 | * @access protected 343 | * @since 6.0.0 344 | * @param string $key The unique ID of this field. 345 | * @param array $args Arguments used to construct this field. 346 | * @return string HTML markup for the field. 347 | */ 348 | protected function render_field_textarea ( $key, $args ) { 349 | // Explore how best to escape this data, as esc_textarea() strips HTML tags, it seems. 350 | $html = '' . "\n"; 351 | return $html; 352 | } 353 | 354 | /** 355 | * Render HTML markup for the "checkbox" field type. 356 | * @access protected 357 | * @since 6.0.0 358 | * @param string $key The unique ID of this field. 359 | * @param array $args Arguments used to construct this field. 360 | * @return string HTML markup for the field. 361 | */ 362 | protected function render_field_checkbox ( $key, $args ) { 363 | $has_description = false; 364 | $html = ''; 365 | if ( isset( $args['description'] ) ) { 366 | $has_description = true; 367 | $html .= '' . "\n"; 372 | } 373 | return $html; 374 | } 375 | 376 | /** 377 | * Render HTML markup for the "select2" field type. 378 | * @access protected 379 | * @since 6.0.0 380 | * @param string $key The unique ID of this field. 381 | * @param array $args Arguments used to construct this field. 382 | * @return string HTML markup for the field. 383 | */ 384 | protected function render_field_select ( $key, $args ) { 385 | $this->has_select = true; 386 | 387 | $html = ''; 388 | if ( isset( $args['options'] ) && ( 0 < count( (array) $args['options'] ) ) ) { 389 | $html .= '' . "\n"; 394 | } 395 | return $html; 396 | } 397 | 398 | /** 399 | * Render HTML markup for the "select_taxonomy" field type. 400 | * @access protected 401 | * @since 6.0.0 402 | * @param string $key The unique ID of this field. 403 | * @param array $args Arguments used to construct this field. 404 | * @return string HTML markup for the field. 405 | */ 406 | protected function render_field_select_taxonomy ( $key, $args ) { 407 | $this->has_select = true; 408 | 409 | $defaults = array( 410 | 'show_option_all' => '', 411 | 'show_option_none' => '', 412 | 'orderby' => 'ID', 413 | 'order' => 'ASC', 414 | 'show_count' => 0, 415 | 'hide_empty' => 1, 416 | 'child_of' => 0, 417 | 'exclude' => '', 418 | 'selected' => $this->get_value( $args['id'], $args['default'], $args['section'] ), 419 | 'hierarchical' => 1, 420 | 'class' => 'postform', 421 | 'depth' => 0, 422 | 'tab_index' => 0, 423 | 'taxonomy' => 'category', 424 | 'hide_if_empty' => false, 425 | 'walker' => '', 426 | ); 427 | 428 | if ( ! isset( $args['options'] ) ) { 429 | $args['options'] = array(); 430 | } 431 | 432 | $args['options'] = wp_parse_args( $args['options'], $defaults ); 433 | $args['options']['echo'] = false; 434 | $args['options']['name'] = esc_attr( $key ); 435 | $args['options']['id'] = esc_attr( $key ); 436 | 437 | $html = ''; 438 | $html .= wp_dropdown_categories( $args['options'] ); 439 | 440 | return $html; 441 | } 442 | 443 | /** 444 | * Return an array of field types expecting an array value returned. 445 | * @access public 446 | * @since 1.0.0 447 | * @return array 448 | */ 449 | public function get_array_field_types () { 450 | return array(); 451 | } 452 | 453 | /** 454 | * Return an array of field types where no label/header is to be displayed. 455 | * @access protected 456 | * @since 1.0.0 457 | * @return array 458 | */ 459 | protected function get_no_label_field_types () { 460 | return array( 'info' ); 461 | } 462 | 463 | /** 464 | * Return a filtered array of supported field types. 465 | * @access public 466 | * @since 1.0.0 467 | * @return array Supported field type keys. 468 | */ 469 | public function get_supported_fields () { 470 | return (array) apply_filters( 'starter_plugin_supported_fields', array( 'text', 'checkbox', 'radio', 'textarea', 'select', 'select_taxonomy' ) ); 471 | } 472 | 473 | /** 474 | * Return a value, using a desired retrieval method. 475 | * @access public 476 | * @param string $key option key. 477 | * @param string $default default value. 478 | * @param string $section field section. 479 | * @since 1.0.0 480 | * @return mixed Returned value. 481 | */ 482 | public function get_value ( $key, $default, $section ) { 483 | $values = get_option( 'starter-plugin-' . $section, array() ); 484 | 485 | if ( is_array( $values ) && isset( $values[ $key ] ) ) { 486 | $response = $values[ $key ]; 487 | } else { 488 | $response = $default; 489 | } 490 | 491 | return $response; 492 | } 493 | 494 | /** 495 | * Return all settings keys. 496 | * @access public 497 | * @param string $section field section. 498 | * @since 1.0.0 499 | * @return mixed Returned value. 500 | */ 501 | public function get_settings ( $section = '' ) { 502 | $response = false; 503 | 504 | $sections = array_keys( (array) $this->get_settings_sections() ); 505 | 506 | if ( in_array( $section, $sections, true ) ) { 507 | $sections = array( $section ); 508 | } 509 | 510 | if ( 0 < count( $sections ) ) { 511 | foreach ( $sections as $k => $v ) { 512 | $fields = $this->get_settings_fields( $v ); 513 | $values = get_option( 'starter-plugin-' . $v, array() ); 514 | 515 | if ( is_array( $fields ) && 0 < count( $fields ) ) { 516 | foreach ( $fields as $i => $j ) { 517 | // If we have a value stored, use it. 518 | if ( isset( $values[ $i ] ) ) { 519 | $response[ $i ] = $values[ $i ]; 520 | } else { 521 | // Otherwise, check for a default value. If we have one, use it. Otherwise, return an empty string. 522 | if ( isset( $fields[ $i ]['default'] ) ) { 523 | $response[ $i ] = $fields[ $i ]['default']; 524 | } else { 525 | $response[ $i ] = ''; 526 | } 527 | } 528 | } 529 | } 530 | } 531 | } 532 | 533 | return $response; 534 | } 535 | } 536 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "c7a4799477956f8ced98bca1ce44e88f", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "dealerdirect/phpcodesniffer-composer-installer", 12 | "version": "v0.7.2", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", 16 | "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", 21 | "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "composer-plugin-api": "^1.0 || ^2.0", 26 | "php": ">=5.3", 27 | "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" 28 | }, 29 | "require-dev": { 30 | "composer/composer": "*", 31 | "php-parallel-lint/php-parallel-lint": "^1.3.1", 32 | "phpcompatibility/php-compatibility": "^9.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 | "name": "Contributors", 56 | "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" 57 | } 58 | ], 59 | "description": "PHP_CodeSniffer Standards Composer Installer Plugin", 60 | "homepage": "http://www.dealerdirect.com", 61 | "keywords": [ 62 | "PHPCodeSniffer", 63 | "PHP_CodeSniffer", 64 | "code quality", 65 | "codesniffer", 66 | "composer", 67 | "installer", 68 | "phpcbf", 69 | "phpcs", 70 | "plugin", 71 | "qa", 72 | "quality", 73 | "standard", 74 | "standards", 75 | "style guide", 76 | "stylecheck", 77 | "tests" 78 | ], 79 | "support": { 80 | "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", 81 | "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" 82 | }, 83 | "time": "2022-02-04T12:51:07+00:00" 84 | }, 85 | { 86 | "name": "doctrine/instantiator", 87 | "version": "1.5.0", 88 | "source": { 89 | "type": "git", 90 | "url": "https://github.com/doctrine/instantiator.git", 91 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 92 | }, 93 | "dist": { 94 | "type": "zip", 95 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 96 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 97 | "shasum": "" 98 | }, 99 | "require": { 100 | "php": "^7.1 || ^8.0" 101 | }, 102 | "require-dev": { 103 | "doctrine/coding-standard": "^9 || ^11", 104 | "ext-pdo": "*", 105 | "ext-phar": "*", 106 | "phpbench/phpbench": "^0.16 || ^1", 107 | "phpstan/phpstan": "^1.4", 108 | "phpstan/phpstan-phpunit": "^1", 109 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 110 | "vimeo/psalm": "^4.30 || ^5.4" 111 | }, 112 | "type": "library", 113 | "autoload": { 114 | "psr-4": { 115 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 116 | } 117 | }, 118 | "notification-url": "https://packagist.org/downloads/", 119 | "license": [ 120 | "MIT" 121 | ], 122 | "authors": [ 123 | { 124 | "name": "Marco Pivetta", 125 | "email": "ocramius@gmail.com", 126 | "homepage": "https://ocramius.github.io/" 127 | } 128 | ], 129 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 130 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 131 | "keywords": [ 132 | "constructor", 133 | "instantiate" 134 | ], 135 | "support": { 136 | "issues": "https://github.com/doctrine/instantiator/issues", 137 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 138 | }, 139 | "funding": [ 140 | { 141 | "url": "https://www.doctrine-project.org/sponsorship.html", 142 | "type": "custom" 143 | }, 144 | { 145 | "url": "https://www.patreon.com/phpdoctrine", 146 | "type": "patreon" 147 | }, 148 | { 149 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 150 | "type": "tidelift" 151 | } 152 | ], 153 | "time": "2022-12-30T00:15:36+00:00" 154 | }, 155 | { 156 | "name": "myclabs/deep-copy", 157 | "version": "1.11.1", 158 | "source": { 159 | "type": "git", 160 | "url": "https://github.com/myclabs/DeepCopy.git", 161 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" 162 | }, 163 | "dist": { 164 | "type": "zip", 165 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 166 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 167 | "shasum": "" 168 | }, 169 | "require": { 170 | "php": "^7.1 || ^8.0" 171 | }, 172 | "conflict": { 173 | "doctrine/collections": "<1.6.8", 174 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 175 | }, 176 | "require-dev": { 177 | "doctrine/collections": "^1.6.8", 178 | "doctrine/common": "^2.13.3 || ^3.2.2", 179 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 180 | }, 181 | "type": "library", 182 | "autoload": { 183 | "files": [ 184 | "src/DeepCopy/deep_copy.php" 185 | ], 186 | "psr-4": { 187 | "DeepCopy\\": "src/DeepCopy/" 188 | } 189 | }, 190 | "notification-url": "https://packagist.org/downloads/", 191 | "license": [ 192 | "MIT" 193 | ], 194 | "description": "Create deep copies (clones) of your objects", 195 | "keywords": [ 196 | "clone", 197 | "copy", 198 | "duplicate", 199 | "object", 200 | "object graph" 201 | ], 202 | "support": { 203 | "issues": "https://github.com/myclabs/DeepCopy/issues", 204 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" 205 | }, 206 | "funding": [ 207 | { 208 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 209 | "type": "tidelift" 210 | } 211 | ], 212 | "time": "2023-03-08T13:26:56+00:00" 213 | }, 214 | { 215 | "name": "nette/utils", 216 | "version": "v3.2.10", 217 | "source": { 218 | "type": "git", 219 | "url": "https://github.com/nette/utils.git", 220 | "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" 221 | }, 222 | "dist": { 223 | "type": "zip", 224 | "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2", 225 | "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", 226 | "shasum": "" 227 | }, 228 | "require": { 229 | "php": ">=7.2 <8.4" 230 | }, 231 | "conflict": { 232 | "nette/di": "<3.0.6" 233 | }, 234 | "require-dev": { 235 | "jetbrains/phpstorm-attributes": "dev-master", 236 | "nette/tester": "~2.0", 237 | "phpstan/phpstan": "^1.0", 238 | "tracy/tracy": "^2.3" 239 | }, 240 | "suggest": { 241 | "ext-gd": "to use Image", 242 | "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", 243 | "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", 244 | "ext-json": "to use Nette\\Utils\\Json", 245 | "ext-mbstring": "to use Strings::lower() etc...", 246 | "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", 247 | "ext-xml": "to use Strings::length() etc. when mbstring is not available" 248 | }, 249 | "type": "library", 250 | "extra": { 251 | "branch-alias": { 252 | "dev-master": "3.2-dev" 253 | } 254 | }, 255 | "autoload": { 256 | "classmap": [ 257 | "src/" 258 | ] 259 | }, 260 | "notification-url": "https://packagist.org/downloads/", 261 | "license": [ 262 | "BSD-3-Clause", 263 | "GPL-2.0-only", 264 | "GPL-3.0-only" 265 | ], 266 | "authors": [ 267 | { 268 | "name": "David Grudl", 269 | "homepage": "https://davidgrudl.com" 270 | }, 271 | { 272 | "name": "Nette Community", 273 | "homepage": "https://nette.org/contributors" 274 | } 275 | ], 276 | "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", 277 | "homepage": "https://nette.org", 278 | "keywords": [ 279 | "array", 280 | "core", 281 | "datetime", 282 | "images", 283 | "json", 284 | "nette", 285 | "paginator", 286 | "password", 287 | "slugify", 288 | "string", 289 | "unicode", 290 | "utf-8", 291 | "utility", 292 | "validation" 293 | ], 294 | "support": { 295 | "issues": "https://github.com/nette/utils/issues", 296 | "source": "https://github.com/nette/utils/tree/v3.2.10" 297 | }, 298 | "time": "2023-07-30T15:38:18+00:00" 299 | }, 300 | { 301 | "name": "object-calisthenics/phpcs-calisthenics-rules", 302 | "version": "v3.9.1", 303 | "source": { 304 | "type": "git", 305 | "url": "https://github.com/object-calisthenics/phpcs-calisthenics-rules.git", 306 | "reference": "6a4e66767138763839370273b47f1f9da6e0ee5a" 307 | }, 308 | "dist": { 309 | "type": "zip", 310 | "url": "https://api.github.com/repos/object-calisthenics/phpcs-calisthenics-rules/zipball/6a4e66767138763839370273b47f1f9da6e0ee5a", 311 | "reference": "6a4e66767138763839370273b47f1f9da6e0ee5a", 312 | "shasum": "" 313 | }, 314 | "require": { 315 | "nette/utils": "^3.1", 316 | "php": "^7.4|^8.0", 317 | "slevomat/coding-standard": "^6.3", 318 | "squizlabs/php_codesniffer": "^3.5" 319 | }, 320 | "require-dev": { 321 | "migrify/config-transformer": "^0.3.35", 322 | "phpstan/phpdoc-parser": "^0.4.9", 323 | "phpstan/phpstan": "^0.12.38", 324 | "phpunit/phpunit": "^9.3", 325 | "rector/rector": "^0.8.6", 326 | "symplify/changelog-linker": "^8.2", 327 | "symplify/coding-standard": "^8.2", 328 | "symplify/easy-coding-standard-tester": "^8.2", 329 | "symplify/phpstan-extensions": "^8.2", 330 | "tracy/tracy": "^2.7" 331 | }, 332 | "type": "phpcodesniffer-standard", 333 | "autoload": { 334 | "psr-4": { 335 | "ObjectCalisthenics\\": "src/ObjectCalisthenics" 336 | } 337 | }, 338 | "notification-url": "https://packagist.org/downloads/", 339 | "license": [ 340 | "MIT" 341 | ], 342 | "description": "PHP CodeSniffer Object Calisthenics rules/sniffs", 343 | "support": { 344 | "issues": "https://github.com/object-calisthenics/phpcs-calisthenics-rules/issues", 345 | "source": "https://github.com/object-calisthenics/phpcs-calisthenics-rules/tree/master" 346 | }, 347 | "abandoned": "symplify/phpstan-rules", 348 | "time": "2020-09-08T10:18:44+00:00" 349 | }, 350 | { 351 | "name": "phar-io/manifest", 352 | "version": "2.0.3", 353 | "source": { 354 | "type": "git", 355 | "url": "https://github.com/phar-io/manifest.git", 356 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 357 | }, 358 | "dist": { 359 | "type": "zip", 360 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 361 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 362 | "shasum": "" 363 | }, 364 | "require": { 365 | "ext-dom": "*", 366 | "ext-phar": "*", 367 | "ext-xmlwriter": "*", 368 | "phar-io/version": "^3.0.1", 369 | "php": "^7.2 || ^8.0" 370 | }, 371 | "type": "library", 372 | "extra": { 373 | "branch-alias": { 374 | "dev-master": "2.0.x-dev" 375 | } 376 | }, 377 | "autoload": { 378 | "classmap": [ 379 | "src/" 380 | ] 381 | }, 382 | "notification-url": "https://packagist.org/downloads/", 383 | "license": [ 384 | "BSD-3-Clause" 385 | ], 386 | "authors": [ 387 | { 388 | "name": "Arne Blankerts", 389 | "email": "arne@blankerts.de", 390 | "role": "Developer" 391 | }, 392 | { 393 | "name": "Sebastian Heuer", 394 | "email": "sebastian@phpeople.de", 395 | "role": "Developer" 396 | }, 397 | { 398 | "name": "Sebastian Bergmann", 399 | "email": "sebastian@phpunit.de", 400 | "role": "Developer" 401 | } 402 | ], 403 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 404 | "support": { 405 | "issues": "https://github.com/phar-io/manifest/issues", 406 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 407 | }, 408 | "time": "2021-07-20T11:28:43+00:00" 409 | }, 410 | { 411 | "name": "phar-io/version", 412 | "version": "3.2.1", 413 | "source": { 414 | "type": "git", 415 | "url": "https://github.com/phar-io/version.git", 416 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 417 | }, 418 | "dist": { 419 | "type": "zip", 420 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 421 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 422 | "shasum": "" 423 | }, 424 | "require": { 425 | "php": "^7.2 || ^8.0" 426 | }, 427 | "type": "library", 428 | "autoload": { 429 | "classmap": [ 430 | "src/" 431 | ] 432 | }, 433 | "notification-url": "https://packagist.org/downloads/", 434 | "license": [ 435 | "BSD-3-Clause" 436 | ], 437 | "authors": [ 438 | { 439 | "name": "Arne Blankerts", 440 | "email": "arne@blankerts.de", 441 | "role": "Developer" 442 | }, 443 | { 444 | "name": "Sebastian Heuer", 445 | "email": "sebastian@phpeople.de", 446 | "role": "Developer" 447 | }, 448 | { 449 | "name": "Sebastian Bergmann", 450 | "email": "sebastian@phpunit.de", 451 | "role": "Developer" 452 | } 453 | ], 454 | "description": "Library for handling version information and constraints", 455 | "support": { 456 | "issues": "https://github.com/phar-io/version/issues", 457 | "source": "https://github.com/phar-io/version/tree/3.2.1" 458 | }, 459 | "time": "2022-02-21T01:04:05+00:00" 460 | }, 461 | { 462 | "name": "phpcompatibility/php-compatibility", 463 | "version": "9.3.5", 464 | "source": { 465 | "type": "git", 466 | "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", 467 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" 468 | }, 469 | "dist": { 470 | "type": "zip", 471 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", 472 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", 473 | "shasum": "" 474 | }, 475 | "require": { 476 | "php": ">=5.3", 477 | "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" 478 | }, 479 | "conflict": { 480 | "squizlabs/php_codesniffer": "2.6.2" 481 | }, 482 | "require-dev": { 483 | "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" 484 | }, 485 | "suggest": { 486 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", 487 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 488 | }, 489 | "type": "phpcodesniffer-standard", 490 | "notification-url": "https://packagist.org/downloads/", 491 | "license": [ 492 | "LGPL-3.0-or-later" 493 | ], 494 | "authors": [ 495 | { 496 | "name": "Wim Godden", 497 | "homepage": "https://github.com/wimg", 498 | "role": "lead" 499 | }, 500 | { 501 | "name": "Juliette Reinders Folmer", 502 | "homepage": "https://github.com/jrfnl", 503 | "role": "lead" 504 | }, 505 | { 506 | "name": "Contributors", 507 | "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" 508 | } 509 | ], 510 | "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", 511 | "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", 512 | "keywords": [ 513 | "compatibility", 514 | "phpcs", 515 | "standards" 516 | ], 517 | "support": { 518 | "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", 519 | "source": "https://github.com/PHPCompatibility/PHPCompatibility" 520 | }, 521 | "time": "2019-12-27T09:44:58+00:00" 522 | }, 523 | { 524 | "name": "phpcsstandards/phpcsextra", 525 | "version": "1.2.1", 526 | "source": { 527 | "type": "git", 528 | "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", 529 | "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489" 530 | }, 531 | "dist": { 532 | "type": "zip", 533 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", 534 | "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", 535 | "shasum": "" 536 | }, 537 | "require": { 538 | "php": ">=5.4", 539 | "phpcsstandards/phpcsutils": "^1.0.9", 540 | "squizlabs/php_codesniffer": "^3.8.0" 541 | }, 542 | "require-dev": { 543 | "php-parallel-lint/php-console-highlighter": "^1.0", 544 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 545 | "phpcsstandards/phpcsdevcs": "^1.1.6", 546 | "phpcsstandards/phpcsdevtools": "^1.2.1", 547 | "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 548 | }, 549 | "type": "phpcodesniffer-standard", 550 | "extra": { 551 | "branch-alias": { 552 | "dev-stable": "1.x-dev", 553 | "dev-develop": "1.x-dev" 554 | } 555 | }, 556 | "notification-url": "https://packagist.org/downloads/", 557 | "license": [ 558 | "LGPL-3.0-or-later" 559 | ], 560 | "authors": [ 561 | { 562 | "name": "Juliette Reinders Folmer", 563 | "homepage": "https://github.com/jrfnl", 564 | "role": "lead" 565 | }, 566 | { 567 | "name": "Contributors", 568 | "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" 569 | } 570 | ], 571 | "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", 572 | "keywords": [ 573 | "PHP_CodeSniffer", 574 | "phpcbf", 575 | "phpcodesniffer-standard", 576 | "phpcs", 577 | "standards", 578 | "static analysis" 579 | ], 580 | "support": { 581 | "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", 582 | "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", 583 | "source": "https://github.com/PHPCSStandards/PHPCSExtra" 584 | }, 585 | "funding": [ 586 | { 587 | "url": "https://github.com/PHPCSStandards", 588 | "type": "github" 589 | }, 590 | { 591 | "url": "https://github.com/jrfnl", 592 | "type": "github" 593 | }, 594 | { 595 | "url": "https://opencollective.com/php_codesniffer", 596 | "type": "open_collective" 597 | } 598 | ], 599 | "time": "2023-12-08T16:49:07+00:00" 600 | }, 601 | { 602 | "name": "phpcsstandards/phpcsutils", 603 | "version": "1.0.9", 604 | "source": { 605 | "type": "git", 606 | "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", 607 | "reference": "908247bc65010c7b7541a9551e002db12e9dae70" 608 | }, 609 | "dist": { 610 | "type": "zip", 611 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/908247bc65010c7b7541a9551e002db12e9dae70", 612 | "reference": "908247bc65010c7b7541a9551e002db12e9dae70", 613 | "shasum": "" 614 | }, 615 | "require": { 616 | "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", 617 | "php": ">=5.4", 618 | "squizlabs/php_codesniffer": "^3.8.0 || 4.0.x-dev@dev" 619 | }, 620 | "require-dev": { 621 | "ext-filter": "*", 622 | "php-parallel-lint/php-console-highlighter": "^1.0", 623 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 624 | "phpcsstandards/phpcsdevcs": "^1.1.6", 625 | "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" 626 | }, 627 | "type": "phpcodesniffer-standard", 628 | "extra": { 629 | "branch-alias": { 630 | "dev-stable": "1.x-dev", 631 | "dev-develop": "1.x-dev" 632 | } 633 | }, 634 | "autoload": { 635 | "classmap": [ 636 | "PHPCSUtils/" 637 | ] 638 | }, 639 | "notification-url": "https://packagist.org/downloads/", 640 | "license": [ 641 | "LGPL-3.0-or-later" 642 | ], 643 | "authors": [ 644 | { 645 | "name": "Juliette Reinders Folmer", 646 | "homepage": "https://github.com/jrfnl", 647 | "role": "lead" 648 | }, 649 | { 650 | "name": "Contributors", 651 | "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" 652 | } 653 | ], 654 | "description": "A suite of utility functions for use with PHP_CodeSniffer", 655 | "homepage": "https://phpcsutils.com/", 656 | "keywords": [ 657 | "PHP_CodeSniffer", 658 | "phpcbf", 659 | "phpcodesniffer-standard", 660 | "phpcs", 661 | "phpcs3", 662 | "standards", 663 | "static analysis", 664 | "tokens", 665 | "utility" 666 | ], 667 | "support": { 668 | "docs": "https://phpcsutils.com/", 669 | "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", 670 | "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", 671 | "source": "https://github.com/PHPCSStandards/PHPCSUtils" 672 | }, 673 | "funding": [ 674 | { 675 | "url": "https://github.com/PHPCSStandards", 676 | "type": "github" 677 | }, 678 | { 679 | "url": "https://github.com/jrfnl", 680 | "type": "github" 681 | }, 682 | { 683 | "url": "https://opencollective.com/php_codesniffer", 684 | "type": "open_collective" 685 | } 686 | ], 687 | "time": "2023-12-08T14:50:00+00:00" 688 | }, 689 | { 690 | "name": "phpstan/phpdoc-parser", 691 | "version": "0.4.9", 692 | "source": { 693 | "type": "git", 694 | "url": "https://github.com/phpstan/phpdoc-parser.git", 695 | "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531" 696 | }, 697 | "dist": { 698 | "type": "zip", 699 | "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/98a088b17966bdf6ee25c8a4b634df313d8aa531", 700 | "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531", 701 | "shasum": "" 702 | }, 703 | "require": { 704 | "php": "^7.1 || ^8.0" 705 | }, 706 | "require-dev": { 707 | "consistence/coding-standard": "^3.5", 708 | "ergebnis/composer-normalize": "^2.0.2", 709 | "jakub-onderka/php-parallel-lint": "^0.9.2", 710 | "phing/phing": "^2.16.0", 711 | "phpstan/extension-installer": "^1.0", 712 | "phpstan/phpstan": "^0.12.26", 713 | "phpstan/phpstan-strict-rules": "^0.12", 714 | "phpunit/phpunit": "^6.3", 715 | "slevomat/coding-standard": "^4.7.2", 716 | "symfony/process": "^4.0" 717 | }, 718 | "type": "library", 719 | "extra": { 720 | "branch-alias": { 721 | "dev-master": "0.4-dev" 722 | } 723 | }, 724 | "autoload": { 725 | "psr-4": { 726 | "PHPStan\\PhpDocParser\\": [ 727 | "src/" 728 | ] 729 | } 730 | }, 731 | "notification-url": "https://packagist.org/downloads/", 732 | "license": [ 733 | "MIT" 734 | ], 735 | "description": "PHPDoc parser with support for nullable, intersection and generic types", 736 | "support": { 737 | "issues": "https://github.com/phpstan/phpdoc-parser/issues", 738 | "source": "https://github.com/phpstan/phpdoc-parser/tree/master" 739 | }, 740 | "time": "2020-08-03T20:32:43+00:00" 741 | }, 742 | { 743 | "name": "phpunit/php-code-coverage", 744 | "version": "7.0.15", 745 | "source": { 746 | "type": "git", 747 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 748 | "reference": "819f92bba8b001d4363065928088de22f25a3a48" 749 | }, 750 | "dist": { 751 | "type": "zip", 752 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", 753 | "reference": "819f92bba8b001d4363065928088de22f25a3a48", 754 | "shasum": "" 755 | }, 756 | "require": { 757 | "ext-dom": "*", 758 | "ext-xmlwriter": "*", 759 | "php": ">=7.2", 760 | "phpunit/php-file-iterator": "^2.0.2", 761 | "phpunit/php-text-template": "^1.2.1", 762 | "phpunit/php-token-stream": "^3.1.3 || ^4.0", 763 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 764 | "sebastian/environment": "^4.2.2", 765 | "sebastian/version": "^2.0.1", 766 | "theseer/tokenizer": "^1.1.3" 767 | }, 768 | "require-dev": { 769 | "phpunit/phpunit": "^8.2.2" 770 | }, 771 | "suggest": { 772 | "ext-xdebug": "^2.7.2" 773 | }, 774 | "type": "library", 775 | "extra": { 776 | "branch-alias": { 777 | "dev-master": "7.0-dev" 778 | } 779 | }, 780 | "autoload": { 781 | "classmap": [ 782 | "src/" 783 | ] 784 | }, 785 | "notification-url": "https://packagist.org/downloads/", 786 | "license": [ 787 | "BSD-3-Clause" 788 | ], 789 | "authors": [ 790 | { 791 | "name": "Sebastian Bergmann", 792 | "email": "sebastian@phpunit.de", 793 | "role": "lead" 794 | } 795 | ], 796 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 797 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 798 | "keywords": [ 799 | "coverage", 800 | "testing", 801 | "xunit" 802 | ], 803 | "support": { 804 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 805 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" 806 | }, 807 | "funding": [ 808 | { 809 | "url": "https://github.com/sebastianbergmann", 810 | "type": "github" 811 | } 812 | ], 813 | "time": "2021-07-26T12:20:09+00:00" 814 | }, 815 | { 816 | "name": "phpunit/php-file-iterator", 817 | "version": "2.0.5", 818 | "source": { 819 | "type": "git", 820 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 821 | "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" 822 | }, 823 | "dist": { 824 | "type": "zip", 825 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", 826 | "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", 827 | "shasum": "" 828 | }, 829 | "require": { 830 | "php": ">=7.1" 831 | }, 832 | "require-dev": { 833 | "phpunit/phpunit": "^8.5" 834 | }, 835 | "type": "library", 836 | "extra": { 837 | "branch-alias": { 838 | "dev-master": "2.0.x-dev" 839 | } 840 | }, 841 | "autoload": { 842 | "classmap": [ 843 | "src/" 844 | ] 845 | }, 846 | "notification-url": "https://packagist.org/downloads/", 847 | "license": [ 848 | "BSD-3-Clause" 849 | ], 850 | "authors": [ 851 | { 852 | "name": "Sebastian Bergmann", 853 | "email": "sebastian@phpunit.de", 854 | "role": "lead" 855 | } 856 | ], 857 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 858 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 859 | "keywords": [ 860 | "filesystem", 861 | "iterator" 862 | ], 863 | "support": { 864 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 865 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" 866 | }, 867 | "funding": [ 868 | { 869 | "url": "https://github.com/sebastianbergmann", 870 | "type": "github" 871 | } 872 | ], 873 | "time": "2021-12-02T12:42:26+00:00" 874 | }, 875 | { 876 | "name": "phpunit/php-text-template", 877 | "version": "1.2.1", 878 | "source": { 879 | "type": "git", 880 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 881 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 882 | }, 883 | "dist": { 884 | "type": "zip", 885 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 886 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 887 | "shasum": "" 888 | }, 889 | "require": { 890 | "php": ">=5.3.3" 891 | }, 892 | "type": "library", 893 | "autoload": { 894 | "classmap": [ 895 | "src/" 896 | ] 897 | }, 898 | "notification-url": "https://packagist.org/downloads/", 899 | "license": [ 900 | "BSD-3-Clause" 901 | ], 902 | "authors": [ 903 | { 904 | "name": "Sebastian Bergmann", 905 | "email": "sebastian@phpunit.de", 906 | "role": "lead" 907 | } 908 | ], 909 | "description": "Simple template engine.", 910 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 911 | "keywords": [ 912 | "template" 913 | ], 914 | "support": { 915 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 916 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" 917 | }, 918 | "time": "2015-06-21T13:50:34+00:00" 919 | }, 920 | { 921 | "name": "phpunit/php-timer", 922 | "version": "2.1.3", 923 | "source": { 924 | "type": "git", 925 | "url": "https://github.com/sebastianbergmann/php-timer.git", 926 | "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" 927 | }, 928 | "dist": { 929 | "type": "zip", 930 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", 931 | "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", 932 | "shasum": "" 933 | }, 934 | "require": { 935 | "php": ">=7.1" 936 | }, 937 | "require-dev": { 938 | "phpunit/phpunit": "^8.5" 939 | }, 940 | "type": "library", 941 | "extra": { 942 | "branch-alias": { 943 | "dev-master": "2.1-dev" 944 | } 945 | }, 946 | "autoload": { 947 | "classmap": [ 948 | "src/" 949 | ] 950 | }, 951 | "notification-url": "https://packagist.org/downloads/", 952 | "license": [ 953 | "BSD-3-Clause" 954 | ], 955 | "authors": [ 956 | { 957 | "name": "Sebastian Bergmann", 958 | "email": "sebastian@phpunit.de", 959 | "role": "lead" 960 | } 961 | ], 962 | "description": "Utility class for timing", 963 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 964 | "keywords": [ 965 | "timer" 966 | ], 967 | "support": { 968 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 969 | "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" 970 | }, 971 | "funding": [ 972 | { 973 | "url": "https://github.com/sebastianbergmann", 974 | "type": "github" 975 | } 976 | ], 977 | "time": "2020-11-30T08:20:02+00:00" 978 | }, 979 | { 980 | "name": "phpunit/php-token-stream", 981 | "version": "4.0.4", 982 | "source": { 983 | "type": "git", 984 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 985 | "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" 986 | }, 987 | "dist": { 988 | "type": "zip", 989 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", 990 | "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", 991 | "shasum": "" 992 | }, 993 | "require": { 994 | "ext-tokenizer": "*", 995 | "php": "^7.3 || ^8.0" 996 | }, 997 | "require-dev": { 998 | "phpunit/phpunit": "^9.0" 999 | }, 1000 | "type": "library", 1001 | "extra": { 1002 | "branch-alias": { 1003 | "dev-master": "4.0-dev" 1004 | } 1005 | }, 1006 | "autoload": { 1007 | "classmap": [ 1008 | "src/" 1009 | ] 1010 | }, 1011 | "notification-url": "https://packagist.org/downloads/", 1012 | "license": [ 1013 | "BSD-3-Clause" 1014 | ], 1015 | "authors": [ 1016 | { 1017 | "name": "Sebastian Bergmann", 1018 | "email": "sebastian@phpunit.de" 1019 | } 1020 | ], 1021 | "description": "Wrapper around PHP's tokenizer extension.", 1022 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 1023 | "keywords": [ 1024 | "tokenizer" 1025 | ], 1026 | "support": { 1027 | "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", 1028 | "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" 1029 | }, 1030 | "funding": [ 1031 | { 1032 | "url": "https://github.com/sebastianbergmann", 1033 | "type": "github" 1034 | } 1035 | ], 1036 | "abandoned": true, 1037 | "time": "2020-08-04T08:28:15+00:00" 1038 | }, 1039 | { 1040 | "name": "phpunit/phpunit", 1041 | "version": "8.5.36", 1042 | "source": { 1043 | "type": "git", 1044 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1045 | "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a" 1046 | }, 1047 | "dist": { 1048 | "type": "zip", 1049 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9652df58e06a681429d8cfdaec3c43d6de581d5a", 1050 | "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a", 1051 | "shasum": "" 1052 | }, 1053 | "require": { 1054 | "doctrine/instantiator": "^1.3.1", 1055 | "ext-dom": "*", 1056 | "ext-json": "*", 1057 | "ext-libxml": "*", 1058 | "ext-mbstring": "*", 1059 | "ext-xml": "*", 1060 | "ext-xmlwriter": "*", 1061 | "myclabs/deep-copy": "^1.10.0", 1062 | "phar-io/manifest": "^2.0.3", 1063 | "phar-io/version": "^3.0.2", 1064 | "php": ">=7.2", 1065 | "phpunit/php-code-coverage": "^7.0.12", 1066 | "phpunit/php-file-iterator": "^2.0.4", 1067 | "phpunit/php-text-template": "^1.2.1", 1068 | "phpunit/php-timer": "^2.1.2", 1069 | "sebastian/comparator": "^3.0.5", 1070 | "sebastian/diff": "^3.0.2", 1071 | "sebastian/environment": "^4.2.3", 1072 | "sebastian/exporter": "^3.1.5", 1073 | "sebastian/global-state": "^3.0.0", 1074 | "sebastian/object-enumerator": "^3.0.3", 1075 | "sebastian/resource-operations": "^2.0.1", 1076 | "sebastian/type": "^1.1.3", 1077 | "sebastian/version": "^2.0.1" 1078 | }, 1079 | "suggest": { 1080 | "ext-soap": "To be able to generate mocks based on WSDL files", 1081 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", 1082 | "phpunit/php-invoker": "To allow enforcing time limits" 1083 | }, 1084 | "bin": [ 1085 | "phpunit" 1086 | ], 1087 | "type": "library", 1088 | "extra": { 1089 | "branch-alias": { 1090 | "dev-master": "8.5-dev" 1091 | } 1092 | }, 1093 | "autoload": { 1094 | "classmap": [ 1095 | "src/" 1096 | ] 1097 | }, 1098 | "notification-url": "https://packagist.org/downloads/", 1099 | "license": [ 1100 | "BSD-3-Clause" 1101 | ], 1102 | "authors": [ 1103 | { 1104 | "name": "Sebastian Bergmann", 1105 | "email": "sebastian@phpunit.de", 1106 | "role": "lead" 1107 | } 1108 | ], 1109 | "description": "The PHP Unit Testing framework.", 1110 | "homepage": "https://phpunit.de/", 1111 | "keywords": [ 1112 | "phpunit", 1113 | "testing", 1114 | "xunit" 1115 | ], 1116 | "support": { 1117 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1118 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1119 | "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.36" 1120 | }, 1121 | "funding": [ 1122 | { 1123 | "url": "https://phpunit.de/sponsors.html", 1124 | "type": "custom" 1125 | }, 1126 | { 1127 | "url": "https://github.com/sebastianbergmann", 1128 | "type": "github" 1129 | }, 1130 | { 1131 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1132 | "type": "tidelift" 1133 | } 1134 | ], 1135 | "time": "2023-12-01T16:52:15+00:00" 1136 | }, 1137 | { 1138 | "name": "sebastian/code-unit-reverse-lookup", 1139 | "version": "1.0.2", 1140 | "source": { 1141 | "type": "git", 1142 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1143 | "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" 1144 | }, 1145 | "dist": { 1146 | "type": "zip", 1147 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", 1148 | "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", 1149 | "shasum": "" 1150 | }, 1151 | "require": { 1152 | "php": ">=5.6" 1153 | }, 1154 | "require-dev": { 1155 | "phpunit/phpunit": "^8.5" 1156 | }, 1157 | "type": "library", 1158 | "extra": { 1159 | "branch-alias": { 1160 | "dev-master": "1.0.x-dev" 1161 | } 1162 | }, 1163 | "autoload": { 1164 | "classmap": [ 1165 | "src/" 1166 | ] 1167 | }, 1168 | "notification-url": "https://packagist.org/downloads/", 1169 | "license": [ 1170 | "BSD-3-Clause" 1171 | ], 1172 | "authors": [ 1173 | { 1174 | "name": "Sebastian Bergmann", 1175 | "email": "sebastian@phpunit.de" 1176 | } 1177 | ], 1178 | "description": "Looks up which function or method a line of code belongs to", 1179 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1180 | "support": { 1181 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1182 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" 1183 | }, 1184 | "funding": [ 1185 | { 1186 | "url": "https://github.com/sebastianbergmann", 1187 | "type": "github" 1188 | } 1189 | ], 1190 | "time": "2020-11-30T08:15:22+00:00" 1191 | }, 1192 | { 1193 | "name": "sebastian/comparator", 1194 | "version": "3.0.5", 1195 | "source": { 1196 | "type": "git", 1197 | "url": "https://github.com/sebastianbergmann/comparator.git", 1198 | "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" 1199 | }, 1200 | "dist": { 1201 | "type": "zip", 1202 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", 1203 | "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", 1204 | "shasum": "" 1205 | }, 1206 | "require": { 1207 | "php": ">=7.1", 1208 | "sebastian/diff": "^3.0", 1209 | "sebastian/exporter": "^3.1" 1210 | }, 1211 | "require-dev": { 1212 | "phpunit/phpunit": "^8.5" 1213 | }, 1214 | "type": "library", 1215 | "extra": { 1216 | "branch-alias": { 1217 | "dev-master": "3.0-dev" 1218 | } 1219 | }, 1220 | "autoload": { 1221 | "classmap": [ 1222 | "src/" 1223 | ] 1224 | }, 1225 | "notification-url": "https://packagist.org/downloads/", 1226 | "license": [ 1227 | "BSD-3-Clause" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "Sebastian Bergmann", 1232 | "email": "sebastian@phpunit.de" 1233 | }, 1234 | { 1235 | "name": "Jeff Welch", 1236 | "email": "whatthejeff@gmail.com" 1237 | }, 1238 | { 1239 | "name": "Volker Dusch", 1240 | "email": "github@wallbash.com" 1241 | }, 1242 | { 1243 | "name": "Bernhard Schussek", 1244 | "email": "bschussek@2bepublished.at" 1245 | } 1246 | ], 1247 | "description": "Provides the functionality to compare PHP values for equality", 1248 | "homepage": "https://github.com/sebastianbergmann/comparator", 1249 | "keywords": [ 1250 | "comparator", 1251 | "compare", 1252 | "equality" 1253 | ], 1254 | "support": { 1255 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1256 | "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" 1257 | }, 1258 | "funding": [ 1259 | { 1260 | "url": "https://github.com/sebastianbergmann", 1261 | "type": "github" 1262 | } 1263 | ], 1264 | "time": "2022-09-14T12:31:48+00:00" 1265 | }, 1266 | { 1267 | "name": "sebastian/diff", 1268 | "version": "3.0.4", 1269 | "source": { 1270 | "type": "git", 1271 | "url": "https://github.com/sebastianbergmann/diff.git", 1272 | "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" 1273 | }, 1274 | "dist": { 1275 | "type": "zip", 1276 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", 1277 | "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", 1278 | "shasum": "" 1279 | }, 1280 | "require": { 1281 | "php": ">=7.1" 1282 | }, 1283 | "require-dev": { 1284 | "phpunit/phpunit": "^7.5 || ^8.0", 1285 | "symfony/process": "^2 || ^3.3 || ^4" 1286 | }, 1287 | "type": "library", 1288 | "extra": { 1289 | "branch-alias": { 1290 | "dev-master": "3.0-dev" 1291 | } 1292 | }, 1293 | "autoload": { 1294 | "classmap": [ 1295 | "src/" 1296 | ] 1297 | }, 1298 | "notification-url": "https://packagist.org/downloads/", 1299 | "license": [ 1300 | "BSD-3-Clause" 1301 | ], 1302 | "authors": [ 1303 | { 1304 | "name": "Sebastian Bergmann", 1305 | "email": "sebastian@phpunit.de" 1306 | }, 1307 | { 1308 | "name": "Kore Nordmann", 1309 | "email": "mail@kore-nordmann.de" 1310 | } 1311 | ], 1312 | "description": "Diff implementation", 1313 | "homepage": "https://github.com/sebastianbergmann/diff", 1314 | "keywords": [ 1315 | "diff", 1316 | "udiff", 1317 | "unidiff", 1318 | "unified diff" 1319 | ], 1320 | "support": { 1321 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1322 | "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" 1323 | }, 1324 | "funding": [ 1325 | { 1326 | "url": "https://github.com/sebastianbergmann", 1327 | "type": "github" 1328 | } 1329 | ], 1330 | "time": "2023-05-07T05:30:20+00:00" 1331 | }, 1332 | { 1333 | "name": "sebastian/environment", 1334 | "version": "4.2.4", 1335 | "source": { 1336 | "type": "git", 1337 | "url": "https://github.com/sebastianbergmann/environment.git", 1338 | "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" 1339 | }, 1340 | "dist": { 1341 | "type": "zip", 1342 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", 1343 | "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", 1344 | "shasum": "" 1345 | }, 1346 | "require": { 1347 | "php": ">=7.1" 1348 | }, 1349 | "require-dev": { 1350 | "phpunit/phpunit": "^7.5" 1351 | }, 1352 | "suggest": { 1353 | "ext-posix": "*" 1354 | }, 1355 | "type": "library", 1356 | "extra": { 1357 | "branch-alias": { 1358 | "dev-master": "4.2-dev" 1359 | } 1360 | }, 1361 | "autoload": { 1362 | "classmap": [ 1363 | "src/" 1364 | ] 1365 | }, 1366 | "notification-url": "https://packagist.org/downloads/", 1367 | "license": [ 1368 | "BSD-3-Clause" 1369 | ], 1370 | "authors": [ 1371 | { 1372 | "name": "Sebastian Bergmann", 1373 | "email": "sebastian@phpunit.de" 1374 | } 1375 | ], 1376 | "description": "Provides functionality to handle HHVM/PHP environments", 1377 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1378 | "keywords": [ 1379 | "Xdebug", 1380 | "environment", 1381 | "hhvm" 1382 | ], 1383 | "support": { 1384 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1385 | "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" 1386 | }, 1387 | "funding": [ 1388 | { 1389 | "url": "https://github.com/sebastianbergmann", 1390 | "type": "github" 1391 | } 1392 | ], 1393 | "time": "2020-11-30T07:53:42+00:00" 1394 | }, 1395 | { 1396 | "name": "sebastian/exporter", 1397 | "version": "3.1.5", 1398 | "source": { 1399 | "type": "git", 1400 | "url": "https://github.com/sebastianbergmann/exporter.git", 1401 | "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" 1402 | }, 1403 | "dist": { 1404 | "type": "zip", 1405 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", 1406 | "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", 1407 | "shasum": "" 1408 | }, 1409 | "require": { 1410 | "php": ">=7.0", 1411 | "sebastian/recursion-context": "^3.0" 1412 | }, 1413 | "require-dev": { 1414 | "ext-mbstring": "*", 1415 | "phpunit/phpunit": "^8.5" 1416 | }, 1417 | "type": "library", 1418 | "extra": { 1419 | "branch-alias": { 1420 | "dev-master": "3.1.x-dev" 1421 | } 1422 | }, 1423 | "autoload": { 1424 | "classmap": [ 1425 | "src/" 1426 | ] 1427 | }, 1428 | "notification-url": "https://packagist.org/downloads/", 1429 | "license": [ 1430 | "BSD-3-Clause" 1431 | ], 1432 | "authors": [ 1433 | { 1434 | "name": "Sebastian Bergmann", 1435 | "email": "sebastian@phpunit.de" 1436 | }, 1437 | { 1438 | "name": "Jeff Welch", 1439 | "email": "whatthejeff@gmail.com" 1440 | }, 1441 | { 1442 | "name": "Volker Dusch", 1443 | "email": "github@wallbash.com" 1444 | }, 1445 | { 1446 | "name": "Adam Harvey", 1447 | "email": "aharvey@php.net" 1448 | }, 1449 | { 1450 | "name": "Bernhard Schussek", 1451 | "email": "bschussek@gmail.com" 1452 | } 1453 | ], 1454 | "description": "Provides the functionality to export PHP variables for visualization", 1455 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1456 | "keywords": [ 1457 | "export", 1458 | "exporter" 1459 | ], 1460 | "support": { 1461 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1462 | "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" 1463 | }, 1464 | "funding": [ 1465 | { 1466 | "url": "https://github.com/sebastianbergmann", 1467 | "type": "github" 1468 | } 1469 | ], 1470 | "time": "2022-09-14T06:00:17+00:00" 1471 | }, 1472 | { 1473 | "name": "sebastian/global-state", 1474 | "version": "3.0.3", 1475 | "source": { 1476 | "type": "git", 1477 | "url": "https://github.com/sebastianbergmann/global-state.git", 1478 | "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0" 1479 | }, 1480 | "dist": { 1481 | "type": "zip", 1482 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/66783ce213de415b451b904bfef9dda0cf9aeae0", 1483 | "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0", 1484 | "shasum": "" 1485 | }, 1486 | "require": { 1487 | "php": ">=7.2", 1488 | "sebastian/object-reflector": "^1.1.1", 1489 | "sebastian/recursion-context": "^3.0" 1490 | }, 1491 | "require-dev": { 1492 | "ext-dom": "*", 1493 | "phpunit/phpunit": "^8.0" 1494 | }, 1495 | "suggest": { 1496 | "ext-uopz": "*" 1497 | }, 1498 | "type": "library", 1499 | "extra": { 1500 | "branch-alias": { 1501 | "dev-master": "3.0-dev" 1502 | } 1503 | }, 1504 | "autoload": { 1505 | "classmap": [ 1506 | "src/" 1507 | ] 1508 | }, 1509 | "notification-url": "https://packagist.org/downloads/", 1510 | "license": [ 1511 | "BSD-3-Clause" 1512 | ], 1513 | "authors": [ 1514 | { 1515 | "name": "Sebastian Bergmann", 1516 | "email": "sebastian@phpunit.de" 1517 | } 1518 | ], 1519 | "description": "Snapshotting of global state", 1520 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1521 | "keywords": [ 1522 | "global state" 1523 | ], 1524 | "support": { 1525 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1526 | "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.3" 1527 | }, 1528 | "funding": [ 1529 | { 1530 | "url": "https://github.com/sebastianbergmann", 1531 | "type": "github" 1532 | } 1533 | ], 1534 | "time": "2023-08-02T09:23:32+00:00" 1535 | }, 1536 | { 1537 | "name": "sebastian/object-enumerator", 1538 | "version": "3.0.4", 1539 | "source": { 1540 | "type": "git", 1541 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1542 | "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" 1543 | }, 1544 | "dist": { 1545 | "type": "zip", 1546 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", 1547 | "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", 1548 | "shasum": "" 1549 | }, 1550 | "require": { 1551 | "php": ">=7.0", 1552 | "sebastian/object-reflector": "^1.1.1", 1553 | "sebastian/recursion-context": "^3.0" 1554 | }, 1555 | "require-dev": { 1556 | "phpunit/phpunit": "^6.0" 1557 | }, 1558 | "type": "library", 1559 | "extra": { 1560 | "branch-alias": { 1561 | "dev-master": "3.0.x-dev" 1562 | } 1563 | }, 1564 | "autoload": { 1565 | "classmap": [ 1566 | "src/" 1567 | ] 1568 | }, 1569 | "notification-url": "https://packagist.org/downloads/", 1570 | "license": [ 1571 | "BSD-3-Clause" 1572 | ], 1573 | "authors": [ 1574 | { 1575 | "name": "Sebastian Bergmann", 1576 | "email": "sebastian@phpunit.de" 1577 | } 1578 | ], 1579 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1580 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1581 | "support": { 1582 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1583 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" 1584 | }, 1585 | "funding": [ 1586 | { 1587 | "url": "https://github.com/sebastianbergmann", 1588 | "type": "github" 1589 | } 1590 | ], 1591 | "time": "2020-11-30T07:40:27+00:00" 1592 | }, 1593 | { 1594 | "name": "sebastian/object-reflector", 1595 | "version": "1.1.2", 1596 | "source": { 1597 | "type": "git", 1598 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1599 | "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" 1600 | }, 1601 | "dist": { 1602 | "type": "zip", 1603 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", 1604 | "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", 1605 | "shasum": "" 1606 | }, 1607 | "require": { 1608 | "php": ">=7.0" 1609 | }, 1610 | "require-dev": { 1611 | "phpunit/phpunit": "^6.0" 1612 | }, 1613 | "type": "library", 1614 | "extra": { 1615 | "branch-alias": { 1616 | "dev-master": "1.1-dev" 1617 | } 1618 | }, 1619 | "autoload": { 1620 | "classmap": [ 1621 | "src/" 1622 | ] 1623 | }, 1624 | "notification-url": "https://packagist.org/downloads/", 1625 | "license": [ 1626 | "BSD-3-Clause" 1627 | ], 1628 | "authors": [ 1629 | { 1630 | "name": "Sebastian Bergmann", 1631 | "email": "sebastian@phpunit.de" 1632 | } 1633 | ], 1634 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1635 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1636 | "support": { 1637 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1638 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" 1639 | }, 1640 | "funding": [ 1641 | { 1642 | "url": "https://github.com/sebastianbergmann", 1643 | "type": "github" 1644 | } 1645 | ], 1646 | "time": "2020-11-30T07:37:18+00:00" 1647 | }, 1648 | { 1649 | "name": "sebastian/recursion-context", 1650 | "version": "3.0.1", 1651 | "source": { 1652 | "type": "git", 1653 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1654 | "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" 1655 | }, 1656 | "dist": { 1657 | "type": "zip", 1658 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", 1659 | "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", 1660 | "shasum": "" 1661 | }, 1662 | "require": { 1663 | "php": ">=7.0" 1664 | }, 1665 | "require-dev": { 1666 | "phpunit/phpunit": "^6.0" 1667 | }, 1668 | "type": "library", 1669 | "extra": { 1670 | "branch-alias": { 1671 | "dev-master": "3.0.x-dev" 1672 | } 1673 | }, 1674 | "autoload": { 1675 | "classmap": [ 1676 | "src/" 1677 | ] 1678 | }, 1679 | "notification-url": "https://packagist.org/downloads/", 1680 | "license": [ 1681 | "BSD-3-Clause" 1682 | ], 1683 | "authors": [ 1684 | { 1685 | "name": "Sebastian Bergmann", 1686 | "email": "sebastian@phpunit.de" 1687 | }, 1688 | { 1689 | "name": "Jeff Welch", 1690 | "email": "whatthejeff@gmail.com" 1691 | }, 1692 | { 1693 | "name": "Adam Harvey", 1694 | "email": "aharvey@php.net" 1695 | } 1696 | ], 1697 | "description": "Provides functionality to recursively process PHP variables", 1698 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1699 | "support": { 1700 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1701 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" 1702 | }, 1703 | "funding": [ 1704 | { 1705 | "url": "https://github.com/sebastianbergmann", 1706 | "type": "github" 1707 | } 1708 | ], 1709 | "time": "2020-11-30T07:34:24+00:00" 1710 | }, 1711 | { 1712 | "name": "sebastian/resource-operations", 1713 | "version": "2.0.2", 1714 | "source": { 1715 | "type": "git", 1716 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1717 | "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" 1718 | }, 1719 | "dist": { 1720 | "type": "zip", 1721 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", 1722 | "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", 1723 | "shasum": "" 1724 | }, 1725 | "require": { 1726 | "php": ">=7.1" 1727 | }, 1728 | "type": "library", 1729 | "extra": { 1730 | "branch-alias": { 1731 | "dev-master": "2.0-dev" 1732 | } 1733 | }, 1734 | "autoload": { 1735 | "classmap": [ 1736 | "src/" 1737 | ] 1738 | }, 1739 | "notification-url": "https://packagist.org/downloads/", 1740 | "license": [ 1741 | "BSD-3-Clause" 1742 | ], 1743 | "authors": [ 1744 | { 1745 | "name": "Sebastian Bergmann", 1746 | "email": "sebastian@phpunit.de" 1747 | } 1748 | ], 1749 | "description": "Provides a list of PHP built-in functions that operate on resources", 1750 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1751 | "support": { 1752 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 1753 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" 1754 | }, 1755 | "funding": [ 1756 | { 1757 | "url": "https://github.com/sebastianbergmann", 1758 | "type": "github" 1759 | } 1760 | ], 1761 | "time": "2020-11-30T07:30:19+00:00" 1762 | }, 1763 | { 1764 | "name": "sebastian/type", 1765 | "version": "1.1.4", 1766 | "source": { 1767 | "type": "git", 1768 | "url": "https://github.com/sebastianbergmann/type.git", 1769 | "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" 1770 | }, 1771 | "dist": { 1772 | "type": "zip", 1773 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", 1774 | "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", 1775 | "shasum": "" 1776 | }, 1777 | "require": { 1778 | "php": ">=7.2" 1779 | }, 1780 | "require-dev": { 1781 | "phpunit/phpunit": "^8.2" 1782 | }, 1783 | "type": "library", 1784 | "extra": { 1785 | "branch-alias": { 1786 | "dev-master": "1.1-dev" 1787 | } 1788 | }, 1789 | "autoload": { 1790 | "classmap": [ 1791 | "src/" 1792 | ] 1793 | }, 1794 | "notification-url": "https://packagist.org/downloads/", 1795 | "license": [ 1796 | "BSD-3-Clause" 1797 | ], 1798 | "authors": [ 1799 | { 1800 | "name": "Sebastian Bergmann", 1801 | "email": "sebastian@phpunit.de", 1802 | "role": "lead" 1803 | } 1804 | ], 1805 | "description": "Collection of value objects that represent the types of the PHP type system", 1806 | "homepage": "https://github.com/sebastianbergmann/type", 1807 | "support": { 1808 | "issues": "https://github.com/sebastianbergmann/type/issues", 1809 | "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" 1810 | }, 1811 | "funding": [ 1812 | { 1813 | "url": "https://github.com/sebastianbergmann", 1814 | "type": "github" 1815 | } 1816 | ], 1817 | "time": "2020-11-30T07:25:11+00:00" 1818 | }, 1819 | { 1820 | "name": "sebastian/version", 1821 | "version": "2.0.1", 1822 | "source": { 1823 | "type": "git", 1824 | "url": "https://github.com/sebastianbergmann/version.git", 1825 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1826 | }, 1827 | "dist": { 1828 | "type": "zip", 1829 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1830 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1831 | "shasum": "" 1832 | }, 1833 | "require": { 1834 | "php": ">=5.6" 1835 | }, 1836 | "type": "library", 1837 | "extra": { 1838 | "branch-alias": { 1839 | "dev-master": "2.0.x-dev" 1840 | } 1841 | }, 1842 | "autoload": { 1843 | "classmap": [ 1844 | "src/" 1845 | ] 1846 | }, 1847 | "notification-url": "https://packagist.org/downloads/", 1848 | "license": [ 1849 | "BSD-3-Clause" 1850 | ], 1851 | "authors": [ 1852 | { 1853 | "name": "Sebastian Bergmann", 1854 | "email": "sebastian@phpunit.de", 1855 | "role": "lead" 1856 | } 1857 | ], 1858 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1859 | "homepage": "https://github.com/sebastianbergmann/version", 1860 | "support": { 1861 | "issues": "https://github.com/sebastianbergmann/version/issues", 1862 | "source": "https://github.com/sebastianbergmann/version/tree/master" 1863 | }, 1864 | "time": "2016-10-03T07:35:21+00:00" 1865 | }, 1866 | { 1867 | "name": "slevomat/coding-standard", 1868 | "version": "6.4.1", 1869 | "source": { 1870 | "type": "git", 1871 | "url": "https://github.com/slevomat/coding-standard.git", 1872 | "reference": "696dcca217d0c9da2c40d02731526c1e25b65346" 1873 | }, 1874 | "dist": { 1875 | "type": "zip", 1876 | "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/696dcca217d0c9da2c40d02731526c1e25b65346", 1877 | "reference": "696dcca217d0c9da2c40d02731526c1e25b65346", 1878 | "shasum": "" 1879 | }, 1880 | "require": { 1881 | "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", 1882 | "php": "^7.1 || ^8.0", 1883 | "phpstan/phpdoc-parser": "0.4.5 - 0.4.9", 1884 | "squizlabs/php_codesniffer": "^3.5.6" 1885 | }, 1886 | "require-dev": { 1887 | "phing/phing": "2.16.3", 1888 | "php-parallel-lint/php-parallel-lint": "1.2.0", 1889 | "phpstan/phpstan": "0.12.48", 1890 | "phpstan/phpstan-deprecation-rules": "0.12.5", 1891 | "phpstan/phpstan-phpunit": "0.12.16", 1892 | "phpstan/phpstan-strict-rules": "0.12.5", 1893 | "phpunit/phpunit": "7.5.20|8.5.5|9.4.0" 1894 | }, 1895 | "type": "phpcodesniffer-standard", 1896 | "extra": { 1897 | "branch-alias": { 1898 | "dev-master": "6.x-dev" 1899 | } 1900 | }, 1901 | "autoload": { 1902 | "psr-4": { 1903 | "SlevomatCodingStandard\\": "SlevomatCodingStandard" 1904 | } 1905 | }, 1906 | "notification-url": "https://packagist.org/downloads/", 1907 | "license": [ 1908 | "MIT" 1909 | ], 1910 | "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", 1911 | "support": { 1912 | "issues": "https://github.com/slevomat/coding-standard/issues", 1913 | "source": "https://github.com/slevomat/coding-standard/tree/6.4.1" 1914 | }, 1915 | "funding": [ 1916 | { 1917 | "url": "https://github.com/kukulich", 1918 | "type": "github" 1919 | }, 1920 | { 1921 | "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", 1922 | "type": "tidelift" 1923 | } 1924 | ], 1925 | "time": "2020-10-05T12:39:37+00:00" 1926 | }, 1927 | { 1928 | "name": "squizlabs/php_codesniffer", 1929 | "version": "3.8.0", 1930 | "source": { 1931 | "type": "git", 1932 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 1933 | "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7" 1934 | }, 1935 | "dist": { 1936 | "type": "zip", 1937 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5805f7a4e4958dbb5e944ef1e6edae0a303765e7", 1938 | "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7", 1939 | "shasum": "" 1940 | }, 1941 | "require": { 1942 | "ext-simplexml": "*", 1943 | "ext-tokenizer": "*", 1944 | "ext-xmlwriter": "*", 1945 | "php": ">=5.4.0" 1946 | }, 1947 | "require-dev": { 1948 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 1949 | }, 1950 | "bin": [ 1951 | "bin/phpcs", 1952 | "bin/phpcbf" 1953 | ], 1954 | "type": "library", 1955 | "extra": { 1956 | "branch-alias": { 1957 | "dev-master": "3.x-dev" 1958 | } 1959 | }, 1960 | "notification-url": "https://packagist.org/downloads/", 1961 | "license": [ 1962 | "BSD-3-Clause" 1963 | ], 1964 | "authors": [ 1965 | { 1966 | "name": "Greg Sherwood", 1967 | "role": "Former lead" 1968 | }, 1969 | { 1970 | "name": "Juliette Reinders Folmer", 1971 | "role": "Current lead" 1972 | }, 1973 | { 1974 | "name": "Contributors", 1975 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 1976 | } 1977 | ], 1978 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 1979 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 1980 | "keywords": [ 1981 | "phpcs", 1982 | "standards", 1983 | "static analysis" 1984 | ], 1985 | "support": { 1986 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 1987 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 1988 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 1989 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 1990 | }, 1991 | "funding": [ 1992 | { 1993 | "url": "https://github.com/PHPCSStandards", 1994 | "type": "github" 1995 | }, 1996 | { 1997 | "url": "https://github.com/jrfnl", 1998 | "type": "github" 1999 | }, 2000 | { 2001 | "url": "https://opencollective.com/php_codesniffer", 2002 | "type": "open_collective" 2003 | } 2004 | ], 2005 | "time": "2023-12-08T12:32:31+00:00" 2006 | }, 2007 | { 2008 | "name": "theseer/tokenizer", 2009 | "version": "1.2.2", 2010 | "source": { 2011 | "type": "git", 2012 | "url": "https://github.com/theseer/tokenizer.git", 2013 | "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" 2014 | }, 2015 | "dist": { 2016 | "type": "zip", 2017 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", 2018 | "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", 2019 | "shasum": "" 2020 | }, 2021 | "require": { 2022 | "ext-dom": "*", 2023 | "ext-tokenizer": "*", 2024 | "ext-xmlwriter": "*", 2025 | "php": "^7.2 || ^8.0" 2026 | }, 2027 | "type": "library", 2028 | "autoload": { 2029 | "classmap": [ 2030 | "src/" 2031 | ] 2032 | }, 2033 | "notification-url": "https://packagist.org/downloads/", 2034 | "license": [ 2035 | "BSD-3-Clause" 2036 | ], 2037 | "authors": [ 2038 | { 2039 | "name": "Arne Blankerts", 2040 | "email": "arne@blankerts.de", 2041 | "role": "Developer" 2042 | } 2043 | ], 2044 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2045 | "support": { 2046 | "issues": "https://github.com/theseer/tokenizer/issues", 2047 | "source": "https://github.com/theseer/tokenizer/tree/1.2.2" 2048 | }, 2049 | "funding": [ 2050 | { 2051 | "url": "https://github.com/theseer", 2052 | "type": "github" 2053 | } 2054 | ], 2055 | "time": "2023-11-20T00:12:19+00:00" 2056 | }, 2057 | { 2058 | "name": "wp-coding-standards/wpcs", 2059 | "version": "3.0.1", 2060 | "source": { 2061 | "type": "git", 2062 | "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", 2063 | "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1" 2064 | }, 2065 | "dist": { 2066 | "type": "zip", 2067 | "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/b4caf9689f1a0e4a4c632679a44e638c1c67aff1", 2068 | "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1", 2069 | "shasum": "" 2070 | }, 2071 | "require": { 2072 | "ext-filter": "*", 2073 | "ext-libxml": "*", 2074 | "ext-tokenizer": "*", 2075 | "ext-xmlreader": "*", 2076 | "php": ">=5.4", 2077 | "phpcsstandards/phpcsextra": "^1.1.0", 2078 | "phpcsstandards/phpcsutils": "^1.0.8", 2079 | "squizlabs/php_codesniffer": "^3.7.2" 2080 | }, 2081 | "require-dev": { 2082 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 2083 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 2084 | "phpcompatibility/php-compatibility": "^9.0", 2085 | "phpcsstandards/phpcsdevtools": "^1.2.0", 2086 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 2087 | }, 2088 | "suggest": { 2089 | "ext-iconv": "For improved results", 2090 | "ext-mbstring": "For improved results" 2091 | }, 2092 | "type": "phpcodesniffer-standard", 2093 | "notification-url": "https://packagist.org/downloads/", 2094 | "license": [ 2095 | "MIT" 2096 | ], 2097 | "authors": [ 2098 | { 2099 | "name": "Contributors", 2100 | "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" 2101 | } 2102 | ], 2103 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", 2104 | "keywords": [ 2105 | "phpcs", 2106 | "standards", 2107 | "static analysis", 2108 | "wordpress" 2109 | ], 2110 | "support": { 2111 | "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", 2112 | "source": "https://github.com/WordPress/WordPress-Coding-Standards", 2113 | "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" 2114 | }, 2115 | "funding": [ 2116 | { 2117 | "url": "https://opencollective.com/thewpcc/contribute/wp-php-63406", 2118 | "type": "custom" 2119 | } 2120 | ], 2121 | "time": "2023-09-14T07:06:09+00:00" 2122 | }, 2123 | { 2124 | "name": "yoast/phpunit-polyfills", 2125 | "version": "2.0.0", 2126 | "source": { 2127 | "type": "git", 2128 | "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", 2129 | "reference": "c758753e8f9dac251fed396a73c8305af3f17922" 2130 | }, 2131 | "dist": { 2132 | "type": "zip", 2133 | "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/c758753e8f9dac251fed396a73c8305af3f17922", 2134 | "reference": "c758753e8f9dac251fed396a73c8305af3f17922", 2135 | "shasum": "" 2136 | }, 2137 | "require": { 2138 | "php": ">=5.6", 2139 | "phpunit/phpunit": "^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0" 2140 | }, 2141 | "require-dev": { 2142 | "yoast/yoastcs": "^2.3.0" 2143 | }, 2144 | "type": "library", 2145 | "extra": { 2146 | "branch-alias": { 2147 | "dev-main": "2.x-dev" 2148 | } 2149 | }, 2150 | "autoload": { 2151 | "files": [ 2152 | "phpunitpolyfills-autoload.php" 2153 | ] 2154 | }, 2155 | "notification-url": "https://packagist.org/downloads/", 2156 | "license": [ 2157 | "BSD-3-Clause" 2158 | ], 2159 | "authors": [ 2160 | { 2161 | "name": "Team Yoast", 2162 | "email": "support@yoast.com", 2163 | "homepage": "https://yoast.com" 2164 | }, 2165 | { 2166 | "name": "Contributors", 2167 | "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" 2168 | } 2169 | ], 2170 | "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", 2171 | "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", 2172 | "keywords": [ 2173 | "phpunit", 2174 | "polyfill", 2175 | "testing" 2176 | ], 2177 | "support": { 2178 | "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", 2179 | "source": "https://github.com/Yoast/PHPUnit-Polyfills" 2180 | }, 2181 | "time": "2023-06-06T20:28:24+00:00" 2182 | } 2183 | ], 2184 | "aliases": [], 2185 | "minimum-stability": "stable", 2186 | "stability-flags": [], 2187 | "prefer-stable": false, 2188 | "prefer-lowest": false, 2189 | "platform": [], 2190 | "platform-dev": [], 2191 | "plugin-api-version": "2.3.0" 2192 | } 2193 | --------------------------------------------------------------------------------