├── .nvmrc ├── tools └── local │ ├── .gitignore │ └── wp-content │ └── .gitignore ├── assets ├── dotorg │ ├── icon-128x128.png │ ├── icon-256x256.png │ ├── screenshot-1.png │ ├── screenshot-2.png │ ├── screenshot-3.png │ ├── banner-1544x500.png │ ├── banner-772x250.png │ └── blueprints │ │ └── blueprint.json ├── js │ ├── admin.js │ └── controls.js └── css │ └── admin.css ├── .gitignore ├── .wp-env.json ├── .eslintrc.json ├── .distignore ├── tests ├── phpunit │ ├── class-plugin-test.php │ └── class-integration-tablepress-test.php └── bootstrap-phpunit.php ├── .editorconfig ├── phpunit.xml.dist ├── .vscode └── launch.json ├── phpcs.xml.dist ├── .github └── workflows │ └── test.yml ├── src ├── class-cf7-extras-integration.php ├── class-cf7-extras-form-settings.php ├── class-cf7-extras-integration-tablepress.php └── class-cf7-extras.php ├── plugin.php ├── readme.md ├── package.json ├── composer.json ├── Gruntfile.js ├── readme.txt.md └── composer.lock /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /tools/local/.gitignore: -------------------------------------------------------------------------------- 1 | /wordpress/ 2 | -------------------------------------------------------------------------------- /assets/dotorg/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/icon-128x128.png -------------------------------------------------------------------------------- /assets/dotorg/icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/icon-256x256.png -------------------------------------------------------------------------------- /assets/dotorg/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/screenshot-1.png -------------------------------------------------------------------------------- /assets/dotorg/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/screenshot-2.png -------------------------------------------------------------------------------- /assets/dotorg/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/screenshot-3.png -------------------------------------------------------------------------------- /assets/dotorg/banner-1544x500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/banner-1544x500.png -------------------------------------------------------------------------------- /assets/dotorg/banner-772x250.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasparsd/contact-form-7-extras/HEAD/assets/dotorg/banner-772x250.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /node_modules 3 | /vendor 4 | .DS_Store 5 | .phpunit.result.cache 6 | 7 | # Local overrides. 8 | /phpcs.xml 9 | /phpunit.xml 10 | -------------------------------------------------------------------------------- /tools/local/wp-content/.gitignore: -------------------------------------------------------------------------------- 1 | /uploads/ 2 | /themes/ 3 | /plugins/ 4 | !/plugins/contact-form-7-extras 5 | 6 | # Ignore various helpers added by plugins. 7 | /db.php 8 | /object-cache.php 9 | -------------------------------------------------------------------------------- /.wp-env.json: -------------------------------------------------------------------------------- 1 | { 2 | "core": "./tools/local/wordpress", 3 | "mappings": { 4 | "wp-content": "./tools/local/wp-content", 5 | "wp-content/plugins/contact-form-7-extras": "." 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "wordpress", 3 | "rules": { 4 | "space-in-parens": [ 5 | "error", 6 | "always", { 7 | "exceptions": [ 8 | "empty" 9 | ] 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.distignore: -------------------------------------------------------------------------------- 1 | /tests/ 2 | /vendor/ 3 | /node_modules/ 4 | /tools/ 5 | /tests/ 6 | /assets/dotorg/ 7 | Gruntfile.js 8 | composer.json 9 | composer.lock 10 | package.json 11 | package-lock.json 12 | phpcs.xml 13 | readme.md 14 | readme.txt.md 15 | phpcs.* 16 | phpunit.* 17 | .* 18 | -------------------------------------------------------------------------------- /tests/phpunit/class-plugin-test.php: -------------------------------------------------------------------------------- 1 | assertTrue( class_exists( 'Cf7_Extras' ), 'Plugin is active' ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | indent_style = tab 10 | 11 | [*.{json,yml,yaml}] 12 | indent_style = space 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /assets/js/admin.js: -------------------------------------------------------------------------------- 1 | jQuery( document ).ready( function( $ ) { 2 | 3 | $( 'input[data-toggle-on]' ).each( function() { 4 | var target = $( this ).data( 'toggle-on' ); 5 | 6 | $( target ).toggle( ! $( this ).is( ':checked' ) ); 7 | 8 | $( this ).on( 'change', function() { 9 | $( target ).toggle( ! $( this ).is( ':checked' ) ); 10 | } ); 11 | } ); 12 | 13 | } ); 14 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | ./tests/phpunit 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "XDebug", 6 | "type": "php", 7 | "request": "launch", 8 | "port": 9003, 9 | "pathMappings": { 10 | "/var/www/html/wp-content/plugins/contact-form-7-extras": "${workspaceFolder}", 11 | "/var/www/html/wp-content": "${workspaceFolder}/tools/local/wp-content", 12 | "/var/www/html": "${workspaceFolder}/tools/local/wordpress" 13 | } 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /phpcs.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | . 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | /node_modules 17 | /vendor 18 | /dist/ 19 | /tools/ 20 | 21 | -------------------------------------------------------------------------------- /assets/css/admin.css: -------------------------------------------------------------------------------- 1 | .cf7-extras-table th, #contact-form-editor .contact-form-editor-panel .cf7-extras-table th { width:12em; } 2 | .cf7-extras-table .desc { line-height:1.4; font-style:italic; color:#666; margin:0.2em 0 0 0; } 3 | .cf7-extras-table td ul { margin:0; } 4 | .cf7-extras-table td li { margin:0.5em 0; display:block; } 5 | .cf7-extras-table .extras-docs-link { display:block; font-size:0.86em; font-weight:normal; } 6 | 7 | @media screen and (max-width: 760px) { 8 | .cf7-extras-table th, #contact-form-editor .contact-form-editor-panel .cf7-extras-table th { width:100%; padding-bottom:0.5em; } 9 | .cf7-extras-table .extras-docs-link { display:inline-block; margin-left:1em; } 10 | } -------------------------------------------------------------------------------- /assets/dotorg/blueprints/blueprint.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://playground.wordpress.net/blueprint-schema.json", 3 | "landingPage": "/wp-admin/admin.php?page=wpcf7&post=4&action=edit", 4 | "preferredVersions": { 5 | "php": "7.4", 6 | "wp": "latest" 7 | }, 8 | "steps": [ 9 | { 10 | "step": "login" 11 | }, 12 | { 13 | "step": "installPlugin", 14 | "pluginData": { 15 | "resource": "wordpress.org/plugins", 16 | "slug": "contact-form-7" 17 | }, 18 | "options": { 19 | "activate": true 20 | } 21 | }, 22 | { 23 | "step": "installPlugin", 24 | "pluginData": { 25 | "resource": "wordpress.org/plugins", 26 | "slug": "contact-form-7-extras" 27 | }, 28 | "options": { 29 | "activate": true 30 | } 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Lint and Test 2 | 3 | on: push 4 | 5 | jobs: 6 | 7 | test: 8 | name: Test and Lint 9 | runs-on: ubuntu-24.04 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v4 13 | 14 | - name: Setup Node 15 | uses: actions/setup-node@v4 16 | with: 17 | node-version-file: .nvmrc 18 | cache: 'npm' 19 | 20 | - name: Setup PHP 21 | uses: shivammathur/setup-php@v2 22 | with: 23 | php-version: '7.4' 24 | tools: composer:v2 25 | 26 | - name: Install JS tooling 27 | run: npm install 28 | 29 | - name: Install PHP tooling 30 | run: composer install 31 | 32 | - name: Lint 33 | run: npm run lint 34 | 35 | - name: Build 36 | run: npm run build 37 | -------------------------------------------------------------------------------- /src/class-cf7-extras-integration.php: -------------------------------------------------------------------------------- 1 | 🚀 PRO version for advanced analytics and tracking features. 5 | * Plugin URI: https://formcontrols.com 6 | * Author: Kaspars Dambis 7 | * Author URI: https://formcontrols.com 8 | * Version: 0.10.0 9 | * License: GPL2 10 | * Text Domain: contact-form-7-extras 11 | */ 12 | 13 | require_once __DIR__ . '/src/class-cf7-extras-form-settings.php'; 14 | require_once __DIR__ . '/src/class-cf7-extras-integration.php'; // Before all integrations. 15 | require_once __DIR__ . '/src/class-cf7-extras-integration-tablepress.php'; 16 | require_once __DIR__ . '/src/class-cf7-extras.php'; 17 | 18 | $plugin = Cf7_Extras::instance(); 19 | $plugin->set_plugin_dir( __DIR__ ); 20 | 21 | add_action( 'plugins_loaded', array( $plugin, 'init' ) ); 22 | -------------------------------------------------------------------------------- /tests/phpunit/class-integration-tablepress-test.php: -------------------------------------------------------------------------------- 1 | array( 16 | array( 17 | '', 18 | 'header cell', 19 | ), 20 | array( 21 | 'first_name', 22 | '', 23 | ), 24 | ), 25 | ); 26 | 27 | $form_data = array( 28 | 'first_name' => 'John ', 29 | 'age' => '25', 30 | 'food_preferences' => array( 31 | 'pizza', 32 | 'pasta', 33 | ), 34 | ); 35 | 36 | $this->assertEquals( 37 | array( 38 | array( '', 'header cell', 'first_name', 'age', 'food_preferences' ), 39 | array( 'first_name', '', '', '', '' ), 40 | array( '', '', 'John ', '25', 'pizza, pasta' ), 41 | ), 42 | $integration->get_data_for_table( $table, $form_data )['data'] 43 | ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/bootstrap-phpunit.php: -------------------------------------------------------------------------------- 1 | array( 28 | 'contact-form-7-extras/plugin.php', 29 | 'contact-form-7/wp-contact-form-7.php', 30 | ), 31 | ); 32 | 33 | // Include all helper functions. 34 | require_once $wp_tests_dir . '/includes/functions.php'; 35 | 36 | // Load WP and start tests. 37 | require_once $wp_tests_dir . '/includes/bootstrap.php'; 38 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Contact Form 7 Controls 2 | 3 | [![Lint and Test](https://github.com/kasparsd/contact-form-7-extras/actions/workflows/test.yml/badge.svg)](https://github.com/kasparsd/contact-form-7-extras/actions/workflows/test.yml) 4 | 5 | Source of the [Contact Form 7 Controls plugin](https://formcontrols.com) for WordPress. 6 | 7 | 8 | ## 🚀 Get PRO 9 | 10 | Support the continued development of this plugin by [pre-ordering the PRO version](https://formcontrols.com/pro) that will include advanced analytics and tracking features. [Learn more →](https://formcontrols.com/pro) 11 | 12 | 13 | ## Install 14 | 15 | Search for "Contact Form 7 Controls" under "Plugins → Add New" in your WordPress dashboard. 16 | 17 | Install as a [Composer dependancy](https://packagist.org/packages/kasparsd/contact-form-7-extras): 18 | 19 | composer require kasparsd/contact-form-7-extras 20 | 21 | 22 | ## Contribute 23 | 24 | We use [Composer](https://getcomposer.org) for managing PHP development dependencies while [Node.js](https://nodejs.org) is used for most scripting needs, building the plugin release and deploying to WP.org via [Grunt](https://gruntjs.com). 25 | 26 | 1. Clone the plugin repository: 27 | 28 | git clone https://github.com/kasparsd/contact-form-7-extras.git 29 | cd widget-context-wporg 30 | 31 | 2. Setup the development environment and tools: 32 | 33 | npm install 34 | composer install 35 | 36 | 3. Prepare a release in the `dist` directory: 37 | 38 | npm run build 39 | 40 | 41 | ## Screenshot 42 | 43 | ![Contact Form 7 Controls](screenshot-1.png) 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "contact-form-7-extras", 3 | "description": "Simple controls for some of the advanced Contact Form 7 plugin functionality", 4 | "private": true, 5 | "homepage": "https://formcontrols.com", 6 | "author": { 7 | "name": "Kaspars Dambis", 8 | "url": "https://kaspars.net" 9 | }, 10 | "scripts": { 11 | "lint": "npm-run-all lint:*", 12 | "lint:js": "eslint *.js assets", 13 | "lint:php": "composer lint", 14 | "format": "npm-run-all format:*", 15 | "format:js": "eslint --fix *.js assets", 16 | "format:php": "composer format", 17 | "test": "npm-run-all test:*", 18 | "test:php": "wp-env run tests-cli --env-cwd=wp-content/plugins/contact-form-7-extras composer test", 19 | "build": "grunt build", 20 | "deploy": "grunt deploy", 21 | "deploy-trunk": "grunt deploy:trunk", 22 | "wp-env": "wp-env", 23 | "blueprint": "grunt blueprint-url" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/kasparsd/contact-form-7-extras.git" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/kasparsd/contact-form-7-extras/issues" 31 | }, 32 | "keywords": [ 33 | "wordpress", 34 | "wordpress plugin" 35 | ], 36 | "license": "GPL-2.0-or-later", 37 | "devDependencies": { 38 | "eslint": "^6.8.0", 39 | "eslint-config-wordpress": "^2.0.0", 40 | "@wordpress/env": "^10.3.0", 41 | "grunt": "^1.6.1", 42 | "grunt-cli": "^1.4.3", 43 | "grunt-contrib-clean": "^2.0", 44 | "grunt-contrib-copy": "^1.0", 45 | "grunt-text-replace": "^0.4.0", 46 | "grunt-wp-deploy": "^2.1.2", 47 | "load-grunt-tasks": "^5.1", 48 | "npm-run-all": "^4.1.5", 49 | "parse-gitignore": "^0.5" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kasparsd/contact-form-7-extras", 3 | "description": "Simple controls for some of the advanced Contact Form 7 plugin functionality.", 4 | "homepage": "https://formcontrols.com", 5 | "type": "wordpress-plugin", 6 | "license": "GPL-2.0-or-later", 7 | "authors": [ 8 | { 9 | "name": "Kaspars Dambis", 10 | "homepage": "https://kaspars.net" 11 | } 12 | ], 13 | "support": { 14 | "issues": "https://github.com/kasparsd/contact-form-7-extras/issues", 15 | "source": "https://github.com/kasparsd/contact-form-7-extras", 16 | "docs": "https://formcontrols.com/docs" 17 | }, 18 | "repositories": [ 19 | { 20 | "type": "composer", 21 | "url": "https://wpackagist.org", 22 | "only": [ 23 | "wpackagist-plugin/*", 24 | "wpackagist-theme/*" 25 | ] 26 | } 27 | ], 28 | "require-dev": { 29 | "wp-coding-standards/wpcs": "^3.1", 30 | "roots/wordpress": "^6.7", 31 | "wpackagist-plugin/contact-form-7": "^6.0", 32 | "roots/wordpress-core-installer": "^1.100", 33 | "wpackagist-theme/twentytwentyfive": "^1.0", 34 | "dealerdirect/phpcodesniffer-composer-installer": "^1.0", 35 | "wp-phpunit/wp-phpunit": "^6.7", 36 | "yoast/phpunit-polyfills": "^3.0", 37 | "wpackagist-plugin/query-monitor": "^3.17", 38 | "wpackagist-plugin/wp-mail-debugger": "^1.1", 39 | "wpackagist-plugin/tablepress": "^3.0" 40 | }, 41 | "scripts": { 42 | "lint": [ 43 | "phpcs", 44 | "composer validate" 45 | ], 46 | "format": [ 47 | "phpcbf" 48 | ], 49 | "test": [ 50 | "phpunit" 51 | ] 52 | }, 53 | "config": { 54 | "allow-plugins": { 55 | "dealerdirect/phpcodesniffer-composer-installer": true, 56 | "roots/wordpress-core-installer": true, 57 | "composer/installers": true 58 | } 59 | }, 60 | "extra": { 61 | "wordpress-install-dir": "tools/local/wordpress", 62 | "installer-paths": { 63 | "tools/local/wp-content/plugins/{$name}/": [ "type:wordpress-plugin" ], 64 | "tools/local/wp-content/themes/{$name}/": [ "type:wordpress-theme" ] 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/class-cf7-extras-form-settings.php: -------------------------------------------------------------------------------- 1 | false, 15 | 'disable-ajax' => false, 16 | 'html5-disable' => false, 17 | 'html5-fallback' => false, 18 | 'disable-autop' => false, 19 | 'enable-shortcodes' => false, 20 | 'redirect-success' => false, 21 | 'track-ga-success' => false, 22 | 'track-ga-submit' => false, 23 | 'track-ga' => false, 24 | 'google-recaptcha-lang' => null, 25 | ); 26 | 27 | /** 28 | * Form instance. 29 | * 30 | * @var WPCF7_ContactForm 31 | */ 32 | protected $form; 33 | 34 | /** 35 | * Setup settings for a form. 36 | * 37 | * @param WPCF7_ContactForm $form Form instance. 38 | */ 39 | public function __construct( $form ) { 40 | $this->form = $form; 41 | } 42 | 43 | /** 44 | * Get settings for a form by ID. 45 | * 46 | * @param int $form_id Form ID. 47 | * 48 | * @return self 49 | */ 50 | public static function from_form_id( $form_id ) { 51 | return new self( wpcf7_contact_form( $form_id ) ); 52 | } 53 | 54 | /** 55 | * Get the form ID. 56 | * 57 | * @return int 58 | */ 59 | public function form_id() { 60 | return $this->form->id(); 61 | } 62 | 63 | /** 64 | * Get a setting value. 65 | * 66 | * @param string $key Setting key. 67 | * 68 | * @return mixed|null Return null if the setting is not found. 69 | */ 70 | public function get( $key ) { 71 | $settings = $this->all(); 72 | 73 | if ( isset( $settings[ $key ] ) ) { 74 | return $settings[ $key ]; 75 | } 76 | 77 | return null; 78 | } 79 | 80 | /** 81 | * Get all settings. 82 | * 83 | * @return array 84 | */ 85 | public function all() { 86 | $settings = get_post_meta( $this->form->id(), 'extras', true ); 87 | 88 | if ( ! is_array( $settings ) ) { 89 | $settings = array(); 90 | } 91 | 92 | $settings = array_merge( $this->defaults, $settings ); 93 | 94 | // Convert legacy settings into one. 95 | if ( ! empty( $settings['track-ga-success'] ) || ! empty( $settings['track-ga-submit'] ) ) { 96 | $settings['track-ga'] = true; 97 | } 98 | 99 | return $settings; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | /* eslint-env es6, node */ 2 | /* eslint camelcase: warn, comma-dangle: off */ 3 | 4 | const ignoreParse = require( 'parse-gitignore' ); 5 | const exec = require( 'child_process' ).exec; 6 | const fs = require( 'fs' ); 7 | 8 | const deployConfig = { 9 | plugin_slug: 'contact-form-7-extras', 10 | svn_user: 'kasparsd', 11 | build_dir: '<%= dist_dir %>', 12 | plugin_main_file: 'plugin.php', 13 | assets_dir: 'assets/dotorg', 14 | }; 15 | 16 | const readmeReplaceRules = [ 17 | { 18 | from: /^#\s(.+)$/gm, 19 | to: '=== $1 ===' 20 | }, 21 | { 22 | from: /^##\s(.+)$/gm, 23 | to: '== $1 ==' 24 | }, 25 | { 26 | from: /^#{3,}\s(.+)$/gm, 27 | to: '= $1 =' 28 | }, 29 | ]; 30 | 31 | module.exports = function( grunt ) { 32 | 33 | // Load all Grunt plugins. 34 | require( 'load-grunt-tasks' )( grunt ); 35 | 36 | const pluginVersion = grunt.file.read( 'plugin.php' ).match( /Version:\s*(.+)$/mi )[1]; 37 | 38 | // Get a list of all the files and directories to exclude from the distribution. 39 | const releaseFiles = ignoreParse( '.distignore', { 40 | invert: true, 41 | } ); 42 | 43 | grunt.initConfig( { 44 | pkg: grunt.file.readJSON( 'package.json' ), 45 | 46 | dist_dir: 'dist', 47 | 48 | clean: { 49 | build: [ '<%= dist_dir %>' ], 50 | }, 51 | 52 | replace: { 53 | readme: { 54 | src: 'readme.txt.md', 55 | dest: '<%= dist_dir %>/readme.txt', 56 | replacements: readmeReplaceRules 57 | }, 58 | version: { 59 | src: [ 60 | '<%= dist_dir %>/readme.txt' 61 | ], 62 | overwrite: true, 63 | replacements: [ 64 | { 65 | from: /"version":\s*"(.+)"/, 66 | to: `"version": "${pluginVersion}"` 67 | }, 68 | { 69 | from: 'STABLETAG', 70 | to: pluginVersion 71 | }, 72 | ] 73 | } 74 | }, 75 | 76 | copy: { 77 | dist: { 78 | src: [ '**' ].concat( releaseFiles ), 79 | dest: '<%= dist_dir %>', 80 | expand: true, 81 | } 82 | }, 83 | 84 | wp_deploy: { 85 | default: { 86 | options: deployConfig, 87 | }, 88 | trunk: { 89 | options: Object.assign( {}, deployConfig, { 90 | deploy_tag: false, 91 | } ) 92 | } 93 | }, 94 | } ); 95 | 96 | grunt.registerTask( 97 | 'check-diff', 98 | function() { 99 | const done = this.async(); // This won't work with the ES6 fat arrow syntax. 100 | 101 | exec( 'git diff HEAD --quiet', ( err ) => { 102 | if ( err ) { 103 | grunt.log.error( 'Found uncommited changes in your current working directory.' ); 104 | done( false ); 105 | } 106 | 107 | done(); 108 | } ); 109 | } 110 | ); 111 | 112 | grunt.registerTask( 113 | 'blueprint-url', 114 | function() { 115 | const blueprintJson = JSON.parse( fs.readFileSync( 'assets/dotorg/blueprints/blueprint.json', 'utf8' ) ); 116 | grunt.log.write( `Blueprint URL: https://playground.wordpress.net/#${ encodeURI( JSON.stringify( blueprintJson ) ) }` ); 117 | } 118 | ); 119 | 120 | grunt.registerTask( 121 | 'build', [ 122 | 'clean', 123 | 'copy', 124 | 'replace', 125 | ] 126 | ); 127 | 128 | grunt.registerTask( 129 | 'deploy', [ 130 | 'build', 131 | 'check-diff', 132 | 'wp_deploy:default', 133 | ] 134 | ); 135 | 136 | grunt.registerTask( 137 | 'deploy:trunk', [ 138 | 'build', 139 | 'check-diff', 140 | 'wp_deploy:trunk', 141 | ] 142 | ); 143 | 144 | }; 145 | -------------------------------------------------------------------------------- /assets/js/controls.js: -------------------------------------------------------------------------------- 1 | /* eslint camelcase: warn */ 2 | 3 | ( function() { 4 | var formEventCallback; 5 | 6 | var formEventCallbacks = { 7 | wpcf7mailsent: function( form ) { 8 | var formConfig; 9 | 10 | if ( form.contactFormId && formEventEnabled( form.contactFormId, 'track-ga' ) ) { 11 | formConfig = getFormConfig( form.contactFormId ); 12 | trackAnalyticsEvent( 'Contact Form', 'Sent', formConfig.title ); 13 | } 14 | }, 15 | wpcf7mailfailed: function( form ) { 16 | var formConfig; 17 | 18 | if ( form.contactFormId && formEventEnabled( form.contactFormId, 'track-ga' ) ) { 19 | formConfig = getFormConfig( form.contactFormId ); 20 | trackAnalyticsEvent( 'Contact Form', 'Error', formConfig.title ); 21 | } 22 | }, 23 | wpcf7spam: function( form ) { 24 | var formConfig; 25 | 26 | if ( form.contactFormId && formEventEnabled( form.contactFormId, 'track-ga' ) ) { 27 | formConfig = getFormConfig( form.contactFormId ); 28 | trackAnalyticsEvent( 'Contact Form', 'Spam', formConfig.title ); 29 | } 30 | }, 31 | wpcf7submit: function( form ) { 32 | var formConfig; 33 | 34 | if ( form.contactFormId && formEventEnabled( form.contactFormId, 'track-ga' ) ) { 35 | formConfig = getFormConfig( form.contactFormId ); 36 | trackAnalyticsEvent( 'Contact Form', 'Submit', formConfig.title ); 37 | } 38 | 39 | if ( form.contactFormId && 'mail_sent' === form.status && formEventEnabled( form.contactFormId, 'redirect-success' ) ) { 40 | formConfig = getFormConfig( form.contactFormId ); 41 | 42 | if ( formConfig.redirect_url ) { 43 | window.location = formConfig.redirect_url; 44 | } 45 | } 46 | } 47 | }; 48 | 49 | var jQueryEvents = { 50 | 'wpcf7:mailsent': function( event, form ) { 51 | formCallbacks.wpcf7mailsent( form ); 52 | }, 53 | 'wpcf7:mailfailed': function( event, form ) { 54 | formCallbacks.wpcf7mailfailed( form ); 55 | }, 56 | 'wpcf7:spam': function( event, form ) { 57 | formCallbacks.wpcf7spam( form ); 58 | }, 59 | 'wpcf7:submit': function( event, form ) { 60 | formCallbacks.wpcf7submit( form ); 61 | } 62 | }; 63 | 64 | function trackAnalyticsEvent( eventCategory, eventAction, eventTitle ) { 65 | 66 | // Helper method required for the event to be registered by gtag.js. 67 | var dataLayerPush = function() { 68 | if ( 'object' === typeof window.dataLayer && 'function' === typeof window.dataLayer.push ) { 69 | window.dataLayer.push( arguments ); 70 | } 71 | }; 72 | 73 | // GA via Google Tag Manager or Global Site Tag (gtag.js). 74 | dataLayerPush( 75 | 'event', 76 | eventAction, 77 | { 78 | 'event_category': eventCategory, 79 | 'event_label': eventTitle 80 | } 81 | ); 82 | 83 | // Universal Google Analytics is available. 84 | if ( 'function' === typeof ga ) { 85 | ga( 'send', 'event', eventCategory, eventAction, eventTitle ); 86 | } 87 | 88 | // Classic Google Analytics is available. 89 | if ( 'object' === typeof _gaq && 'function' === typeof _gaq.push ) { 90 | _gaq.push( [ '_trackEvent', eventCategory, eventAction, eventTitle ] ); 91 | } 92 | 93 | // Matomo (formerly Piwik) is available. 94 | if ( 'undefined' !== typeof _paq && 'function' === typeof _paq.push ) { 95 | _paq.push( [ 'trackEvent', eventCategory, eventAction, eventTitle ] ); 96 | } 97 | 98 | // Facebook Pixel contact event. 99 | if ( 'function' === typeof fbq ) { 100 | fbq( 'track', 'Contact', { 101 | content_category: eventAction, 102 | content_name: eventTitle 103 | } ); 104 | } 105 | }; 106 | 107 | function formEventEnabled( formId, eventName ) { 108 | formId = parseInt( formId ); 109 | 110 | if ( ! formId || ! window.cf7_extras.events[ eventName ] ) { 111 | return false; 112 | } 113 | 114 | if ( -1 !== window.cf7_extras.events[ eventName ].indexOf( formId ) ) { 115 | return true; 116 | } 117 | 118 | return false; 119 | }; 120 | 121 | function getFormConfig( formId ) { 122 | formId = parseInt( formId ); 123 | 124 | if ( window.cf7_extras.forms && window.cf7_extras.forms[ formId ] ) { 125 | return window.cf7_extras.forms[ formId ]; 126 | } 127 | 128 | return false; 129 | }; 130 | 131 | // We need the event config for each form to do anything. 132 | if ( ! window.cf7_extras ) { 133 | return; 134 | } 135 | 136 | // Register the new JS events in CF7 version 5.2 and above. 137 | if ( 'function' === typeof document.addEventListener ) { 138 | for ( formEventCallback in formEventCallbacks ) { 139 | document.addEventListener( formEventCallback, function( event ) { 140 | if ( event.type in formEventCallbacks ) { 141 | formEventCallbacks[ event.type ].call( event, event.detail ); 142 | } 143 | } ); 144 | } 145 | } 146 | 147 | }() ); 148 | -------------------------------------------------------------------------------- /readme.txt.md: -------------------------------------------------------------------------------- 1 | # Controls for Contact Form 7 (Redirects, Analytics & Tracking) 2 | 3 | Contributors: kasparsd, buzztone 4 | Donate link: https://formcontrols.com/pro 5 | Tags: contact form 7, gtm, matomo, analytics, facebook pixel 6 | Requires at least: 4.6 7 | Tested up to: 6.7 8 | Stable tag: STABLETAG 9 | License: GPLv2 or later 10 | 11 | Analytics, tracking, redirects and storage for Contact Form 7. 12 | 13 | 14 | ## Description 15 | 16 | **NEW:** Subscribe to the [🚀 PRO version](https://formcontrols.com/pro) for advanced analytics and tracking features, and professional support by the plugin author. 17 | 18 | This is an addon for the [Contact Form 7](https://wordpress.org/plugins/contact-form-7/) plugin with the following features: 19 | 20 | - [Track form submissions, errors and completions](https://formcontrols.com/docs) with Google Analytics (GA4), Google Tag (gtag.js), Google Tag Manager (GTM), Matomo (formerly Piwik) and Facebook Pixel. 21 | - Redirect to URL on form submission. 22 | - Enable native WordPress shortcodes in form content. 23 | - Disable AJAX form submissions. 24 | - Disable default form CSS. 25 | - Disable automatic paragraph formatting. 26 | - Disable HTML5 input field types or enable the HTML5 input type fallback. 27 | - Specify the Google reCAPTCHA language. 28 | - Store form submissions in [Storage for Contact Form 7](https://preseto.com/go/cf7-storage?utm_source=wporg) or [TablePress](https://wordpress.org/plugins/tablepress/). 29 | 30 | Please note that some settings work on the per-page level and will apply to all forms on the same page. For example, disabling AJAX form submissions for one form will disable AJAX submissions on all forms on the same page. 31 | 32 | ### Requirements 33 | 34 | - [Contact Form 7](https://wordpress.org/plugins/contact-form-7/) version 4.3 or later for features related to submission tracking and redirects. 35 | 36 | ### Usage 37 | 38 | The plugin adds a new "Controls" tab for each Contact Form 7 form in the WordPress administration area. 39 | 40 | ### Form Submission Storage 41 | 42 | *Setup the official companion plugin [Storage for Contact Form 7 plugin](https://preseto.com/go/cf7-storage?utm_source=wporg) for capturing the form submissions safely in the WordPres database.* 43 | 44 | Alternatively, there is also a basic integration with the [TablePress plugin](https://wordpress.org/plugins/tablepress/). Select the TablePress table where to store the form submissions. The plugin will add any missing columns for each form field, and append the form entries as rows to the table. Additionally, fields `cf7_time` (submission time as [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)) and `cf7_url` (URL where the form was submitted) are stored along with the form data. 45 | 46 | ### Analytics Tracking 47 | 48 | The plugin *automatically* triggers analytics events for the following services: 49 | 50 | - [Google Analytics (GA4)](https://support.google.com/analytics/topic/14088998) using [Google Tag Manager](https://support.google.com/tagmanager/answer/9442095) and [Global Tag (gtag.js)](https://developers.google.com/tag-platform/gtagjs) with `ga()`, `_gaq.push()` and `dataLayer.push()` implementations, 51 | - [Matomo](https://matomo.org/) (formerly Piwik), 52 | - [Facebook Pixel Conversion Tracking](https://developers.facebook.com/docs/facebook-pixel/implementation/conversion-tracking). 53 | 54 | It passes the following data with the event: 55 | 56 | - "Contact Form" as the event category, 57 | - "Submit", "Sent", "Error" or "Spam" as the event action, and 58 | - the form title as the event title. 59 | 60 | #### Facebook Pixel 61 | 62 | The [standard Contact event](https://developers.facebook.com/docs/facebook-pixel/implementation/conversion-tracking#standard-events) is used for Facebook Pixel with `content_category` property set to the event type (Submit, Sent, Error, Spam) and `content_name` set to the form title. 63 | 64 | ### Contribute 65 | 66 | - Report issues and suggest improvements [on GitHub](https://github.com/kasparsd/contact-form-7-extras). 67 | - Add [a translation to your language](https://translate.wordpress.org/projects/wp-plugins/contact-form-7-extras). 68 | 69 | 70 | ## Changelog 71 | 72 | See the [release notes](https://github.com/kasparsd/contact-form-7-extras/releases) for the complete changelog. 73 | 74 | 75 | ## Installation 76 | 77 | ### From your WordPress dashboard 78 | 79 | Search for "Controls for Contact Form 7" under "Plugins" → "Add New" in your WordPress administration panel. 80 | 81 | ### Using Composer 82 | 83 | Add it as [a Composer dependency](https://packagist.org/packages/kasparsd/contact-form-7-extras): 84 | 85 | composer require kasparsd/contact-form-7-extras 86 | 87 | 88 | ## Frequently Asked Questions 89 | 90 | ### How to save Contact Form 7 submissions in the WordPress database? 91 | 92 | The "[Storage for Contact Form 7](https://preseto.com/go/cf7-storage?utm_source=wporg)" plugin stores all contact form submissions (including attachments) securely in the WordPress database. It also provides a CSV export of the form entries. 93 | 94 | 95 | ## Screenshots 96 | 97 | 1. Google Analytics events associated with form submissions. 98 | 2. Facebook Pixel "Contact" event associated with form submission. 99 | 3. Controls for Contact Form 7 plugin settings. 100 | 101 | 102 | ## Upgrade Notice 103 | 104 | ### 0.9.0 105 | 106 | New feature: enable storing form submissions in TablePress plugin tables. 107 | -------------------------------------------------------------------------------- /src/class-cf7-extras-integration-tablepress.php: -------------------------------------------------------------------------------- 1 | load_all( false ); 39 | 40 | foreach ( $table_ids as $table_id ) { 41 | $table = TablePress::$model_table->load( $table_id, false, false ); 42 | 43 | if ( ! is_wp_error( $table ) ) { 44 | $tables[ $table_id ] = $table['name']; // Attention: The table name is not unique! 45 | } 46 | } 47 | 48 | return $tables; 49 | } 50 | 51 | /** 52 | * Add the TablePress storage field to the form settings. 53 | * 54 | * @param array $fields Fields. 55 | * @param array $settings Settings array for the form ID. 56 | * 57 | * @return array 58 | */ 59 | public function controls_fields( $fields, $settings ) { 60 | $tablepress_tables = $this->get_tablepress_tables(); 61 | $tablepress_options = array(); 62 | 63 | $tablepress_id_selected = null; 64 | if ( ! empty( $settings[ self::FIELD_TABLEPRESS_ID ] ) ) { 65 | $tablepress_id_selected = (int) $settings[ self::FIELD_TABLEPRESS_ID ]; 66 | } 67 | 68 | if ( is_array( $tablepress_tables ) ) { 69 | if ( empty( $tablepress_tables ) ) { 70 | $tablepress_options[] = sprintf( 71 | '', 72 | esc_html__( 'No tables found', 'contact-form-7-extras' ) 73 | ); 74 | } else { 75 | $tablepress_options[] = sprintf( 76 | '', 77 | esc_html__( 'Select a TablePress table', 'contact-form-7-extras' ) 78 | ); 79 | } 80 | 81 | foreach ( $tablepress_tables as $table_id => $table_name ) { 82 | $tablepress_options[] = sprintf( 83 | '', 84 | $table_id, 85 | selected( $tablepress_id_selected, $table_id, false ), 86 | esc_html( $table_name ) 87 | ); 88 | } 89 | } else { 90 | $tablepress_options[] = sprintf( 91 | '', 92 | esc_html__( 'Activate TablePress to enable this feature', 'contact-form-7-extras' ) 93 | ); 94 | } 95 | 96 | $entries_links = array(); 97 | 98 | if ( ! empty( $settings['tablepress-id'] ) ) { 99 | $entries_url = add_query_arg( 100 | array( 101 | 'page' => 'tablepress', 102 | 'action' => 'edit', 103 | 'table_id' => (int) $settings['tablepress-id'], 104 | ), 105 | admin_url( 'admin.php' ) 106 | ); 107 | 108 | $entries_links[] = sprintf( 109 | '%s', 110 | esc_url( $entries_url ), 111 | esc_html__( 'View Entries', 'contact-form-7-extras' ) 112 | ); 113 | } 114 | 115 | $tablepress_fields = array( 116 | 'tablepress-id' => array( 117 | 'label' => __( 'Store in TablePress', 'contact-form-7-extras' ), 118 | 'docs_url' => 'https://formcontrols.com/docs/contact-form-7-to-tablepress', 119 | 'field' => sprintf( 120 | ' 121 | %s 122 |

%s

', 123 | esc_attr( $this->get_field_name( self::FIELD_TABLEPRESS_ID ) ), 124 | implode( '', $tablepress_options ), 125 | implode( ' | ', $entries_links ), 126 | esc_html__( 'Store form submissions in a TablePress table. Entries are appended to any existing rows and columns along with a dedicated header column matching the field names.', 'contact-form-7-extras' ) 127 | ), 128 | ), 129 | ); 130 | 131 | return array_merge( $tablepress_fields, $fields ); // Merge to prepend the storage fields. 132 | } 133 | 134 | /** 135 | * Store the form submission in TablePress. 136 | * 137 | * @param WPCF7_ContactForm $contact_form Instance of the form being processed. 138 | * 139 | * @return void 140 | */ 141 | public function store_submission_in_tablepress( $contact_form ) { 142 | $settings = $this->get_settings( $contact_form->id() ); 143 | $table_id = (int) $settings->get( 'tablepress-id' ); 144 | 145 | if ( ! empty( $table_id ) && class_exists( 'TablePress' ) ) { 146 | $table = TablePress::$model_table->load( $table_id ); 147 | 148 | if ( ! empty( $table ) && is_array( $table['data'] ) ) { 149 | $form_submission = WPCF7_Submission::get_instance(); 150 | $form_data = $form_submission->get_posted_data(); 151 | 152 | $extra_data = array( 153 | 'cf7_time' => gmdate( 'c', $form_submission->get_meta( 'timestamp' ) ), 154 | 'cf7_url' => $form_submission->get_meta( 'url' ), 155 | ); 156 | 157 | $form_data = array_merge( $extra_data, $form_data ); 158 | 159 | $table = $this->get_data_for_table( $table, $form_data ); 160 | 161 | if ( is_array( $table ) ) { 162 | TablePress::$model_table->save( $table ); 163 | } 164 | } 165 | } 166 | } 167 | 168 | /** 169 | * Merge form data with table data. 170 | * 171 | * @param array $table TablePress table data. 172 | * @param array $form_data Form data. 173 | * 174 | * @return array Updated TablePress table data. 175 | */ 176 | public function get_data_for_table( $table, $form_data ) { 177 | $header_row = array_map( 'trim', current( $table['data'] ) ); 178 | 179 | // Get the column index for each header value. 180 | foreach ( array_keys( $form_data ) as $form_field_name ) { 181 | if ( ! in_array( $form_field_name, $header_row, true ) ) { 182 | $header_row[] = $form_field_name; 183 | } 184 | } 185 | 186 | // Map by values for quick lookup for the new data. 187 | $col_index = array_flip( $header_row ); // This works only if there are no duplicate column names. 188 | 189 | // Prefill the row with empty values. 190 | $table_row = array_fill( 0, count( $col_index ), '' ); 191 | 192 | foreach ( $form_data as $key => $value ) { 193 | if ( is_array( $value ) ) { 194 | $col_value = implode( ', ', $value ); 195 | } elseif ( is_scalar( $value ) ) { 196 | $col_value = (string) $value; 197 | } 198 | 199 | $table_row[ $col_index[ $key ] ] = $col_value; 200 | } 201 | 202 | $table['data'][0] = $header_row; // Update the header row to include our headers. 203 | $table['data'][] = $table_row; // Append our row. 204 | 205 | $max_cols = max( array_map( 'count', $table['data'] ) ); 206 | $cols_fill = array_fill( 0, $max_cols, '' ); 207 | 208 | // Ensure all rows have the same number of columns. 209 | $table['data'] = array_map( 210 | function ( $row ) use ( $cols_fill ) { 211 | return array_replace( $cols_fill, $row ); 212 | }, 213 | $table['data'] 214 | ); 215 | 216 | return $table; 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /src/class-cf7-extras.php: -------------------------------------------------------------------------------- 1 | plugin_dir ) ) { 76 | $this->set_error( 77 | __( 'Failed to load the Controls for Contact Form 7 plugin because the plugin directory was not set.', 'contact-form-7-extras' ) 78 | ); 79 | 80 | return false; 81 | } 82 | 83 | // Add Extra settings to contact form settings 84 | // This filter was removed in version 4.2 of CF7. 85 | add_action( 'wpcf7_add_meta_boxes', array( $this, 'wpcf7_add_meta_boxes' ) ); 86 | 87 | // @since CF7 4.2 88 | add_filter( 'wpcf7_editor_panels', array( $this, 'register_wpcf7_panel' ) ); 89 | 90 | // Store Extra settings. 91 | add_action( 'wpcf7_save_contact_form', array( $this, 'wpcf7_save_contact_form' ) ); 92 | 93 | add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); 94 | 95 | // Detect a form being rendered on the front-end. 96 | add_filter( 'wpcf7_form_action_url', array( $this, 'capture_form_load' ) ); 97 | 98 | // Remove front-end CSS by default, put it back in the footer if required. 99 | add_action( 'wpcf7_enqueue_styles', array( $this, 'dequeue_styles' ), 12 ); 100 | 101 | // Maybe disable AJAX requests. 102 | add_action( 'wp_print_footer_scripts', array( $this, 'maybe_alter_scripts' ), 8 ); 103 | 104 | // Maybe redirect or trigger GA events. 105 | add_action( 'wp_print_footer_scripts', array( $this, 'track_form_events' ), 9 ); 106 | 107 | // Redirect to a custom URL really late. 108 | add_action( 'wpcf7_submit', array( $this, 'wpcf7_submit' ), 987, 2 ); 109 | 110 | // TODO: Enable Google analytics tracking when AJAX is disabled. 111 | 112 | /** 113 | * Use a filter instead of the WPCF7_AUTOP to disable formatting on specific forms only. 114 | * 115 | * Run very early since we're replacing the rendered form content with a fresh 116 | * version that doesn't have the autop applied. 117 | */ 118 | add_filter( 'wpcf7_form_elements', array( $this, 'maybe_reset_autop' ), 1 ); 119 | 120 | add_filter( 'wpcf7_form_elements', array( $this, 'maybe_enable_shortcodes' ) ); 121 | 122 | $integrations = array( 123 | new Cf7_Extras_Integration_TablePress(), 124 | ); 125 | 126 | foreach ( $integrations as $integration ) { 127 | if ( $integration instanceof Cf7_Extras_Integration ) { 128 | $integration->init(); 129 | } 130 | } 131 | 132 | return true; 133 | } 134 | 135 | /** 136 | * Set the directory path to this plugin. 137 | * 138 | * @param string $path Absolute path to the root directory of this plugin. 139 | */ 140 | public function set_plugin_dir( $path ) { 141 | $this->plugin_dir = $path; 142 | } 143 | 144 | /** 145 | * Get the public URL to the asset file. 146 | * 147 | * @param string $asset_path_relative Relative path to the asset file. 148 | */ 149 | public function asset_url( $asset_path_relative ) { 150 | static $plugin_basename; 151 | 152 | // Do this only once per every request to save some processing time. 153 | if ( ! isset( $plugin_basename ) ) { 154 | $plugin_basename = plugin_basename( $this->plugin_dir ); 155 | } 156 | 157 | $file_path = sprintf( 158 | '%s/%s', 159 | $plugin_basename, 160 | ltrim( $asset_path_relative, '/' ) 161 | ); 162 | 163 | return plugins_url( $file_path ); 164 | } 165 | 166 | /** 167 | * Register the custom tab for our form settings. 168 | * 169 | * @param integer $post_id Current form ID. 170 | * 171 | * @return void 172 | */ 173 | public function wpcf7_add_meta_boxes( $post_id ) { 174 | add_meta_box( 175 | 'cf7s-subject', 176 | __( 'Extra Settings', 'contact-form-7-extras' ), 177 | array( $this, 'wpcf7_metabox' ), 178 | null, 179 | 'form', 180 | 'low' 181 | ); 182 | } 183 | 184 | /** 185 | * Sanitize the field label with a few allowed HTML tags. 186 | * 187 | * @param string $label Field label markup. 188 | * 189 | * @return string 190 | */ 191 | private function esc_field_label( $label ) { 192 | return wp_kses( 193 | $label, 194 | array( 195 | 'a' => array( 196 | 'href' => array(), 197 | 'target' => array(), 198 | ), 199 | 'strong' => array(), 200 | 'em' => array(), 201 | 'span' => array(), 202 | 'code' => array(), 203 | ) 204 | ); 205 | } 206 | 207 | /** 208 | * Display our custom form settings. 209 | * 210 | * @param WPCF7_ContactForm $cf7 Current form. 211 | * 212 | * @return void 213 | */ 214 | public function wpcf7_metabox( $cf7 ) { 215 | $post_id = $cf7->id(); 216 | $settings = $this->get_form_settings( $cf7 ); 217 | 218 | $fields = array( 219 | 'extra-disable-ajax' => array( 220 | 'label' => __( 'AJAX Submissions', 'contact-form-7-extras' ), 221 | 'docs_url' => 'https://contactform7.com/controlling-behavior-by-setting-constants/', 222 | 'field' => sprintf( 223 | ' 227 |

%s

', 228 | checked( $settings['disable-ajax'], true, false ), 229 | esc_html__( 'Disable AJAX for this form', 'contact-form-7-extras' ), 230 | $this->esc_field_label( __( 'Same as define( \'WPCF7_LOAD_JS\', false );. Disabling AJAX will also disable Google Analytics event tracking and HTML5 input type fallback for this form.', 'contact-form-7-extras' ) ) 231 | ), 232 | ), 233 | 'extra-disable-css' => array( 234 | 'label' => __( 'Default CSS', 'contact-form-7-extras' ), 235 | 'docs_url' => 'https://contactform7.com/controlling-behavior-by-setting-constants/', 236 | 'field' => sprintf( 237 | ' 241 |

%s

', 242 | checked( $settings['disable-css'], true, false ), 243 | esc_html__( 'Disable default CSS for this form', 'contact-form-7-extras' ), 244 | $this->esc_field_label( __( 'Disables CSS that comes bundled with Contact Form 7. Same as define( \'WPCF7_LOAD_CSS\', false );.', 'contact-form-7-extras' ) ) 245 | ), 246 | ), 247 | 'extra-disable-autop' => array( 248 | 'label' => __( 'Automatic Formatting', 'contact-form-7-extras' ), 249 | 'docs_url' => 'https://contactform7.com/controlling-behavior-by-setting-constants/#autop', 250 | 'field' => sprintf( 251 | ' 255 |

%s

', 256 | checked( $settings['disable-autop'], true, false ), 257 | esc_html__( 'Disable automatic paragraph formatting in form output', 'contact-form-7-extras' ), 258 | $this->esc_field_label( __( 'Same as define( \'WPCF7_AUTOP\', false );.', 'contact-form-7-extras' ) ) 259 | ), 260 | ), 261 | 'extra-enable-shortcodes' => array( 262 | 'label' => __( 'Enable Shortcodes', 'contact-form-7-extras' ), 263 | 'docs_url' => 'https://formcontrols.com/docs/enable-wordpress-shortcodes', 264 | 'field' => sprintf( 265 | ' 269 |

%s

', 270 | checked( $settings['enable-shortcodes'], true, false ), 271 | esc_html__( 'Enable WordPress shortcodes', 'contact-form-7-extras' ), 272 | esc_html__( 'Adds support for standard WordPress shortcodes in the form content.', 'contact-form-7-extras' ) 273 | ), 274 | ), 275 | 'extra-html5' => array( 276 | 'label' => __( 'HTML5 input types', 'contact-form-7-extras' ), 277 | 'docs_url' => 'http://contactform7.com/faq/does-contact-form-7-support-html5-input-types/', 278 | 'field' => sprintf( 279 | '', 295 | checked( $settings['html5-disable'], true, false ), 296 | esc_html__( 'Disable HTML5 input types', 'contact-form-7-extras' ), 297 | esc_html__( 'Use regular input types instead.', 'contact-form-7-extras' ), 298 | checked( $settings['html5-fallback'], true, false ), 299 | esc_html__( 'Enable HTML5 input type fallback', 'contact-form-7-extras' ), 300 | esc_html__( 'Adds support for HTML5 input fields to older browsers (requires AJAX form submissions).', 'contact-form-7-extras' ) 301 | ), 302 | ), 303 | 'extra-redirect-success' => array( 304 | 'label' => __( 'Redirect to URL on Success', 'contact-form-7-extras' ), 305 | 'docs_url' => 'https://formcontrols.com/docs/contact-form-7-redirect-url', 306 | 'field' => sprintf( 307 | ' 310 |

%s

', 311 | esc_url( $settings['redirect-success'] ), 312 | esc_attr( 'https://example.com/thank-you' ), 313 | esc_html__( 'Enter the URL where users should be redirected after successful form submissions.', 'contact-form-7-extras' ) 314 | ), 315 | ), 316 | 'extra-google-recaptcha-lang' => array( 317 | 'label' => __( 'Google Recaptcha Language', 'contact-form-7-extras' ), 318 | 'docs_url' => 'https://developers.google.com/recaptcha/docs/language', 319 | 'field' => sprintf( 320 | ' 323 |

%s

', 324 | esc_attr( $settings['google-recaptcha-lang'] ), 325 | esc_attr( 'en' ), 326 | esc_html__( 'Specify the language code of the Google Recaptcha output.', 'contact-form-7-extras' ) 327 | ), 328 | ), 329 | 'extra-track-ga' => array( 330 | 'label' => __( 'Analytics Tracking', 'contact-form-7-extras' ), 331 | 'docs_url' => 'https://formcontrols.com/docs', 332 | 'field' => sprintf( 333 | ' 337 |

%s

', 338 | checked( $settings['track-ga'], true, false ), 339 | esc_html__( 'Trigger Google Analytics, Matomo (formerly Piwik) and Facebook Pixel events on form submissions. This will tigger the tracking code that has been set up on the site.', 'contact-form-7-extras' ), 340 | esc_html( 341 | sprintf( 342 | /* translators: %s: Title of the current form */ 343 | __( 'Track form submissions as events with category "Contact Form", actions "Sent", "Error" or "Submit" and label "%s".', 'contact-form-7-extras' ), 344 | $cf7->title() 345 | ) 346 | ) 347 | ), 348 | ), 349 | ); 350 | 351 | if ( class_exists( 'cf7_storage' ) ) { 352 | $form_entries_link = add_query_arg( 353 | array( 354 | 'page' => 'cf7_storage', 355 | 'form_id' => $post_id, 356 | ), 357 | admin_url( 'admin.php' ) 358 | ); 359 | 360 | $form_entries = get_posts( 361 | array( 362 | 'fields' => 'ids', 363 | 'post_type' => 'cf7_entry', 364 | 'post_parent' => $post_id, 365 | 'posts_per_page' => -1, 366 | ) 367 | ); 368 | 369 | $storage_field = array( 370 | 'label' => __( 'Store Form Entries', 'contact-form-7-extras' ), 371 | 'docs_url' => 'https://preseto.com/go/cf7-storage?utm_source=cf7conex', 372 | 'field' => sprintf( 373 | '

%s

', 374 | sprintf( 375 | '%s (%d)', 376 | $form_entries_link, 377 | esc_html__( 'View entries of this contact form', 'contact-form-7-extras' ), 378 | count( $form_entries ) 379 | ) 380 | ), 381 | ); 382 | } else { 383 | $storage_field = array( 384 | 'label' => __( 'Store Form Entries', 'contact-form-7-extras' ), 385 | 'docs_url' => 'https://preseto.com/go/cf7-storage?utm_source=cf7connew', 386 | 'field' => sprintf( 387 | '

%s

', 388 | sprintf( 389 | /* translators: %s: Text "Storage for Contact Form 7" with a link to the product page */ 390 | esc_html__( 'Install the %s plugin to save the form submissions in your WordPress database or export as CSV for Excel.', 'contact-form-7-extras' ), 391 | 'Storage for Contact Form 7' 392 | ) 393 | ), 394 | ); 395 | } 396 | 397 | /** 398 | * Let plugins add items to the settings. 399 | * 400 | * @param array $fields List of fields to display. 401 | */ 402 | $fields = apply_filters( 'cf7_extras__controls_fields', $fields, $settings ); 403 | 404 | // Place the storage links on top. 405 | $fields = array_merge( 406 | array( 'extra-cf7-storage' => $storage_field ), 407 | $fields 408 | ); 409 | 410 | $rows = array(); 411 | 412 | foreach ( $fields as $field_id => $field ) { 413 | $rows[] = sprintf( 414 | ' 415 | 416 | 417 | %s 418 | 419 | %s 420 | ', 421 | esc_attr( $field_id ), 422 | esc_attr( $field_id ), 423 | esc_html( $field['label'] ), 424 | esc_url( $field['docs_url'] ), 425 | esc_attr__( 'View the official documentation for this feature', 'contact-form-7-extras' ), 426 | esc_html__( 'Docs', 'contact-form-7-extras' ), 427 | $field['field'] 428 | ); 429 | } 430 | 431 | printf( 432 | ' 433 | %s 434 |
', 435 | implode( '', $rows ) 436 | ); 437 | } 438 | 439 | /** 440 | * Save our custom form settings. 441 | * 442 | * @param WPCF7_ContactForm $cf7 Current form object. 443 | * 444 | * @return void 445 | */ 446 | public function wpcf7_save_contact_form( $cf7 ) { 447 | if ( ! isset( $_POST ) || empty( $_POST ) || ! isset( $_POST['extra'] ) || ! is_array( $_POST['extra'] ) ) { 448 | return; 449 | } 450 | 451 | $post_id = $cf7->id(); 452 | 453 | if ( ! $post_id ) { 454 | return; 455 | } 456 | 457 | update_post_meta( $post_id, 'extras', $_POST['extra'] ); 458 | 459 | foreach ( $_POST['extra'] as $field_id => $field_value ) { 460 | update_post_meta( $post_id, 'extra-' . $field_id, $field_value ); 461 | } 462 | } 463 | 464 | /** 465 | * Enqueue our scripts for the admin settings. 466 | * 467 | * @param string $hook Current page ID. 468 | * 469 | * @return void 470 | */ 471 | public function admin_enqueue_scripts( $hook ) { 472 | if ( false === strpos( $hook, 'wpcf7' ) ) { 473 | return; 474 | } 475 | 476 | wp_enqueue_style( 477 | 'cf7-extras', 478 | $this->asset_url( 'assets/css/admin.css' ), 479 | array(), 480 | self::ASSET_VERSION, 481 | 'all' 482 | ); 483 | 484 | wp_enqueue_script( 485 | 'cf7-extras-js', 486 | $this->asset_url( 'assets/js/admin.js' ), 487 | array( 'jquery' ), 488 | self::ASSET_VERSION, 489 | true 490 | ); 491 | } 492 | 493 | /** 494 | * Register our tab with the CF7 settings. 495 | * 496 | * @param array $panels A list of panels or tabs. 497 | * 498 | * @return array 499 | */ 500 | public function register_wpcf7_panel( $panels ) { 501 | $form = WPCF7_ContactForm::get_current(); 502 | $post_id = $form->id(); 503 | 504 | if ( empty( $post_id ) || ! current_user_can( 'wpcf7_edit_contact_form', $post_id ) ) { 505 | return $panels; 506 | } 507 | 508 | $panels['cf7-extras'] = array( 509 | 'title' => __( 'Controls', 'contact-form-7-extras' ), 510 | 'callback' => array( $this, 'wpcf7_metabox' ), 511 | ); 512 | 513 | return $panels; 514 | } 515 | 516 | /** 517 | * Detect a form loading on the front-end and trigger relevant checks. 518 | * 519 | * @param string $action Form action URL. 520 | * 521 | * @return string 522 | */ 523 | public function capture_form_load( $action ) { 524 | $form = WPCF7_ContactForm::get_current(); 525 | 526 | if ( empty( $form ) || ! $form->id() ) { 527 | return $action; 528 | } 529 | 530 | $this->add_form( $form ); 531 | 532 | // Maybe toggle HTML5 input type support. 533 | $this->maybe_toggle_html5(); 534 | 535 | return $action; 536 | } 537 | 538 | /** 539 | * Keep track of rendered forms. 540 | * 541 | * @param WPCF7_ContactForm $form Form object. 542 | */ 543 | public function add_form( $form ) { 544 | $this->rendered[ $form->id() ] = $this->get_form_settings( $form ); 545 | } 546 | 547 | /** 548 | * Fetch form settings. 549 | * 550 | * @param WPCF7_ContactForm $form Form object. 551 | * @param string $field Setting field id. 552 | * @param boolean $fresh Not used. 553 | * 554 | * @return mixed 555 | */ 556 | public function get_form_settings( $form, $field = null, $fresh = false ) { 557 | if ( ! isset( $this->form_settings[ $form->id() ] ) ) { 558 | $this->form_settings[ $form->id() ] = new Cf7_Extras_Form_Settings( $form ); // Cache it for re-use. 559 | } 560 | 561 | $settings = $this->form_settings[ $form->id() ]; 562 | 563 | // Return a specific field value. 564 | if ( isset( $field ) ) { 565 | return $settings->get( $field ); 566 | } 567 | 568 | return $settings->all(); 569 | } 570 | 571 | 572 | /** 573 | * Remove CF7 front-end scripts, if needed. Configure the Google recaptcha 574 | * language, if configured. 575 | * 576 | * @return void 577 | */ 578 | public function maybe_alter_scripts() { 579 | // @todo use wp_scripts() in future 580 | global $wp_scripts; 581 | 582 | foreach ( $this->rendered as $form_id => $settings ) { 583 | 584 | if ( empty( $settings['disable-css'] ) ) { 585 | wp_enqueue_style( 'contact-form-7' ); 586 | } 587 | 588 | if ( $settings['disable-ajax'] ) { 589 | wp_dequeue_script( 'contact-form-7' ); 590 | } 591 | 592 | if ( ! empty( $settings['google-recaptcha-lang'] ) && isset( $wp_scripts->registered['google-recaptcha'] ) ) { 593 | // Append the `hl` query param which specifies the Recaptcha language. 594 | $wp_scripts->registered['google-recaptcha']->src = add_query_arg( 595 | 'hl', 596 | $settings['google-recaptcha-lang'], 597 | $wp_scripts->registered['google-recaptcha']->src 598 | ); 599 | } 600 | } 601 | } 602 | 603 | /** 604 | * Adjust form output based on settings. 605 | * 606 | * @return void 607 | */ 608 | public function maybe_toggle_html5() { 609 | foreach ( $this->rendered as $form_id => $settings ) { 610 | if ( $settings['html5-disable'] ) { 611 | add_filter( 'wpcf7_support_html5', '__return_false' ); 612 | } 613 | 614 | if ( $settings['html5-fallback'] ) { 615 | add_filter( 'wpcf7_support_html5_fallback', '__return_true' ); 616 | } 617 | } 618 | } 619 | 620 | /** 621 | * Remove CF7 default styles. 622 | * 623 | * @return void 624 | */ 625 | public function dequeue_styles() { 626 | // We add this back if a form with styles enabled is found. 627 | wp_dequeue_style( 'contact-form-7' ); 628 | } 629 | 630 | /** 631 | * Register our custom JS logic to track form events. 632 | * 633 | * @return void 634 | */ 635 | public function track_form_events() { 636 | if ( empty( $this->rendered ) ) { 637 | return; 638 | } 639 | 640 | $form_events = array( 641 | 'track-ga' => array(), 642 | 'redirect-success' => array(), 643 | ); 644 | 645 | $form_config = array(); 646 | 647 | foreach ( $this->rendered as $form_id => $settings ) { 648 | 649 | // Bail out since CF7 JS is disabled. 650 | if ( ! empty( $settings['disable-ajax'] ) ) { 651 | return; 652 | } 653 | 654 | $form = wpcf7_contact_form( $form_id ); 655 | 656 | $form_config[ $form_id ] = array( 657 | 'title' => $form->title(), 658 | 'redirect_url' => $settings['redirect-success'], 659 | ); 660 | 661 | foreach ( $form_events as $event_key => $event_form_ids ) { 662 | if ( ! empty( $settings[ $event_key ] ) ) { 663 | $form_events[ $event_key ][] = intval( $form_id ); 664 | } 665 | } 666 | } 667 | 668 | wp_enqueue_script( 669 | 'cf7-extras', 670 | $this->asset_url( 'assets/js/controls.js' ), 671 | array( 'contact-form-7' ), 672 | self::ASSET_VERSION, 673 | true 674 | ); 675 | 676 | wp_localize_script( 677 | 'cf7-extras', 678 | 'cf7_extras', 679 | array( 680 | 'events' => $form_events, 681 | 'forms' => $form_config, 682 | ) 683 | ); 684 | } 685 | 686 | /** 687 | * Trigger a redirect on form submission. 688 | * 689 | * @param WPCF7_ContactForm $form Current CF7 form. 690 | * @param array $result Form validation results. 691 | * 692 | * @return void 693 | */ 694 | public function wpcf7_submit( $form, $result ) { 695 | // JS is already doing the redirect. 696 | if ( isset( $_POST['_wpcf7_is_ajax_call'] ) || ! isset( $result['status'] ) ) { 697 | return; 698 | } elseif ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { 699 | return; 700 | } 701 | 702 | // Redirect only if this is a successful non-AJAX response. 703 | if ( 'mail_sent' === $result['status'] ) { 704 | $redirect = trim( $this->get_form_settings( $form, 'redirect-success' ) ); 705 | 706 | if ( ! empty( $redirect ) ) { 707 | wp_redirect( esc_url_raw( $redirect ) ); 708 | exit; 709 | } 710 | } 711 | } 712 | 713 | /** 714 | * Maybe disable WP core autop() on form email contents 715 | * by re-parsing the form content without the autop. 716 | * 717 | * @param string $form Current CF7 form. 718 | * 719 | * @return string 720 | */ 721 | public function maybe_reset_autop( $form ) { 722 | $form_instance = WPCF7_ContactForm::get_current(); 723 | $disable_autop = $this->get_form_settings( $form_instance, 'disable-autop' ); 724 | 725 | if ( $disable_autop ) { 726 | $form_meta = get_post_meta( $form_instance->id(), '_form', true ); 727 | 728 | if ( class_exists( 'WPCF7_FormTagsManager' ) ) { 729 | $manager = WPCF7_FormTagsManager::get_instance(); 730 | $form = $manager->replace_all( $form_meta ); 731 | } else { 732 | $manager = WPCF7_ShortcodeManager::get_instance(); 733 | $form = $manager->do_shortcode( $form_meta ); 734 | } 735 | 736 | $form_instance->set_properties( 737 | array( 738 | 'form' => $form, 739 | ) 740 | ); 741 | } 742 | 743 | return $form; 744 | } 745 | 746 | /** 747 | * Maybe enable WordPress shortcodes in the form content. 748 | * 749 | * @param string $form Current CF7 form content. 750 | * 751 | * @return string 752 | */ 753 | public function maybe_enable_shortcodes( $form ) { 754 | $form_instance = WPCF7_ContactForm::get_current(); 755 | $enable_shortcodes = $this->get_form_settings( $form_instance, 'enable-shortcodes' ); 756 | 757 | if ( $enable_shortcodes ) { 758 | $form = do_shortcode( $form ); 759 | } 760 | 761 | return $form; 762 | } 763 | 764 | /** 765 | * Register an error for the current request. 766 | * 767 | * @param string $message Error message. 768 | * 769 | * @return void 770 | */ 771 | public function set_error( $message ) { 772 | $this->errors[] = $message; 773 | } 774 | 775 | /** 776 | * Render any errors for the admin side. 777 | * 778 | * @return void 779 | */ 780 | public function render_admin_errors() { 781 | if ( empty( $this->errors ) ) { 782 | return; 783 | } 784 | 785 | $error_html = array(); 786 | 787 | foreach ( $this->errors as $error_message ) { 788 | $error_html[] = sprintf( 789 | '

%s

', 790 | esc_html( $error_message ) 791 | ); 792 | } 793 | 794 | ?> 795 |
796 | 797 |
798 | =5.4", 173 | "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" 174 | }, 175 | "require-dev": { 176 | "composer/composer": "*", 177 | "ext-json": "*", 178 | "ext-zip": "*", 179 | "php-parallel-lint/php-parallel-lint": "^1.3.1", 180 | "phpcompatibility/php-compatibility": "^9.0", 181 | "yoast/phpunit-polyfills": "^1.0" 182 | }, 183 | "type": "composer-plugin", 184 | "extra": { 185 | "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" 186 | }, 187 | "autoload": { 188 | "psr-4": { 189 | "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" 190 | } 191 | }, 192 | "notification-url": "https://packagist.org/downloads/", 193 | "license": [ 194 | "MIT" 195 | ], 196 | "authors": [ 197 | { 198 | "name": "Franck Nijhof", 199 | "email": "franck.nijhof@dealerdirect.com", 200 | "homepage": "http://www.frenck.nl", 201 | "role": "Developer / IT Manager" 202 | }, 203 | { 204 | "name": "Contributors", 205 | "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" 206 | } 207 | ], 208 | "description": "PHP_CodeSniffer Standards Composer Installer Plugin", 209 | "homepage": "http://www.dealerdirect.com", 210 | "keywords": [ 211 | "PHPCodeSniffer", 212 | "PHP_CodeSniffer", 213 | "code quality", 214 | "codesniffer", 215 | "composer", 216 | "installer", 217 | "phpcbf", 218 | "phpcs", 219 | "plugin", 220 | "qa", 221 | "quality", 222 | "standard", 223 | "standards", 224 | "style guide", 225 | "stylecheck", 226 | "tests" 227 | ], 228 | "support": { 229 | "issues": "https://github.com/PHPCSStandards/composer-installer/issues", 230 | "source": "https://github.com/PHPCSStandards/composer-installer" 231 | }, 232 | "time": "2023-01-05T11:28:13+00:00" 233 | }, 234 | { 235 | "name": "doctrine/instantiator", 236 | "version": "1.5.0", 237 | "source": { 238 | "type": "git", 239 | "url": "https://github.com/doctrine/instantiator.git", 240 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 241 | }, 242 | "dist": { 243 | "type": "zip", 244 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 245 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 246 | "shasum": "" 247 | }, 248 | "require": { 249 | "php": "^7.1 || ^8.0" 250 | }, 251 | "require-dev": { 252 | "doctrine/coding-standard": "^9 || ^11", 253 | "ext-pdo": "*", 254 | "ext-phar": "*", 255 | "phpbench/phpbench": "^0.16 || ^1", 256 | "phpstan/phpstan": "^1.4", 257 | "phpstan/phpstan-phpunit": "^1", 258 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 259 | "vimeo/psalm": "^4.30 || ^5.4" 260 | }, 261 | "type": "library", 262 | "autoload": { 263 | "psr-4": { 264 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 265 | } 266 | }, 267 | "notification-url": "https://packagist.org/downloads/", 268 | "license": [ 269 | "MIT" 270 | ], 271 | "authors": [ 272 | { 273 | "name": "Marco Pivetta", 274 | "email": "ocramius@gmail.com", 275 | "homepage": "https://ocramius.github.io/" 276 | } 277 | ], 278 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 279 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 280 | "keywords": [ 281 | "constructor", 282 | "instantiate" 283 | ], 284 | "support": { 285 | "issues": "https://github.com/doctrine/instantiator/issues", 286 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 287 | }, 288 | "funding": [ 289 | { 290 | "url": "https://www.doctrine-project.org/sponsorship.html", 291 | "type": "custom" 292 | }, 293 | { 294 | "url": "https://www.patreon.com/phpdoctrine", 295 | "type": "patreon" 296 | }, 297 | { 298 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 299 | "type": "tidelift" 300 | } 301 | ], 302 | "time": "2022-12-30T00:15:36+00:00" 303 | }, 304 | { 305 | "name": "myclabs/deep-copy", 306 | "version": "1.12.1", 307 | "source": { 308 | "type": "git", 309 | "url": "https://github.com/myclabs/DeepCopy.git", 310 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" 311 | }, 312 | "dist": { 313 | "type": "zip", 314 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", 315 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", 316 | "shasum": "" 317 | }, 318 | "require": { 319 | "php": "^7.1 || ^8.0" 320 | }, 321 | "conflict": { 322 | "doctrine/collections": "<1.6.8", 323 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 324 | }, 325 | "require-dev": { 326 | "doctrine/collections": "^1.6.8", 327 | "doctrine/common": "^2.13.3 || ^3.2.2", 328 | "phpspec/prophecy": "^1.10", 329 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 330 | }, 331 | "type": "library", 332 | "autoload": { 333 | "files": [ 334 | "src/DeepCopy/deep_copy.php" 335 | ], 336 | "psr-4": { 337 | "DeepCopy\\": "src/DeepCopy/" 338 | } 339 | }, 340 | "notification-url": "https://packagist.org/downloads/", 341 | "license": [ 342 | "MIT" 343 | ], 344 | "description": "Create deep copies (clones) of your objects", 345 | "keywords": [ 346 | "clone", 347 | "copy", 348 | "duplicate", 349 | "object", 350 | "object graph" 351 | ], 352 | "support": { 353 | "issues": "https://github.com/myclabs/DeepCopy/issues", 354 | "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" 355 | }, 356 | "funding": [ 357 | { 358 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 359 | "type": "tidelift" 360 | } 361 | ], 362 | "time": "2024-11-08T17:47:46+00:00" 363 | }, 364 | { 365 | "name": "nikic/php-parser", 366 | "version": "v5.3.1", 367 | "source": { 368 | "type": "git", 369 | "url": "https://github.com/nikic/PHP-Parser.git", 370 | "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" 371 | }, 372 | "dist": { 373 | "type": "zip", 374 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", 375 | "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", 376 | "shasum": "" 377 | }, 378 | "require": { 379 | "ext-ctype": "*", 380 | "ext-json": "*", 381 | "ext-tokenizer": "*", 382 | "php": ">=7.4" 383 | }, 384 | "require-dev": { 385 | "ircmaxell/php-yacc": "^0.0.7", 386 | "phpunit/phpunit": "^9.0" 387 | }, 388 | "bin": [ 389 | "bin/php-parse" 390 | ], 391 | "type": "library", 392 | "extra": { 393 | "branch-alias": { 394 | "dev-master": "5.0-dev" 395 | } 396 | }, 397 | "autoload": { 398 | "psr-4": { 399 | "PhpParser\\": "lib/PhpParser" 400 | } 401 | }, 402 | "notification-url": "https://packagist.org/downloads/", 403 | "license": [ 404 | "BSD-3-Clause" 405 | ], 406 | "authors": [ 407 | { 408 | "name": "Nikita Popov" 409 | } 410 | ], 411 | "description": "A PHP parser written in PHP", 412 | "keywords": [ 413 | "parser", 414 | "php" 415 | ], 416 | "support": { 417 | "issues": "https://github.com/nikic/PHP-Parser/issues", 418 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" 419 | }, 420 | "time": "2024-10-08T18:51:32+00:00" 421 | }, 422 | { 423 | "name": "phar-io/manifest", 424 | "version": "2.0.4", 425 | "source": { 426 | "type": "git", 427 | "url": "https://github.com/phar-io/manifest.git", 428 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 429 | }, 430 | "dist": { 431 | "type": "zip", 432 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 433 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 434 | "shasum": "" 435 | }, 436 | "require": { 437 | "ext-dom": "*", 438 | "ext-libxml": "*", 439 | "ext-phar": "*", 440 | "ext-xmlwriter": "*", 441 | "phar-io/version": "^3.0.1", 442 | "php": "^7.2 || ^8.0" 443 | }, 444 | "type": "library", 445 | "extra": { 446 | "branch-alias": { 447 | "dev-master": "2.0.x-dev" 448 | } 449 | }, 450 | "autoload": { 451 | "classmap": [ 452 | "src/" 453 | ] 454 | }, 455 | "notification-url": "https://packagist.org/downloads/", 456 | "license": [ 457 | "BSD-3-Clause" 458 | ], 459 | "authors": [ 460 | { 461 | "name": "Arne Blankerts", 462 | "email": "arne@blankerts.de", 463 | "role": "Developer" 464 | }, 465 | { 466 | "name": "Sebastian Heuer", 467 | "email": "sebastian@phpeople.de", 468 | "role": "Developer" 469 | }, 470 | { 471 | "name": "Sebastian Bergmann", 472 | "email": "sebastian@phpunit.de", 473 | "role": "Developer" 474 | } 475 | ], 476 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 477 | "support": { 478 | "issues": "https://github.com/phar-io/manifest/issues", 479 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 480 | }, 481 | "funding": [ 482 | { 483 | "url": "https://github.com/theseer", 484 | "type": "github" 485 | } 486 | ], 487 | "time": "2024-03-03T12:33:53+00:00" 488 | }, 489 | { 490 | "name": "phar-io/version", 491 | "version": "3.2.1", 492 | "source": { 493 | "type": "git", 494 | "url": "https://github.com/phar-io/version.git", 495 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 496 | }, 497 | "dist": { 498 | "type": "zip", 499 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 500 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 501 | "shasum": "" 502 | }, 503 | "require": { 504 | "php": "^7.2 || ^8.0" 505 | }, 506 | "type": "library", 507 | "autoload": { 508 | "classmap": [ 509 | "src/" 510 | ] 511 | }, 512 | "notification-url": "https://packagist.org/downloads/", 513 | "license": [ 514 | "BSD-3-Clause" 515 | ], 516 | "authors": [ 517 | { 518 | "name": "Arne Blankerts", 519 | "email": "arne@blankerts.de", 520 | "role": "Developer" 521 | }, 522 | { 523 | "name": "Sebastian Heuer", 524 | "email": "sebastian@phpeople.de", 525 | "role": "Developer" 526 | }, 527 | { 528 | "name": "Sebastian Bergmann", 529 | "email": "sebastian@phpunit.de", 530 | "role": "Developer" 531 | } 532 | ], 533 | "description": "Library for handling version information and constraints", 534 | "support": { 535 | "issues": "https://github.com/phar-io/version/issues", 536 | "source": "https://github.com/phar-io/version/tree/3.2.1" 537 | }, 538 | "time": "2022-02-21T01:04:05+00:00" 539 | }, 540 | { 541 | "name": "phpcsstandards/phpcsextra", 542 | "version": "1.2.1", 543 | "source": { 544 | "type": "git", 545 | "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", 546 | "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489" 547 | }, 548 | "dist": { 549 | "type": "zip", 550 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", 551 | "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", 552 | "shasum": "" 553 | }, 554 | "require": { 555 | "php": ">=5.4", 556 | "phpcsstandards/phpcsutils": "^1.0.9", 557 | "squizlabs/php_codesniffer": "^3.8.0" 558 | }, 559 | "require-dev": { 560 | "php-parallel-lint/php-console-highlighter": "^1.0", 561 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 562 | "phpcsstandards/phpcsdevcs": "^1.1.6", 563 | "phpcsstandards/phpcsdevtools": "^1.2.1", 564 | "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 565 | }, 566 | "type": "phpcodesniffer-standard", 567 | "extra": { 568 | "branch-alias": { 569 | "dev-stable": "1.x-dev", 570 | "dev-develop": "1.x-dev" 571 | } 572 | }, 573 | "notification-url": "https://packagist.org/downloads/", 574 | "license": [ 575 | "LGPL-3.0-or-later" 576 | ], 577 | "authors": [ 578 | { 579 | "name": "Juliette Reinders Folmer", 580 | "homepage": "https://github.com/jrfnl", 581 | "role": "lead" 582 | }, 583 | { 584 | "name": "Contributors", 585 | "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" 586 | } 587 | ], 588 | "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", 589 | "keywords": [ 590 | "PHP_CodeSniffer", 591 | "phpcbf", 592 | "phpcodesniffer-standard", 593 | "phpcs", 594 | "standards", 595 | "static analysis" 596 | ], 597 | "support": { 598 | "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", 599 | "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", 600 | "source": "https://github.com/PHPCSStandards/PHPCSExtra" 601 | }, 602 | "funding": [ 603 | { 604 | "url": "https://github.com/PHPCSStandards", 605 | "type": "github" 606 | }, 607 | { 608 | "url": "https://github.com/jrfnl", 609 | "type": "github" 610 | }, 611 | { 612 | "url": "https://opencollective.com/php_codesniffer", 613 | "type": "open_collective" 614 | } 615 | ], 616 | "time": "2023-12-08T16:49:07+00:00" 617 | }, 618 | { 619 | "name": "phpcsstandards/phpcsutils", 620 | "version": "1.0.12", 621 | "source": { 622 | "type": "git", 623 | "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", 624 | "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" 625 | }, 626 | "dist": { 627 | "type": "zip", 628 | "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", 629 | "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", 630 | "shasum": "" 631 | }, 632 | "require": { 633 | "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", 634 | "php": ">=5.4", 635 | "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" 636 | }, 637 | "require-dev": { 638 | "ext-filter": "*", 639 | "php-parallel-lint/php-console-highlighter": "^1.0", 640 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 641 | "phpcsstandards/phpcsdevcs": "^1.1.6", 642 | "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" 643 | }, 644 | "type": "phpcodesniffer-standard", 645 | "extra": { 646 | "branch-alias": { 647 | "dev-stable": "1.x-dev", 648 | "dev-develop": "1.x-dev" 649 | } 650 | }, 651 | "autoload": { 652 | "classmap": [ 653 | "PHPCSUtils/" 654 | ] 655 | }, 656 | "notification-url": "https://packagist.org/downloads/", 657 | "license": [ 658 | "LGPL-3.0-or-later" 659 | ], 660 | "authors": [ 661 | { 662 | "name": "Juliette Reinders Folmer", 663 | "homepage": "https://github.com/jrfnl", 664 | "role": "lead" 665 | }, 666 | { 667 | "name": "Contributors", 668 | "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" 669 | } 670 | ], 671 | "description": "A suite of utility functions for use with PHP_CodeSniffer", 672 | "homepage": "https://phpcsutils.com/", 673 | "keywords": [ 674 | "PHP_CodeSniffer", 675 | "phpcbf", 676 | "phpcodesniffer-standard", 677 | "phpcs", 678 | "phpcs3", 679 | "standards", 680 | "static analysis", 681 | "tokens", 682 | "utility" 683 | ], 684 | "support": { 685 | "docs": "https://phpcsutils.com/", 686 | "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", 687 | "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", 688 | "source": "https://github.com/PHPCSStandards/PHPCSUtils" 689 | }, 690 | "funding": [ 691 | { 692 | "url": "https://github.com/PHPCSStandards", 693 | "type": "github" 694 | }, 695 | { 696 | "url": "https://github.com/jrfnl", 697 | "type": "github" 698 | }, 699 | { 700 | "url": "https://opencollective.com/php_codesniffer", 701 | "type": "open_collective" 702 | } 703 | ], 704 | "time": "2024-05-20T13:34:27+00:00" 705 | }, 706 | { 707 | "name": "phpunit/php-code-coverage", 708 | "version": "9.2.32", 709 | "source": { 710 | "type": "git", 711 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 712 | "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" 713 | }, 714 | "dist": { 715 | "type": "zip", 716 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", 717 | "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", 718 | "shasum": "" 719 | }, 720 | "require": { 721 | "ext-dom": "*", 722 | "ext-libxml": "*", 723 | "ext-xmlwriter": "*", 724 | "nikic/php-parser": "^4.19.1 || ^5.1.0", 725 | "php": ">=7.3", 726 | "phpunit/php-file-iterator": "^3.0.6", 727 | "phpunit/php-text-template": "^2.0.4", 728 | "sebastian/code-unit-reverse-lookup": "^2.0.3", 729 | "sebastian/complexity": "^2.0.3", 730 | "sebastian/environment": "^5.1.5", 731 | "sebastian/lines-of-code": "^1.0.4", 732 | "sebastian/version": "^3.0.2", 733 | "theseer/tokenizer": "^1.2.3" 734 | }, 735 | "require-dev": { 736 | "phpunit/phpunit": "^9.6" 737 | }, 738 | "suggest": { 739 | "ext-pcov": "PHP extension that provides line coverage", 740 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 741 | }, 742 | "type": "library", 743 | "extra": { 744 | "branch-alias": { 745 | "dev-main": "9.2.x-dev" 746 | } 747 | }, 748 | "autoload": { 749 | "classmap": [ 750 | "src/" 751 | ] 752 | }, 753 | "notification-url": "https://packagist.org/downloads/", 754 | "license": [ 755 | "BSD-3-Clause" 756 | ], 757 | "authors": [ 758 | { 759 | "name": "Sebastian Bergmann", 760 | "email": "sebastian@phpunit.de", 761 | "role": "lead" 762 | } 763 | ], 764 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 765 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 766 | "keywords": [ 767 | "coverage", 768 | "testing", 769 | "xunit" 770 | ], 771 | "support": { 772 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 773 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 774 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" 775 | }, 776 | "funding": [ 777 | { 778 | "url": "https://github.com/sebastianbergmann", 779 | "type": "github" 780 | } 781 | ], 782 | "time": "2024-08-22T04:23:01+00:00" 783 | }, 784 | { 785 | "name": "phpunit/php-file-iterator", 786 | "version": "3.0.6", 787 | "source": { 788 | "type": "git", 789 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 790 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 791 | }, 792 | "dist": { 793 | "type": "zip", 794 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 795 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 796 | "shasum": "" 797 | }, 798 | "require": { 799 | "php": ">=7.3" 800 | }, 801 | "require-dev": { 802 | "phpunit/phpunit": "^9.3" 803 | }, 804 | "type": "library", 805 | "extra": { 806 | "branch-alias": { 807 | "dev-master": "3.0-dev" 808 | } 809 | }, 810 | "autoload": { 811 | "classmap": [ 812 | "src/" 813 | ] 814 | }, 815 | "notification-url": "https://packagist.org/downloads/", 816 | "license": [ 817 | "BSD-3-Clause" 818 | ], 819 | "authors": [ 820 | { 821 | "name": "Sebastian Bergmann", 822 | "email": "sebastian@phpunit.de", 823 | "role": "lead" 824 | } 825 | ], 826 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 827 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 828 | "keywords": [ 829 | "filesystem", 830 | "iterator" 831 | ], 832 | "support": { 833 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 834 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 835 | }, 836 | "funding": [ 837 | { 838 | "url": "https://github.com/sebastianbergmann", 839 | "type": "github" 840 | } 841 | ], 842 | "time": "2021-12-02T12:48:52+00:00" 843 | }, 844 | { 845 | "name": "phpunit/php-invoker", 846 | "version": "3.1.1", 847 | "source": { 848 | "type": "git", 849 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 850 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 851 | }, 852 | "dist": { 853 | "type": "zip", 854 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 855 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 856 | "shasum": "" 857 | }, 858 | "require": { 859 | "php": ">=7.3" 860 | }, 861 | "require-dev": { 862 | "ext-pcntl": "*", 863 | "phpunit/phpunit": "^9.3" 864 | }, 865 | "suggest": { 866 | "ext-pcntl": "*" 867 | }, 868 | "type": "library", 869 | "extra": { 870 | "branch-alias": { 871 | "dev-master": "3.1-dev" 872 | } 873 | }, 874 | "autoload": { 875 | "classmap": [ 876 | "src/" 877 | ] 878 | }, 879 | "notification-url": "https://packagist.org/downloads/", 880 | "license": [ 881 | "BSD-3-Clause" 882 | ], 883 | "authors": [ 884 | { 885 | "name": "Sebastian Bergmann", 886 | "email": "sebastian@phpunit.de", 887 | "role": "lead" 888 | } 889 | ], 890 | "description": "Invoke callables with a timeout", 891 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 892 | "keywords": [ 893 | "process" 894 | ], 895 | "support": { 896 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 897 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 898 | }, 899 | "funding": [ 900 | { 901 | "url": "https://github.com/sebastianbergmann", 902 | "type": "github" 903 | } 904 | ], 905 | "time": "2020-09-28T05:58:55+00:00" 906 | }, 907 | { 908 | "name": "phpunit/php-text-template", 909 | "version": "2.0.4", 910 | "source": { 911 | "type": "git", 912 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 913 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 914 | }, 915 | "dist": { 916 | "type": "zip", 917 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 918 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 919 | "shasum": "" 920 | }, 921 | "require": { 922 | "php": ">=7.3" 923 | }, 924 | "require-dev": { 925 | "phpunit/phpunit": "^9.3" 926 | }, 927 | "type": "library", 928 | "extra": { 929 | "branch-alias": { 930 | "dev-master": "2.0-dev" 931 | } 932 | }, 933 | "autoload": { 934 | "classmap": [ 935 | "src/" 936 | ] 937 | }, 938 | "notification-url": "https://packagist.org/downloads/", 939 | "license": [ 940 | "BSD-3-Clause" 941 | ], 942 | "authors": [ 943 | { 944 | "name": "Sebastian Bergmann", 945 | "email": "sebastian@phpunit.de", 946 | "role": "lead" 947 | } 948 | ], 949 | "description": "Simple template engine.", 950 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 951 | "keywords": [ 952 | "template" 953 | ], 954 | "support": { 955 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 956 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 957 | }, 958 | "funding": [ 959 | { 960 | "url": "https://github.com/sebastianbergmann", 961 | "type": "github" 962 | } 963 | ], 964 | "time": "2020-10-26T05:33:50+00:00" 965 | }, 966 | { 967 | "name": "phpunit/php-timer", 968 | "version": "5.0.3", 969 | "source": { 970 | "type": "git", 971 | "url": "https://github.com/sebastianbergmann/php-timer.git", 972 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 973 | }, 974 | "dist": { 975 | "type": "zip", 976 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 977 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 978 | "shasum": "" 979 | }, 980 | "require": { 981 | "php": ">=7.3" 982 | }, 983 | "require-dev": { 984 | "phpunit/phpunit": "^9.3" 985 | }, 986 | "type": "library", 987 | "extra": { 988 | "branch-alias": { 989 | "dev-master": "5.0-dev" 990 | } 991 | }, 992 | "autoload": { 993 | "classmap": [ 994 | "src/" 995 | ] 996 | }, 997 | "notification-url": "https://packagist.org/downloads/", 998 | "license": [ 999 | "BSD-3-Clause" 1000 | ], 1001 | "authors": [ 1002 | { 1003 | "name": "Sebastian Bergmann", 1004 | "email": "sebastian@phpunit.de", 1005 | "role": "lead" 1006 | } 1007 | ], 1008 | "description": "Utility class for timing", 1009 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1010 | "keywords": [ 1011 | "timer" 1012 | ], 1013 | "support": { 1014 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1015 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1016 | }, 1017 | "funding": [ 1018 | { 1019 | "url": "https://github.com/sebastianbergmann", 1020 | "type": "github" 1021 | } 1022 | ], 1023 | "time": "2020-10-26T13:16:10+00:00" 1024 | }, 1025 | { 1026 | "name": "phpunit/phpunit", 1027 | "version": "9.6.22", 1028 | "source": { 1029 | "type": "git", 1030 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1031 | "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" 1032 | }, 1033 | "dist": { 1034 | "type": "zip", 1035 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", 1036 | "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", 1037 | "shasum": "" 1038 | }, 1039 | "require": { 1040 | "doctrine/instantiator": "^1.5.0 || ^2", 1041 | "ext-dom": "*", 1042 | "ext-json": "*", 1043 | "ext-libxml": "*", 1044 | "ext-mbstring": "*", 1045 | "ext-xml": "*", 1046 | "ext-xmlwriter": "*", 1047 | "myclabs/deep-copy": "^1.12.1", 1048 | "phar-io/manifest": "^2.0.4", 1049 | "phar-io/version": "^3.2.1", 1050 | "php": ">=7.3", 1051 | "phpunit/php-code-coverage": "^9.2.32", 1052 | "phpunit/php-file-iterator": "^3.0.6", 1053 | "phpunit/php-invoker": "^3.1.1", 1054 | "phpunit/php-text-template": "^2.0.4", 1055 | "phpunit/php-timer": "^5.0.3", 1056 | "sebastian/cli-parser": "^1.0.2", 1057 | "sebastian/code-unit": "^1.0.8", 1058 | "sebastian/comparator": "^4.0.8", 1059 | "sebastian/diff": "^4.0.6", 1060 | "sebastian/environment": "^5.1.5", 1061 | "sebastian/exporter": "^4.0.6", 1062 | "sebastian/global-state": "^5.0.7", 1063 | "sebastian/object-enumerator": "^4.0.4", 1064 | "sebastian/resource-operations": "^3.0.4", 1065 | "sebastian/type": "^3.2.1", 1066 | "sebastian/version": "^3.0.2" 1067 | }, 1068 | "suggest": { 1069 | "ext-soap": "To be able to generate mocks based on WSDL files", 1070 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 1071 | }, 1072 | "bin": [ 1073 | "phpunit" 1074 | ], 1075 | "type": "library", 1076 | "extra": { 1077 | "branch-alias": { 1078 | "dev-master": "9.6-dev" 1079 | } 1080 | }, 1081 | "autoload": { 1082 | "files": [ 1083 | "src/Framework/Assert/Functions.php" 1084 | ], 1085 | "classmap": [ 1086 | "src/" 1087 | ] 1088 | }, 1089 | "notification-url": "https://packagist.org/downloads/", 1090 | "license": [ 1091 | "BSD-3-Clause" 1092 | ], 1093 | "authors": [ 1094 | { 1095 | "name": "Sebastian Bergmann", 1096 | "email": "sebastian@phpunit.de", 1097 | "role": "lead" 1098 | } 1099 | ], 1100 | "description": "The PHP Unit Testing framework.", 1101 | "homepage": "https://phpunit.de/", 1102 | "keywords": [ 1103 | "phpunit", 1104 | "testing", 1105 | "xunit" 1106 | ], 1107 | "support": { 1108 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1109 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1110 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" 1111 | }, 1112 | "funding": [ 1113 | { 1114 | "url": "https://phpunit.de/sponsors.html", 1115 | "type": "custom" 1116 | }, 1117 | { 1118 | "url": "https://github.com/sebastianbergmann", 1119 | "type": "github" 1120 | }, 1121 | { 1122 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1123 | "type": "tidelift" 1124 | } 1125 | ], 1126 | "time": "2024-12-05T13:48:26+00:00" 1127 | }, 1128 | { 1129 | "name": "roots/wordpress", 1130 | "version": "6.7.1", 1131 | "source": { 1132 | "type": "git", 1133 | "url": "https://github.com/roots/wordpress.git", 1134 | "reference": "9451af491af7124c12186398c56ab87a6e145123" 1135 | }, 1136 | "dist": { 1137 | "type": "zip", 1138 | "url": "https://api.github.com/repos/roots/wordpress/zipball/9451af491af7124c12186398c56ab87a6e145123", 1139 | "reference": "9451af491af7124c12186398c56ab87a6e145123", 1140 | "shasum": "" 1141 | }, 1142 | "require": { 1143 | "roots/wordpress-core-installer": "^1.0.0", 1144 | "roots/wordpress-no-content": "self.version" 1145 | }, 1146 | "type": "metapackage", 1147 | "notification-url": "https://packagist.org/downloads/", 1148 | "license": [ 1149 | "MIT", 1150 | "GPL-2.0-or-later" 1151 | ], 1152 | "description": "WordPress is open source software you can use to create a beautiful website, blog, or app.", 1153 | "homepage": "https://wordpress.org/", 1154 | "keywords": [ 1155 | "blog", 1156 | "cms", 1157 | "wordpress" 1158 | ], 1159 | "support": { 1160 | "issues": "https://github.com/roots/wordpress/issues", 1161 | "source": "https://github.com/roots/wordpress/tree/6.7.1" 1162 | }, 1163 | "funding": [ 1164 | { 1165 | "url": "https://github.com/roots", 1166 | "type": "github" 1167 | } 1168 | ], 1169 | "time": "2024-11-13T09:56:09+00:00" 1170 | }, 1171 | { 1172 | "name": "roots/wordpress-core-installer", 1173 | "version": "1.100.0", 1174 | "source": { 1175 | "type": "git", 1176 | "url": "https://github.com/roots/wordpress-core-installer.git", 1177 | "reference": "73f8488e5178c5d54234b919f823a9095e2b1847" 1178 | }, 1179 | "dist": { 1180 | "type": "zip", 1181 | "url": "https://api.github.com/repos/roots/wordpress-core-installer/zipball/73f8488e5178c5d54234b919f823a9095e2b1847", 1182 | "reference": "73f8488e5178c5d54234b919f823a9095e2b1847", 1183 | "shasum": "" 1184 | }, 1185 | "require": { 1186 | "composer-plugin-api": "^1.0 || ^2.0", 1187 | "php": ">=5.6.0" 1188 | }, 1189 | "conflict": { 1190 | "composer/installers": "<1.0.6" 1191 | }, 1192 | "replace": { 1193 | "johnpbloch/wordpress-core-installer": "*" 1194 | }, 1195 | "require-dev": { 1196 | "composer/composer": "^1.0 || ^2.0", 1197 | "phpunit/phpunit": ">=5.7.27" 1198 | }, 1199 | "type": "composer-plugin", 1200 | "extra": { 1201 | "class": "Roots\\Composer\\WordPressCorePlugin" 1202 | }, 1203 | "autoload": { 1204 | "psr-4": { 1205 | "Roots\\Composer\\": "src/" 1206 | } 1207 | }, 1208 | "notification-url": "https://packagist.org/downloads/", 1209 | "license": [ 1210 | "GPL-2.0-or-later" 1211 | ], 1212 | "authors": [ 1213 | { 1214 | "name": "John P. Bloch", 1215 | "email": "me@johnpbloch.com" 1216 | }, 1217 | { 1218 | "name": "Roots", 1219 | "email": "team@roots.io" 1220 | } 1221 | ], 1222 | "description": "A custom installer to handle deploying WordPress with composer", 1223 | "keywords": [ 1224 | "wordpress" 1225 | ], 1226 | "support": { 1227 | "issues": "https://github.com/roots/wordpress-core-installer/issues", 1228 | "source": "https://github.com/roots/wordpress-core-installer/tree/master" 1229 | }, 1230 | "funding": [ 1231 | { 1232 | "url": "https://github.com/roots", 1233 | "type": "github" 1234 | }, 1235 | { 1236 | "url": "https://www.patreon.com/rootsdev", 1237 | "type": "patreon" 1238 | } 1239 | ], 1240 | "time": "2020-08-20T00:27:30+00:00" 1241 | }, 1242 | { 1243 | "name": "roots/wordpress-no-content", 1244 | "version": "6.7.1", 1245 | "source": { 1246 | "type": "git", 1247 | "url": "https://github.com/WordPress/WordPress.git", 1248 | "reference": "6.7.1" 1249 | }, 1250 | "dist": { 1251 | "type": "zip", 1252 | "url": "https://downloads.wordpress.org/release/wordpress-6.7.1-no-content.zip", 1253 | "shasum": "321a5b819369e772ce606fbc12b1e264fb73da5b" 1254 | }, 1255 | "require": { 1256 | "php": ">= 7.2.24" 1257 | }, 1258 | "provide": { 1259 | "wordpress/core-implementation": "6.7.1" 1260 | }, 1261 | "suggest": { 1262 | "ext-curl": "Performs remote request operations.", 1263 | "ext-dom": "Used to validate Text Widget content and to automatically configuring IIS7+.", 1264 | "ext-exif": "Works with metadata stored in images.", 1265 | "ext-fileinfo": "Used to detect mimetype of file uploads.", 1266 | "ext-hash": "Used for hashing, including passwords and update packages.", 1267 | "ext-imagick": "Provides better image quality for media uploads.", 1268 | "ext-json": "Used for communications with other servers.", 1269 | "ext-libsodium": "Validates Signatures and provides securely random bytes.", 1270 | "ext-mbstring": "Used to properly handle UTF8 text.", 1271 | "ext-mysqli": "Connects to MySQL for database interactions.", 1272 | "ext-openssl": "Permits SSL-based connections to other hosts.", 1273 | "ext-pcre": "Increases performance of pattern matching in code searches.", 1274 | "ext-xml": "Used for XML parsing, such as from a third-party site.", 1275 | "ext-zip": "Used for decompressing Plugins, Themes, and WordPress update packages." 1276 | }, 1277 | "type": "wordpress-core", 1278 | "notification-url": "https://packagist.org/downloads/", 1279 | "license": [ 1280 | "GPL-2.0-or-later" 1281 | ], 1282 | "authors": [ 1283 | { 1284 | "name": "WordPress Community", 1285 | "homepage": "https://wordpress.org/about/" 1286 | } 1287 | ], 1288 | "description": "WordPress is open source software you can use to create a beautiful website, blog, or app.", 1289 | "homepage": "https://wordpress.org/", 1290 | "keywords": [ 1291 | "blog", 1292 | "cms", 1293 | "wordpress" 1294 | ], 1295 | "support": { 1296 | "docs": "https://developer.wordpress.org/", 1297 | "forum": "https://wordpress.org/support/", 1298 | "irc": "irc://irc.freenode.net/wordpress", 1299 | "issues": "https://core.trac.wordpress.org/", 1300 | "rss": "https://wordpress.org/news/feed/", 1301 | "source": "https://core.trac.wordpress.org/browser", 1302 | "wiki": "https://codex.wordpress.org/" 1303 | }, 1304 | "funding": [ 1305 | { 1306 | "url": "https://wordpressfoundation.org/donate/", 1307 | "type": "other" 1308 | } 1309 | ], 1310 | "time": "2024-11-21T14:15:19+00:00" 1311 | }, 1312 | { 1313 | "name": "sebastian/cli-parser", 1314 | "version": "1.0.2", 1315 | "source": { 1316 | "type": "git", 1317 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1318 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" 1319 | }, 1320 | "dist": { 1321 | "type": "zip", 1322 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 1323 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 1324 | "shasum": "" 1325 | }, 1326 | "require": { 1327 | "php": ">=7.3" 1328 | }, 1329 | "require-dev": { 1330 | "phpunit/phpunit": "^9.3" 1331 | }, 1332 | "type": "library", 1333 | "extra": { 1334 | "branch-alias": { 1335 | "dev-master": "1.0-dev" 1336 | } 1337 | }, 1338 | "autoload": { 1339 | "classmap": [ 1340 | "src/" 1341 | ] 1342 | }, 1343 | "notification-url": "https://packagist.org/downloads/", 1344 | "license": [ 1345 | "BSD-3-Clause" 1346 | ], 1347 | "authors": [ 1348 | { 1349 | "name": "Sebastian Bergmann", 1350 | "email": "sebastian@phpunit.de", 1351 | "role": "lead" 1352 | } 1353 | ], 1354 | "description": "Library for parsing CLI options", 1355 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1356 | "support": { 1357 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1358 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" 1359 | }, 1360 | "funding": [ 1361 | { 1362 | "url": "https://github.com/sebastianbergmann", 1363 | "type": "github" 1364 | } 1365 | ], 1366 | "time": "2024-03-02T06:27:43+00:00" 1367 | }, 1368 | { 1369 | "name": "sebastian/code-unit", 1370 | "version": "1.0.8", 1371 | "source": { 1372 | "type": "git", 1373 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1374 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1375 | }, 1376 | "dist": { 1377 | "type": "zip", 1378 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1379 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1380 | "shasum": "" 1381 | }, 1382 | "require": { 1383 | "php": ">=7.3" 1384 | }, 1385 | "require-dev": { 1386 | "phpunit/phpunit": "^9.3" 1387 | }, 1388 | "type": "library", 1389 | "extra": { 1390 | "branch-alias": { 1391 | "dev-master": "1.0-dev" 1392 | } 1393 | }, 1394 | "autoload": { 1395 | "classmap": [ 1396 | "src/" 1397 | ] 1398 | }, 1399 | "notification-url": "https://packagist.org/downloads/", 1400 | "license": [ 1401 | "BSD-3-Clause" 1402 | ], 1403 | "authors": [ 1404 | { 1405 | "name": "Sebastian Bergmann", 1406 | "email": "sebastian@phpunit.de", 1407 | "role": "lead" 1408 | } 1409 | ], 1410 | "description": "Collection of value objects that represent the PHP code units", 1411 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1412 | "support": { 1413 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1414 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1415 | }, 1416 | "funding": [ 1417 | { 1418 | "url": "https://github.com/sebastianbergmann", 1419 | "type": "github" 1420 | } 1421 | ], 1422 | "time": "2020-10-26T13:08:54+00:00" 1423 | }, 1424 | { 1425 | "name": "sebastian/code-unit-reverse-lookup", 1426 | "version": "2.0.3", 1427 | "source": { 1428 | "type": "git", 1429 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1430 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1431 | }, 1432 | "dist": { 1433 | "type": "zip", 1434 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1435 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1436 | "shasum": "" 1437 | }, 1438 | "require": { 1439 | "php": ">=7.3" 1440 | }, 1441 | "require-dev": { 1442 | "phpunit/phpunit": "^9.3" 1443 | }, 1444 | "type": "library", 1445 | "extra": { 1446 | "branch-alias": { 1447 | "dev-master": "2.0-dev" 1448 | } 1449 | }, 1450 | "autoload": { 1451 | "classmap": [ 1452 | "src/" 1453 | ] 1454 | }, 1455 | "notification-url": "https://packagist.org/downloads/", 1456 | "license": [ 1457 | "BSD-3-Clause" 1458 | ], 1459 | "authors": [ 1460 | { 1461 | "name": "Sebastian Bergmann", 1462 | "email": "sebastian@phpunit.de" 1463 | } 1464 | ], 1465 | "description": "Looks up which function or method a line of code belongs to", 1466 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1467 | "support": { 1468 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1469 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1470 | }, 1471 | "funding": [ 1472 | { 1473 | "url": "https://github.com/sebastianbergmann", 1474 | "type": "github" 1475 | } 1476 | ], 1477 | "time": "2020-09-28T05:30:19+00:00" 1478 | }, 1479 | { 1480 | "name": "sebastian/comparator", 1481 | "version": "4.0.8", 1482 | "source": { 1483 | "type": "git", 1484 | "url": "https://github.com/sebastianbergmann/comparator.git", 1485 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 1486 | }, 1487 | "dist": { 1488 | "type": "zip", 1489 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 1490 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 1491 | "shasum": "" 1492 | }, 1493 | "require": { 1494 | "php": ">=7.3", 1495 | "sebastian/diff": "^4.0", 1496 | "sebastian/exporter": "^4.0" 1497 | }, 1498 | "require-dev": { 1499 | "phpunit/phpunit": "^9.3" 1500 | }, 1501 | "type": "library", 1502 | "extra": { 1503 | "branch-alias": { 1504 | "dev-master": "4.0-dev" 1505 | } 1506 | }, 1507 | "autoload": { 1508 | "classmap": [ 1509 | "src/" 1510 | ] 1511 | }, 1512 | "notification-url": "https://packagist.org/downloads/", 1513 | "license": [ 1514 | "BSD-3-Clause" 1515 | ], 1516 | "authors": [ 1517 | { 1518 | "name": "Sebastian Bergmann", 1519 | "email": "sebastian@phpunit.de" 1520 | }, 1521 | { 1522 | "name": "Jeff Welch", 1523 | "email": "whatthejeff@gmail.com" 1524 | }, 1525 | { 1526 | "name": "Volker Dusch", 1527 | "email": "github@wallbash.com" 1528 | }, 1529 | { 1530 | "name": "Bernhard Schussek", 1531 | "email": "bschussek@2bepublished.at" 1532 | } 1533 | ], 1534 | "description": "Provides the functionality to compare PHP values for equality", 1535 | "homepage": "https://github.com/sebastianbergmann/comparator", 1536 | "keywords": [ 1537 | "comparator", 1538 | "compare", 1539 | "equality" 1540 | ], 1541 | "support": { 1542 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1543 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1544 | }, 1545 | "funding": [ 1546 | { 1547 | "url": "https://github.com/sebastianbergmann", 1548 | "type": "github" 1549 | } 1550 | ], 1551 | "time": "2022-09-14T12:41:17+00:00" 1552 | }, 1553 | { 1554 | "name": "sebastian/complexity", 1555 | "version": "2.0.3", 1556 | "source": { 1557 | "type": "git", 1558 | "url": "https://github.com/sebastianbergmann/complexity.git", 1559 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" 1560 | }, 1561 | "dist": { 1562 | "type": "zip", 1563 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", 1564 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", 1565 | "shasum": "" 1566 | }, 1567 | "require": { 1568 | "nikic/php-parser": "^4.18 || ^5.0", 1569 | "php": ">=7.3" 1570 | }, 1571 | "require-dev": { 1572 | "phpunit/phpunit": "^9.3" 1573 | }, 1574 | "type": "library", 1575 | "extra": { 1576 | "branch-alias": { 1577 | "dev-master": "2.0-dev" 1578 | } 1579 | }, 1580 | "autoload": { 1581 | "classmap": [ 1582 | "src/" 1583 | ] 1584 | }, 1585 | "notification-url": "https://packagist.org/downloads/", 1586 | "license": [ 1587 | "BSD-3-Clause" 1588 | ], 1589 | "authors": [ 1590 | { 1591 | "name": "Sebastian Bergmann", 1592 | "email": "sebastian@phpunit.de", 1593 | "role": "lead" 1594 | } 1595 | ], 1596 | "description": "Library for calculating the complexity of PHP code units", 1597 | "homepage": "https://github.com/sebastianbergmann/complexity", 1598 | "support": { 1599 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1600 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" 1601 | }, 1602 | "funding": [ 1603 | { 1604 | "url": "https://github.com/sebastianbergmann", 1605 | "type": "github" 1606 | } 1607 | ], 1608 | "time": "2023-12-22T06:19:30+00:00" 1609 | }, 1610 | { 1611 | "name": "sebastian/diff", 1612 | "version": "4.0.6", 1613 | "source": { 1614 | "type": "git", 1615 | "url": "https://github.com/sebastianbergmann/diff.git", 1616 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" 1617 | }, 1618 | "dist": { 1619 | "type": "zip", 1620 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", 1621 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", 1622 | "shasum": "" 1623 | }, 1624 | "require": { 1625 | "php": ">=7.3" 1626 | }, 1627 | "require-dev": { 1628 | "phpunit/phpunit": "^9.3", 1629 | "symfony/process": "^4.2 || ^5" 1630 | }, 1631 | "type": "library", 1632 | "extra": { 1633 | "branch-alias": { 1634 | "dev-master": "4.0-dev" 1635 | } 1636 | }, 1637 | "autoload": { 1638 | "classmap": [ 1639 | "src/" 1640 | ] 1641 | }, 1642 | "notification-url": "https://packagist.org/downloads/", 1643 | "license": [ 1644 | "BSD-3-Clause" 1645 | ], 1646 | "authors": [ 1647 | { 1648 | "name": "Sebastian Bergmann", 1649 | "email": "sebastian@phpunit.de" 1650 | }, 1651 | { 1652 | "name": "Kore Nordmann", 1653 | "email": "mail@kore-nordmann.de" 1654 | } 1655 | ], 1656 | "description": "Diff implementation", 1657 | "homepage": "https://github.com/sebastianbergmann/diff", 1658 | "keywords": [ 1659 | "diff", 1660 | "udiff", 1661 | "unidiff", 1662 | "unified diff" 1663 | ], 1664 | "support": { 1665 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1666 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" 1667 | }, 1668 | "funding": [ 1669 | { 1670 | "url": "https://github.com/sebastianbergmann", 1671 | "type": "github" 1672 | } 1673 | ], 1674 | "time": "2024-03-02T06:30:58+00:00" 1675 | }, 1676 | { 1677 | "name": "sebastian/environment", 1678 | "version": "5.1.5", 1679 | "source": { 1680 | "type": "git", 1681 | "url": "https://github.com/sebastianbergmann/environment.git", 1682 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 1683 | }, 1684 | "dist": { 1685 | "type": "zip", 1686 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1687 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1688 | "shasum": "" 1689 | }, 1690 | "require": { 1691 | "php": ">=7.3" 1692 | }, 1693 | "require-dev": { 1694 | "phpunit/phpunit": "^9.3" 1695 | }, 1696 | "suggest": { 1697 | "ext-posix": "*" 1698 | }, 1699 | "type": "library", 1700 | "extra": { 1701 | "branch-alias": { 1702 | "dev-master": "5.1-dev" 1703 | } 1704 | }, 1705 | "autoload": { 1706 | "classmap": [ 1707 | "src/" 1708 | ] 1709 | }, 1710 | "notification-url": "https://packagist.org/downloads/", 1711 | "license": [ 1712 | "BSD-3-Clause" 1713 | ], 1714 | "authors": [ 1715 | { 1716 | "name": "Sebastian Bergmann", 1717 | "email": "sebastian@phpunit.de" 1718 | } 1719 | ], 1720 | "description": "Provides functionality to handle HHVM/PHP environments", 1721 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1722 | "keywords": [ 1723 | "Xdebug", 1724 | "environment", 1725 | "hhvm" 1726 | ], 1727 | "support": { 1728 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1729 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 1730 | }, 1731 | "funding": [ 1732 | { 1733 | "url": "https://github.com/sebastianbergmann", 1734 | "type": "github" 1735 | } 1736 | ], 1737 | "time": "2023-02-03T06:03:51+00:00" 1738 | }, 1739 | { 1740 | "name": "sebastian/exporter", 1741 | "version": "4.0.6", 1742 | "source": { 1743 | "type": "git", 1744 | "url": "https://github.com/sebastianbergmann/exporter.git", 1745 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" 1746 | }, 1747 | "dist": { 1748 | "type": "zip", 1749 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", 1750 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", 1751 | "shasum": "" 1752 | }, 1753 | "require": { 1754 | "php": ">=7.3", 1755 | "sebastian/recursion-context": "^4.0" 1756 | }, 1757 | "require-dev": { 1758 | "ext-mbstring": "*", 1759 | "phpunit/phpunit": "^9.3" 1760 | }, 1761 | "type": "library", 1762 | "extra": { 1763 | "branch-alias": { 1764 | "dev-master": "4.0-dev" 1765 | } 1766 | }, 1767 | "autoload": { 1768 | "classmap": [ 1769 | "src/" 1770 | ] 1771 | }, 1772 | "notification-url": "https://packagist.org/downloads/", 1773 | "license": [ 1774 | "BSD-3-Clause" 1775 | ], 1776 | "authors": [ 1777 | { 1778 | "name": "Sebastian Bergmann", 1779 | "email": "sebastian@phpunit.de" 1780 | }, 1781 | { 1782 | "name": "Jeff Welch", 1783 | "email": "whatthejeff@gmail.com" 1784 | }, 1785 | { 1786 | "name": "Volker Dusch", 1787 | "email": "github@wallbash.com" 1788 | }, 1789 | { 1790 | "name": "Adam Harvey", 1791 | "email": "aharvey@php.net" 1792 | }, 1793 | { 1794 | "name": "Bernhard Schussek", 1795 | "email": "bschussek@gmail.com" 1796 | } 1797 | ], 1798 | "description": "Provides the functionality to export PHP variables for visualization", 1799 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1800 | "keywords": [ 1801 | "export", 1802 | "exporter" 1803 | ], 1804 | "support": { 1805 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1806 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" 1807 | }, 1808 | "funding": [ 1809 | { 1810 | "url": "https://github.com/sebastianbergmann", 1811 | "type": "github" 1812 | } 1813 | ], 1814 | "time": "2024-03-02T06:33:00+00:00" 1815 | }, 1816 | { 1817 | "name": "sebastian/global-state", 1818 | "version": "5.0.7", 1819 | "source": { 1820 | "type": "git", 1821 | "url": "https://github.com/sebastianbergmann/global-state.git", 1822 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" 1823 | }, 1824 | "dist": { 1825 | "type": "zip", 1826 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1827 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1828 | "shasum": "" 1829 | }, 1830 | "require": { 1831 | "php": ">=7.3", 1832 | "sebastian/object-reflector": "^2.0", 1833 | "sebastian/recursion-context": "^4.0" 1834 | }, 1835 | "require-dev": { 1836 | "ext-dom": "*", 1837 | "phpunit/phpunit": "^9.3" 1838 | }, 1839 | "suggest": { 1840 | "ext-uopz": "*" 1841 | }, 1842 | "type": "library", 1843 | "extra": { 1844 | "branch-alias": { 1845 | "dev-master": "5.0-dev" 1846 | } 1847 | }, 1848 | "autoload": { 1849 | "classmap": [ 1850 | "src/" 1851 | ] 1852 | }, 1853 | "notification-url": "https://packagist.org/downloads/", 1854 | "license": [ 1855 | "BSD-3-Clause" 1856 | ], 1857 | "authors": [ 1858 | { 1859 | "name": "Sebastian Bergmann", 1860 | "email": "sebastian@phpunit.de" 1861 | } 1862 | ], 1863 | "description": "Snapshotting of global state", 1864 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1865 | "keywords": [ 1866 | "global state" 1867 | ], 1868 | "support": { 1869 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1870 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" 1871 | }, 1872 | "funding": [ 1873 | { 1874 | "url": "https://github.com/sebastianbergmann", 1875 | "type": "github" 1876 | } 1877 | ], 1878 | "time": "2024-03-02T06:35:11+00:00" 1879 | }, 1880 | { 1881 | "name": "sebastian/lines-of-code", 1882 | "version": "1.0.4", 1883 | "source": { 1884 | "type": "git", 1885 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1886 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" 1887 | }, 1888 | "dist": { 1889 | "type": "zip", 1890 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1891 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1892 | "shasum": "" 1893 | }, 1894 | "require": { 1895 | "nikic/php-parser": "^4.18 || ^5.0", 1896 | "php": ">=7.3" 1897 | }, 1898 | "require-dev": { 1899 | "phpunit/phpunit": "^9.3" 1900 | }, 1901 | "type": "library", 1902 | "extra": { 1903 | "branch-alias": { 1904 | "dev-master": "1.0-dev" 1905 | } 1906 | }, 1907 | "autoload": { 1908 | "classmap": [ 1909 | "src/" 1910 | ] 1911 | }, 1912 | "notification-url": "https://packagist.org/downloads/", 1913 | "license": [ 1914 | "BSD-3-Clause" 1915 | ], 1916 | "authors": [ 1917 | { 1918 | "name": "Sebastian Bergmann", 1919 | "email": "sebastian@phpunit.de", 1920 | "role": "lead" 1921 | } 1922 | ], 1923 | "description": "Library for counting the lines of code in PHP source code", 1924 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1925 | "support": { 1926 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1927 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" 1928 | }, 1929 | "funding": [ 1930 | { 1931 | "url": "https://github.com/sebastianbergmann", 1932 | "type": "github" 1933 | } 1934 | ], 1935 | "time": "2023-12-22T06:20:34+00:00" 1936 | }, 1937 | { 1938 | "name": "sebastian/object-enumerator", 1939 | "version": "4.0.4", 1940 | "source": { 1941 | "type": "git", 1942 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1943 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1944 | }, 1945 | "dist": { 1946 | "type": "zip", 1947 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1948 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1949 | "shasum": "" 1950 | }, 1951 | "require": { 1952 | "php": ">=7.3", 1953 | "sebastian/object-reflector": "^2.0", 1954 | "sebastian/recursion-context": "^4.0" 1955 | }, 1956 | "require-dev": { 1957 | "phpunit/phpunit": "^9.3" 1958 | }, 1959 | "type": "library", 1960 | "extra": { 1961 | "branch-alias": { 1962 | "dev-master": "4.0-dev" 1963 | } 1964 | }, 1965 | "autoload": { 1966 | "classmap": [ 1967 | "src/" 1968 | ] 1969 | }, 1970 | "notification-url": "https://packagist.org/downloads/", 1971 | "license": [ 1972 | "BSD-3-Clause" 1973 | ], 1974 | "authors": [ 1975 | { 1976 | "name": "Sebastian Bergmann", 1977 | "email": "sebastian@phpunit.de" 1978 | } 1979 | ], 1980 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1981 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1982 | "support": { 1983 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1984 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1985 | }, 1986 | "funding": [ 1987 | { 1988 | "url": "https://github.com/sebastianbergmann", 1989 | "type": "github" 1990 | } 1991 | ], 1992 | "time": "2020-10-26T13:12:34+00:00" 1993 | }, 1994 | { 1995 | "name": "sebastian/object-reflector", 1996 | "version": "2.0.4", 1997 | "source": { 1998 | "type": "git", 1999 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2000 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 2001 | }, 2002 | "dist": { 2003 | "type": "zip", 2004 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2005 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2006 | "shasum": "" 2007 | }, 2008 | "require": { 2009 | "php": ">=7.3" 2010 | }, 2011 | "require-dev": { 2012 | "phpunit/phpunit": "^9.3" 2013 | }, 2014 | "type": "library", 2015 | "extra": { 2016 | "branch-alias": { 2017 | "dev-master": "2.0-dev" 2018 | } 2019 | }, 2020 | "autoload": { 2021 | "classmap": [ 2022 | "src/" 2023 | ] 2024 | }, 2025 | "notification-url": "https://packagist.org/downloads/", 2026 | "license": [ 2027 | "BSD-3-Clause" 2028 | ], 2029 | "authors": [ 2030 | { 2031 | "name": "Sebastian Bergmann", 2032 | "email": "sebastian@phpunit.de" 2033 | } 2034 | ], 2035 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2036 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2037 | "support": { 2038 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2039 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 2040 | }, 2041 | "funding": [ 2042 | { 2043 | "url": "https://github.com/sebastianbergmann", 2044 | "type": "github" 2045 | } 2046 | ], 2047 | "time": "2020-10-26T13:14:26+00:00" 2048 | }, 2049 | { 2050 | "name": "sebastian/recursion-context", 2051 | "version": "4.0.5", 2052 | "source": { 2053 | "type": "git", 2054 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2055 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 2056 | }, 2057 | "dist": { 2058 | "type": "zip", 2059 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 2060 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 2061 | "shasum": "" 2062 | }, 2063 | "require": { 2064 | "php": ">=7.3" 2065 | }, 2066 | "require-dev": { 2067 | "phpunit/phpunit": "^9.3" 2068 | }, 2069 | "type": "library", 2070 | "extra": { 2071 | "branch-alias": { 2072 | "dev-master": "4.0-dev" 2073 | } 2074 | }, 2075 | "autoload": { 2076 | "classmap": [ 2077 | "src/" 2078 | ] 2079 | }, 2080 | "notification-url": "https://packagist.org/downloads/", 2081 | "license": [ 2082 | "BSD-3-Clause" 2083 | ], 2084 | "authors": [ 2085 | { 2086 | "name": "Sebastian Bergmann", 2087 | "email": "sebastian@phpunit.de" 2088 | }, 2089 | { 2090 | "name": "Jeff Welch", 2091 | "email": "whatthejeff@gmail.com" 2092 | }, 2093 | { 2094 | "name": "Adam Harvey", 2095 | "email": "aharvey@php.net" 2096 | } 2097 | ], 2098 | "description": "Provides functionality to recursively process PHP variables", 2099 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 2100 | "support": { 2101 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2102 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 2103 | }, 2104 | "funding": [ 2105 | { 2106 | "url": "https://github.com/sebastianbergmann", 2107 | "type": "github" 2108 | } 2109 | ], 2110 | "time": "2023-02-03T06:07:39+00:00" 2111 | }, 2112 | { 2113 | "name": "sebastian/resource-operations", 2114 | "version": "3.0.4", 2115 | "source": { 2116 | "type": "git", 2117 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2118 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" 2119 | }, 2120 | "dist": { 2121 | "type": "zip", 2122 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 2123 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 2124 | "shasum": "" 2125 | }, 2126 | "require": { 2127 | "php": ">=7.3" 2128 | }, 2129 | "require-dev": { 2130 | "phpunit/phpunit": "^9.0" 2131 | }, 2132 | "type": "library", 2133 | "extra": { 2134 | "branch-alias": { 2135 | "dev-main": "3.0-dev" 2136 | } 2137 | }, 2138 | "autoload": { 2139 | "classmap": [ 2140 | "src/" 2141 | ] 2142 | }, 2143 | "notification-url": "https://packagist.org/downloads/", 2144 | "license": [ 2145 | "BSD-3-Clause" 2146 | ], 2147 | "authors": [ 2148 | { 2149 | "name": "Sebastian Bergmann", 2150 | "email": "sebastian@phpunit.de" 2151 | } 2152 | ], 2153 | "description": "Provides a list of PHP built-in functions that operate on resources", 2154 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2155 | "support": { 2156 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" 2157 | }, 2158 | "funding": [ 2159 | { 2160 | "url": "https://github.com/sebastianbergmann", 2161 | "type": "github" 2162 | } 2163 | ], 2164 | "time": "2024-03-14T16:00:52+00:00" 2165 | }, 2166 | { 2167 | "name": "sebastian/type", 2168 | "version": "3.2.1", 2169 | "source": { 2170 | "type": "git", 2171 | "url": "https://github.com/sebastianbergmann/type.git", 2172 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 2173 | }, 2174 | "dist": { 2175 | "type": "zip", 2176 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 2177 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 2178 | "shasum": "" 2179 | }, 2180 | "require": { 2181 | "php": ">=7.3" 2182 | }, 2183 | "require-dev": { 2184 | "phpunit/phpunit": "^9.5" 2185 | }, 2186 | "type": "library", 2187 | "extra": { 2188 | "branch-alias": { 2189 | "dev-master": "3.2-dev" 2190 | } 2191 | }, 2192 | "autoload": { 2193 | "classmap": [ 2194 | "src/" 2195 | ] 2196 | }, 2197 | "notification-url": "https://packagist.org/downloads/", 2198 | "license": [ 2199 | "BSD-3-Clause" 2200 | ], 2201 | "authors": [ 2202 | { 2203 | "name": "Sebastian Bergmann", 2204 | "email": "sebastian@phpunit.de", 2205 | "role": "lead" 2206 | } 2207 | ], 2208 | "description": "Collection of value objects that represent the types of the PHP type system", 2209 | "homepage": "https://github.com/sebastianbergmann/type", 2210 | "support": { 2211 | "issues": "https://github.com/sebastianbergmann/type/issues", 2212 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 2213 | }, 2214 | "funding": [ 2215 | { 2216 | "url": "https://github.com/sebastianbergmann", 2217 | "type": "github" 2218 | } 2219 | ], 2220 | "time": "2023-02-03T06:13:03+00:00" 2221 | }, 2222 | { 2223 | "name": "sebastian/version", 2224 | "version": "3.0.2", 2225 | "source": { 2226 | "type": "git", 2227 | "url": "https://github.com/sebastianbergmann/version.git", 2228 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2229 | }, 2230 | "dist": { 2231 | "type": "zip", 2232 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2233 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2234 | "shasum": "" 2235 | }, 2236 | "require": { 2237 | "php": ">=7.3" 2238 | }, 2239 | "type": "library", 2240 | "extra": { 2241 | "branch-alias": { 2242 | "dev-master": "3.0-dev" 2243 | } 2244 | }, 2245 | "autoload": { 2246 | "classmap": [ 2247 | "src/" 2248 | ] 2249 | }, 2250 | "notification-url": "https://packagist.org/downloads/", 2251 | "license": [ 2252 | "BSD-3-Clause" 2253 | ], 2254 | "authors": [ 2255 | { 2256 | "name": "Sebastian Bergmann", 2257 | "email": "sebastian@phpunit.de", 2258 | "role": "lead" 2259 | } 2260 | ], 2261 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2262 | "homepage": "https://github.com/sebastianbergmann/version", 2263 | "support": { 2264 | "issues": "https://github.com/sebastianbergmann/version/issues", 2265 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2266 | }, 2267 | "funding": [ 2268 | { 2269 | "url": "https://github.com/sebastianbergmann", 2270 | "type": "github" 2271 | } 2272 | ], 2273 | "time": "2020-09-28T06:39:44+00:00" 2274 | }, 2275 | { 2276 | "name": "squizlabs/php_codesniffer", 2277 | "version": "3.10.1", 2278 | "source": { 2279 | "type": "git", 2280 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 2281 | "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" 2282 | }, 2283 | "dist": { 2284 | "type": "zip", 2285 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", 2286 | "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", 2287 | "shasum": "" 2288 | }, 2289 | "require": { 2290 | "ext-simplexml": "*", 2291 | "ext-tokenizer": "*", 2292 | "ext-xmlwriter": "*", 2293 | "php": ">=5.4.0" 2294 | }, 2295 | "require-dev": { 2296 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" 2297 | }, 2298 | "bin": [ 2299 | "bin/phpcbf", 2300 | "bin/phpcs" 2301 | ], 2302 | "type": "library", 2303 | "extra": { 2304 | "branch-alias": { 2305 | "dev-master": "3.x-dev" 2306 | } 2307 | }, 2308 | "notification-url": "https://packagist.org/downloads/", 2309 | "license": [ 2310 | "BSD-3-Clause" 2311 | ], 2312 | "authors": [ 2313 | { 2314 | "name": "Greg Sherwood", 2315 | "role": "Former lead" 2316 | }, 2317 | { 2318 | "name": "Juliette Reinders Folmer", 2319 | "role": "Current lead" 2320 | }, 2321 | { 2322 | "name": "Contributors", 2323 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 2324 | } 2325 | ], 2326 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2327 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2328 | "keywords": [ 2329 | "phpcs", 2330 | "standards", 2331 | "static analysis" 2332 | ], 2333 | "support": { 2334 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 2335 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 2336 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 2337 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 2338 | }, 2339 | "funding": [ 2340 | { 2341 | "url": "https://github.com/PHPCSStandards", 2342 | "type": "github" 2343 | }, 2344 | { 2345 | "url": "https://github.com/jrfnl", 2346 | "type": "github" 2347 | }, 2348 | { 2349 | "url": "https://opencollective.com/php_codesniffer", 2350 | "type": "open_collective" 2351 | } 2352 | ], 2353 | "time": "2024-05-22T21:24:41+00:00" 2354 | }, 2355 | { 2356 | "name": "theseer/tokenizer", 2357 | "version": "1.2.3", 2358 | "source": { 2359 | "type": "git", 2360 | "url": "https://github.com/theseer/tokenizer.git", 2361 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 2362 | }, 2363 | "dist": { 2364 | "type": "zip", 2365 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 2366 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 2367 | "shasum": "" 2368 | }, 2369 | "require": { 2370 | "ext-dom": "*", 2371 | "ext-tokenizer": "*", 2372 | "ext-xmlwriter": "*", 2373 | "php": "^7.2 || ^8.0" 2374 | }, 2375 | "type": "library", 2376 | "autoload": { 2377 | "classmap": [ 2378 | "src/" 2379 | ] 2380 | }, 2381 | "notification-url": "https://packagist.org/downloads/", 2382 | "license": [ 2383 | "BSD-3-Clause" 2384 | ], 2385 | "authors": [ 2386 | { 2387 | "name": "Arne Blankerts", 2388 | "email": "arne@blankerts.de", 2389 | "role": "Developer" 2390 | } 2391 | ], 2392 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2393 | "support": { 2394 | "issues": "https://github.com/theseer/tokenizer/issues", 2395 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 2396 | }, 2397 | "funding": [ 2398 | { 2399 | "url": "https://github.com/theseer", 2400 | "type": "github" 2401 | } 2402 | ], 2403 | "time": "2024-03-03T12:36:25+00:00" 2404 | }, 2405 | { 2406 | "name": "wp-coding-standards/wpcs", 2407 | "version": "3.1.0", 2408 | "source": { 2409 | "type": "git", 2410 | "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", 2411 | "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7" 2412 | }, 2413 | "dist": { 2414 | "type": "zip", 2415 | "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7", 2416 | "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7", 2417 | "shasum": "" 2418 | }, 2419 | "require": { 2420 | "ext-filter": "*", 2421 | "ext-libxml": "*", 2422 | "ext-tokenizer": "*", 2423 | "ext-xmlreader": "*", 2424 | "php": ">=5.4", 2425 | "phpcsstandards/phpcsextra": "^1.2.1", 2426 | "phpcsstandards/phpcsutils": "^1.0.10", 2427 | "squizlabs/php_codesniffer": "^3.9.0" 2428 | }, 2429 | "require-dev": { 2430 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 2431 | "php-parallel-lint/php-parallel-lint": "^1.3.2", 2432 | "phpcompatibility/php-compatibility": "^9.0", 2433 | "phpcsstandards/phpcsdevtools": "^1.2.0", 2434 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" 2435 | }, 2436 | "suggest": { 2437 | "ext-iconv": "For improved results", 2438 | "ext-mbstring": "For improved results" 2439 | }, 2440 | "type": "phpcodesniffer-standard", 2441 | "notification-url": "https://packagist.org/downloads/", 2442 | "license": [ 2443 | "MIT" 2444 | ], 2445 | "authors": [ 2446 | { 2447 | "name": "Contributors", 2448 | "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" 2449 | } 2450 | ], 2451 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", 2452 | "keywords": [ 2453 | "phpcs", 2454 | "standards", 2455 | "static analysis", 2456 | "wordpress" 2457 | ], 2458 | "support": { 2459 | "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", 2460 | "source": "https://github.com/WordPress/WordPress-Coding-Standards", 2461 | "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" 2462 | }, 2463 | "funding": [ 2464 | { 2465 | "url": "https://opencollective.com/php_codesniffer", 2466 | "type": "custom" 2467 | } 2468 | ], 2469 | "time": "2024-03-25T16:39:00+00:00" 2470 | }, 2471 | { 2472 | "name": "wp-phpunit/wp-phpunit", 2473 | "version": "6.7.1", 2474 | "source": { 2475 | "type": "git", 2476 | "url": "https://github.com/wp-phpunit/wp-phpunit.git", 2477 | "reference": "e63eb1c0980839853c569d3f04ff70263b7795e3" 2478 | }, 2479 | "dist": { 2480 | "type": "zip", 2481 | "url": "https://api.github.com/repos/wp-phpunit/wp-phpunit/zipball/e63eb1c0980839853c569d3f04ff70263b7795e3", 2482 | "reference": "e63eb1c0980839853c569d3f04ff70263b7795e3", 2483 | "shasum": "" 2484 | }, 2485 | "type": "library", 2486 | "autoload": { 2487 | "files": [ 2488 | "__loaded.php" 2489 | ] 2490 | }, 2491 | "notification-url": "https://packagist.org/downloads/", 2492 | "license": [ 2493 | "GPL-2.0-or-later" 2494 | ], 2495 | "authors": [ 2496 | { 2497 | "name": "Evan Mattson", 2498 | "email": "me@aaemnnost.tv" 2499 | }, 2500 | { 2501 | "name": "WordPress Community", 2502 | "homepage": "https://wordpress.org/about/" 2503 | } 2504 | ], 2505 | "description": "WordPress core PHPUnit library", 2506 | "homepage": "https://github.com/wp-phpunit", 2507 | "keywords": [ 2508 | "phpunit", 2509 | "test", 2510 | "wordpress" 2511 | ], 2512 | "support": { 2513 | "docs": "https://github.com/wp-phpunit/docs", 2514 | "issues": "https://github.com/wp-phpunit/issues", 2515 | "source": "https://github.com/wp-phpunit/wp-phpunit" 2516 | }, 2517 | "time": "2024-11-22T01:27:46+00:00" 2518 | }, 2519 | { 2520 | "name": "wpackagist-plugin/contact-form-7", 2521 | "version": "6.0.1", 2522 | "source": { 2523 | "type": "svn", 2524 | "url": "https://plugins.svn.wordpress.org/contact-form-7/", 2525 | "reference": "tags/6.0.1" 2526 | }, 2527 | "dist": { 2528 | "type": "zip", 2529 | "url": "https://downloads.wordpress.org/plugin/contact-form-7.6.0.1.zip" 2530 | }, 2531 | "require": { 2532 | "composer/installers": "^1.0 || ^2.0" 2533 | }, 2534 | "type": "wordpress-plugin", 2535 | "homepage": "https://wordpress.org/plugins/contact-form-7/" 2536 | }, 2537 | { 2538 | "name": "wpackagist-plugin/query-monitor", 2539 | "version": "3.17.0", 2540 | "source": { 2541 | "type": "svn", 2542 | "url": "https://plugins.svn.wordpress.org/query-monitor/", 2543 | "reference": "tags/3.17.0" 2544 | }, 2545 | "dist": { 2546 | "type": "zip", 2547 | "url": "https://downloads.wordpress.org/plugin/query-monitor.3.17.0.zip" 2548 | }, 2549 | "require": { 2550 | "composer/installers": "^1.0 || ^2.0" 2551 | }, 2552 | "type": "wordpress-plugin", 2553 | "homepage": "https://wordpress.org/plugins/query-monitor/" 2554 | }, 2555 | { 2556 | "name": "wpackagist-plugin/tablepress", 2557 | "version": "3.0.1", 2558 | "source": { 2559 | "type": "svn", 2560 | "url": "https://plugins.svn.wordpress.org/tablepress/", 2561 | "reference": "tags/3.0.1" 2562 | }, 2563 | "dist": { 2564 | "type": "zip", 2565 | "url": "https://downloads.wordpress.org/plugin/tablepress.3.0.1.zip" 2566 | }, 2567 | "require": { 2568 | "composer/installers": "^1.0 || ^2.0" 2569 | }, 2570 | "type": "wordpress-plugin", 2571 | "homepage": "https://wordpress.org/plugins/tablepress/" 2572 | }, 2573 | { 2574 | "name": "wpackagist-plugin/wp-mail-debugger", 2575 | "version": "1.1", 2576 | "source": { 2577 | "type": "svn", 2578 | "url": "https://plugins.svn.wordpress.org/wp-mail-debugger/", 2579 | "reference": "tags/1.1" 2580 | }, 2581 | "dist": { 2582 | "type": "zip", 2583 | "url": "https://downloads.wordpress.org/plugin/wp-mail-debugger.1.1.zip" 2584 | }, 2585 | "require": { 2586 | "composer/installers": "^1.0 || ^2.0" 2587 | }, 2588 | "type": "wordpress-plugin", 2589 | "homepage": "https://wordpress.org/plugins/wp-mail-debugger/" 2590 | }, 2591 | { 2592 | "name": "wpackagist-theme/twentytwentyfive", 2593 | "version": "1.0", 2594 | "source": { 2595 | "type": "svn", 2596 | "url": "https://themes.svn.wordpress.org/twentytwentyfive/", 2597 | "reference": "1.0" 2598 | }, 2599 | "dist": { 2600 | "type": "zip", 2601 | "url": "https://downloads.wordpress.org/theme/twentytwentyfive.1.0.zip" 2602 | }, 2603 | "require": { 2604 | "composer/installers": "^1.0 || ^2.0" 2605 | }, 2606 | "type": "wordpress-theme", 2607 | "homepage": "https://wordpress.org/themes/twentytwentyfive/" 2608 | }, 2609 | { 2610 | "name": "yoast/phpunit-polyfills", 2611 | "version": "3.0.0", 2612 | "source": { 2613 | "type": "git", 2614 | "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", 2615 | "reference": "19e6d5fb8aad31f731f774f9646a10c64a8843d2" 2616 | }, 2617 | "dist": { 2618 | "type": "zip", 2619 | "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/19e6d5fb8aad31f731f774f9646a10c64a8843d2", 2620 | "reference": "19e6d5fb8aad31f731f774f9646a10c64a8843d2", 2621 | "shasum": "" 2622 | }, 2623 | "require": { 2624 | "php": ">=7.0", 2625 | "phpunit/phpunit": "^6.4.4 || ^7.0 || ^8.0 || ^9.0 || ^11.0" 2626 | }, 2627 | "require-dev": { 2628 | "php-parallel-lint/php-console-highlighter": "^1.0.0", 2629 | "php-parallel-lint/php-parallel-lint": "^1.4.0", 2630 | "yoast/yoastcs": "^3.1.0" 2631 | }, 2632 | "type": "library", 2633 | "extra": { 2634 | "branch-alias": { 2635 | "dev-main": "3.x-dev" 2636 | } 2637 | }, 2638 | "autoload": { 2639 | "files": [ 2640 | "phpunitpolyfills-autoload.php" 2641 | ] 2642 | }, 2643 | "notification-url": "https://packagist.org/downloads/", 2644 | "license": [ 2645 | "BSD-3-Clause" 2646 | ], 2647 | "authors": [ 2648 | { 2649 | "name": "Team Yoast", 2650 | "email": "support@yoast.com", 2651 | "homepage": "https://yoast.com" 2652 | }, 2653 | { 2654 | "name": "Contributors", 2655 | "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" 2656 | } 2657 | ], 2658 | "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", 2659 | "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", 2660 | "keywords": [ 2661 | "phpunit", 2662 | "polyfill", 2663 | "testing" 2664 | ], 2665 | "support": { 2666 | "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", 2667 | "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy", 2668 | "source": "https://github.com/Yoast/PHPUnit-Polyfills" 2669 | }, 2670 | "time": "2024-09-07T00:24:25+00:00" 2671 | } 2672 | ], 2673 | "aliases": [], 2674 | "minimum-stability": "stable", 2675 | "stability-flags": {}, 2676 | "prefer-stable": false, 2677 | "prefer-lowest": false, 2678 | "platform": {}, 2679 | "platform-dev": {}, 2680 | "plugin-api-version": "2.6.0" 2681 | } 2682 | --------------------------------------------------------------------------------