├── 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 |
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'] . '' . esc_attr( $args['tag'] ) . '>' . "\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 |
--------------------------------------------------------------------------------