From ad5d66bd966e8988d80badf6f692a62839ad3eee Mon Sep 17 00:00:00 2001 From: Frugan Date: Wed, 30 Oct 2024 12:48:11 +0100 Subject: [PATCH] refactor!: change plugin permalink to meet WordPress Plugin Directory requirements - Modify plugin permalink structure as requested by WordPress.org reviewers - Update code to comply with wpackagist-plugin/plugin-check standards - Migrate from deprecated acf-field-type-template to official acf-example-field-type - Add ACF check during plugin activation - Integrate Wonolog ^2.x for improved logging capabilities - Move translations management to Crowdin platform BREAKING CHANGE: Plugin permalink has been changed to meet WordPress.org requirements BREAKING CHANGE: The plugin now requires ACF to be installed and active to work --- .env.dist | 1 + .github/CONTRIBUTING.md | 8 +- .github/SECURITY.md | 2 +- .wordpress-org/banner-1544x500.jpg | Bin 81211 -> 98592 bytes .wordpress-org/banner-772x250.jpg | Bin 29475 -> 36461 bytes CHANGELOG.md | 22 +- Makefile | 5 + README.md | 188 +- acf-uppy/acf-uppy.php | 44 - acf-uppy/lang/README.md | 5 - acf-uppy/readme.txt | 32 - acf-uppy/src/AcfUppy.php | 578 ---- acf-uppy/src/AcfUppyFieldV5.php | 464 --- acf-uppy/symlink/.htaccess | 19 - acf-uppy/tests/bootstrap.php | 12 - acf-uppy/tests/data/wp-cfm/default.json | 5 - acf-uppy/tests/stubs/constants.stub | 6 - build/front/package-lock.json | 2926 ++++++----------- build/front/package.json | 4 +- build/front/src/js/index.js | 520 ++- build/front/webpack.config.js | 4 +- docker-compose.yml | 4 +- .../.gitignore | 0 .../.php-cs-fixer.dist.php | 4 +- .../composer.json | 8 +- .../composer.lock | 1078 +++--- .../exclude_from.txt | 0 .../grumphp.yml.dist | 3 +- .../include_from.txt | 2 +- .../upload-field-with-uppy-for-acf-it_IT.mo | Bin 0 -> 2911 bytes .../upload-field-with-uppy-for-acf-it_IT.po | 117 + .../lang/upload-field-with-uppy-for-acf.pot | 111 + .../phpstan.neon.dist | 5 +- .../psalm.xml.dist | 0 upload-field-with-uppy-for-acf/readme.txt | 32 + .../rector.php | 2 +- .../src/Bootstrap.php | 120 + upload-field-with-uppy-for-acf/src/Field.php | 1070 ++++++ .../src/Middleware/Auth.php | 6 +- .../src/Middleware/UploadDir.php | 12 +- .../src/Middleware/UploadMetadata.php | 4 +- .../symlink/.gitignore | 0 .../tests/bootstrap.php | 6 +- .../tests/data/acf/default.json | 25 +- .../tests/data/wp-cfm/default.json | 7 + .../tests/phpunit.xml | 0 .../tests/stubs/constants.stub | 8 + .../tests/stubs/functions.stub | 25 + .../upload-field-with-uppy-for-acf.php | 44 + 49 files changed, 3616 insertions(+), 3922 deletions(-) delete mode 100644 acf-uppy/acf-uppy.php delete mode 100644 acf-uppy/lang/README.md delete mode 100644 acf-uppy/readme.txt delete mode 100644 acf-uppy/src/AcfUppy.php delete mode 100644 acf-uppy/src/AcfUppyFieldV5.php delete mode 100644 acf-uppy/symlink/.htaccess delete mode 100644 acf-uppy/tests/bootstrap.php delete mode 100644 acf-uppy/tests/data/wp-cfm/default.json delete mode 100644 acf-uppy/tests/stubs/constants.stub rename {acf-uppy => upload-field-with-uppy-for-acf}/.gitignore (100%) rename {acf-uppy => upload-field-with-uppy-for-acf}/.php-cs-fixer.dist.php (92%) rename {acf-uppy => upload-field-with-uppy-for-acf}/composer.json (92%) rename {acf-uppy => upload-field-with-uppy-for-acf}/composer.lock (90%) rename {acf-uppy => upload-field-with-uppy-for-acf}/exclude_from.txt (100%) rename {acf-uppy => upload-field-with-uppy-for-acf}/grumphp.yml.dist (95%) rename {acf-uppy => upload-field-with-uppy-for-acf}/include_from.txt (82%) create mode 100644 upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.mo create mode 100644 upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.po create mode 100644 upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf.pot rename {acf-uppy => upload-field-with-uppy-for-acf}/phpstan.neon.dist (89%) rename {acf-uppy => upload-field-with-uppy-for-acf}/psalm.xml.dist (100%) create mode 100644 upload-field-with-uppy-for-acf/readme.txt rename {acf-uppy => upload-field-with-uppy-for-acf}/rector.php (92%) create mode 100644 upload-field-with-uppy-for-acf/src/Bootstrap.php create mode 100644 upload-field-with-uppy-for-acf/src/Field.php rename {acf-uppy => upload-field-with-uppy-for-acf}/src/Middleware/Auth.php (70%) rename {acf-uppy => upload-field-with-uppy-for-acf}/src/Middleware/UploadDir.php (80%) rename {acf-uppy => upload-field-with-uppy-for-acf}/src/Middleware/UploadMetadata.php (93%) rename {acf-uppy => upload-field-with-uppy-for-acf}/symlink/.gitignore (100%) rename acf-uppy/src/Exception/ReadErrorException.php => upload-field-with-uppy-for-acf/tests/bootstrap.php (54%) rename {acf-uppy => upload-field-with-uppy-for-acf}/tests/data/acf/default.json (76%) create mode 100644 upload-field-with-uppy-for-acf/tests/data/wp-cfm/default.json rename {acf-uppy => upload-field-with-uppy-for-acf}/tests/phpunit.xml (100%) create mode 100644 upload-field-with-uppy-for-acf/tests/stubs/constants.stub create mode 100644 upload-field-with-uppy-for-acf/tests/stubs/functions.stub create mode 100644 upload-field-with-uppy-for-acf/upload-field-with-uppy-for-acf.php diff --git a/.env.dist b/.env.dist index 22513e5..3a2b73b 100644 --- a/.env.dist +++ b/.env.dist @@ -16,6 +16,7 @@ MARIADB_DATABASE=wordpress # 6.3.2 -> 25 Gennaio 2024, PHP 8.2.12, Composer 2.6.5 # 6.5.4 -> 5 Giugno 2024, PHP 8.2.20, Composer 2.7.7 # 6.6.1 -> 31 Luglio 2024, PHP 8.2.22, Composer 2.7.7 +# 6.6.2 -> 24 Ottobre 2024, PHP 8.2.25, Composer 2.8.1 # ankitpokhrel/tus-php:^2.4 requires PHP >= 8.x # jameelmoses/wordpress-kint-debugger:^2.0 requires PHP >= 8.x WORDPRESS_TAG=latest diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index dbedb11..d6a9239 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -11,14 +11,14 @@ To set up a development environment, please follow these steps: 1. Clone the repo ```sh - git clone https://github.com/frugan-dev/acf-uppy + git clone https://github.com/frugan-dev/upload-field-with-uppy-for-acf ``` 2. TODO ## Issues and feature requests -You've found a bug in the source code, a mistake in the documentation or maybe you'd like a new feature? Take a look at [GitHub Discussions](https://github.com/frugan-dev/acf-uppy/discussions) to see if it's already being discussed. You can help us by [submitting an issue on GitHub](https://github.com/frugan-dev/acf-uppy/issues). Before you create an issue, make sure to search the issue archive -- your issue may have already been addressed! +You've found a bug in the source code, a mistake in the documentation or maybe you'd like a new feature? Take a look at [GitHub Discussions](https://github.com/frugan-dev/upload-field-with-uppy-for-acf/discussions) to see if it's already being discussed. You can help us by [submitting an issue on GitHub](https://github.com/frugan-dev/upload-field-with-uppy-for-acf/issues). Before you create an issue, make sure to search the issue archive -- your issue may have already been addressed! Please try to create bug reports that are: @@ -32,10 +32,10 @@ Please try to create bug reports that are: ### How to submit a Pull Request 1. Search our repository for open or closed - [Pull Requests](https://github.com/frugan-dev/acf-uppy/pulls) + [Pull Requests](https://github.com/frugan-dev/upload-field-with-uppy-for-acf/pulls) that relate to your submission. You don't want to duplicate effort. 2. Fork the project 3. Create your feature branch (`git checkout -b feat/amazing_feature`) 4. Commit your changes (`git commit -m 'feat: add amazing_feature'`) uses [conventional commits](https://www.conventionalcommits.org), so please follow the specification in your commit messages. 5. Push to the branch (`git push origin feat/amazing_feature`) -6. [Open a Pull Request](https://github.com/frugan-dev/acf-uppy/compare?expand=1) \ No newline at end of file +6. [Open a Pull Request](https://github.com/frugan-dev/upload-field-with-uppy-for-acf/compare?expand=1) \ No newline at end of file diff --git a/.github/SECURITY.md b/.github/SECURITY.md index ec9e335..ec691e0 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -2,7 +2,7 @@ ## Reporting a Vulnerability -If there are any vulnerabilities in **acf-uppy**, don't hesitate to _report them_. +If there are any vulnerabilities in **upload-field-with-uppy-for-acf**, don't hesitate to _report them_. 1. Use any of the [private contact addresses](https://github.com/frugan-dev). 2. Describe the vulnerability. diff --git a/.wordpress-org/banner-1544x500.jpg b/.wordpress-org/banner-1544x500.jpg index a947b47de317bc792cb8d6c20ee2b282075c7300..14eb11d190f802bb9c3b8a1f65e8563bee9d907b 100644 GIT binary patch literal 98592 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

LbZWnwT&j$Tnr=u;cULnZ!Ob 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 VYn|c1$lkuRUlu$?1*`rm|JgnEHg5m` literal 81211 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⪙#Qc&+IB+cT(IsE_Cs4- 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 M94i#B_LEuv*=b=+ga7~l diff --git a/.wordpress-org/banner-772x250.jpg b/.wordpress-org/banner-772x250.jpg index 4da6e4fd81dff3f41b8d19507e486d3f8ab6b50f..70eaa3d5b33d6e54d76fa2b5fe12c001d68c7cb3 100644 GIT binary patch literal 36461 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 z zrzjbP&h@r~EM28Fo|IRA$5mfBE3$H4M;{%RB#52`-X7zC^|g?2yuIiGxpvC{K3I~} z)sI^cz}2K|vN;U<))ye%3GXb)in<0MwU0j{BExNm(y;cOcu}!Bbir_zVEqH2Oid{T zZo{dECk&W;7EVEEabN-~dbeSniuM zFUdvvUYF~K-|K3WdbN--d|6PAi!ZRJ-lonK87B38_OkZ44#NGO8mb*mUn94==^d^8 z5WioV#l_$`S}VqSQ2Jw)7=1Wez{~-X|<2|H5vfMZ(xhgGc640V86#ViYifs)`MlcxQ8>J)?#p@y~R9z{?Vi>YAZ_ ziDesgqCL8oub|Jq5mb1aa=S+qPk5J9_uMEhjt@^58uJUuwAK~F_=C#w8=K^CWB0kwk$0^nD2Gphy|vH)>p6|VrZH+qo0#0hM8cd{De-i zq4bHcWQ6SD=w*nK^ML_YI}1C@QC!G2Kf?eC)GSte*jZuc#VE@ocE$GbebU0hYMxTWM; zLHJHj2N7S)%1um?dF8l&b!u;{363U$&xaGd?b*_MOBONIwYr0DH)rqEZUMnbFo1E^3h^WMxQ3WjPQnJ?i-pYvpcsQ-<^qc6*)JwSv`ui!1kX_`d=W0`L7P?+Egy zJD<54RT8ijQQWf5t+3#zO)kwxN>U6LsdD2=rZ*V{O^)Yl zk-D%0g-k_qSU{kLJC#h+62Utyj zVocnsql6JSQ4_WbI8)0hBw@T0C!>&*Vzm!2HA-1?0YS3!Q|=HL`4!wkD7)CPl#K3KMAj+Px&RlvN@x#g^4GYi zQEW?A-x1jB$NTkrF?38h`zbBr>w#{exPozk{{WziZNCl!Chstc-q-ZTEf;$^ggZxs z6ZieTlnAAr8JbR|+@KNBe>H*5Tx9~4X{{YCVHl<%L!d}D*fI2XOQCRrj=4m>?gNku6Pc=1of-zFwBWwOq GfB)H!3aa`5 literal 29475 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 y{7O5}w7DVyC -# ACF Uppy Field (WordPress Plugin) +# Upload Field with Uppy for ACF (WordPress Plugin) -__ACF Uppy Field__ is a WordPress plugin that adds a new `Uppy` custom field to the list of fields of the [Advanced Custom Fields](https://www.advancedcustomfields.com) plugin. This custom field allows you to __upload files of all types and sizes__ using the [TUS protocol](https://tus.io) and the [Uppy JS uploader](https://uppy.io), overcoming the limitations of the default ACF `File` field. With __ACF Uppy Field__, you no longer need to increase server-side INI parameters such as `upload_max_filesize`, `post_max_size`, `max_execution_time` and `memory_limit`. +__Upload Field with Uppy for ACF__ is a WordPress plugin that adds a new `Uppy` custom field to the list of fields of the [Advanced Custom Fields](https://www.advancedcustomfields.com) plugin. This custom field allows you to __upload files of all types and sizes__ using the [TUS protocol](https://tus.io) and the [Uppy JS uploader](https://uppy.io), overcoming the limitations of the default ACF `File` field. With __Upload Field with Uppy for ACF__, you no longer need to increase server-side INI parameters such as `upload_max_filesize`, `post_max_size`, `max_execution_time` and `memory_limit`. ![](docs/asset/demo.gif) @@ -28,23 +28,25 @@ __ACF Uppy Field__ is a WordPress plugin that adds a new `Uppy` custom field to _Note:_ _* If you need to support older versions of PHP use [v1.x](../../tree/support/v1.x)._ -_** If your environment doesn't support APCu, you can try setting the cache to `file` with the `acf_uppy/cache` filter, although `file` is not recommended in production (see [here](https://github.com/ankitpokhrel/tus-php/issues/408#issuecomment-1250229371))._ +_** If your environment doesn't support APCu, you can try setting the cache to `file` with the `uppy_field_for_acf/cache` filter, although `file` is not recommended in production (see [here](https://github.com/ankitpokhrel/tus-php/issues/408#issuecomment-1250229371))._ ## Features -- use official [Advanced Custom Fields - Field Type Template](https://github.com/AdvancedCustomFields/acf-field-type-template) +- no limits by default for upload file size and types +- support setting per-field size limit, mime-types and upload path +- support uploads outside public directory (for private files) +- download file using symlinks (no memory problems with large downloads) +- many WP hooks available - use [TUS protocol](https://tus.io) - use [Uppy JS uploader](https://uppy.io) +- use official [ACF Example Field Type](https://github.com/AdvancedCustomFields/acf-example-field-type) +- support for logging with [Wonolog](https://github.com/inpsyde/Wonolog) ^2.x, if available - made with [Vanilla JS](http://vanilla-js.com) (no jQuery) - autoload classes with Composer and PSR-4 - assets built with Webpack - support ACF nested repeater -- no limits by default for upload file size and types -- support setting per-field size limit, mime-types and upload path -- support uploads outside public directory (for private files) -- download file using symlinks (no memory problems with large downloads) -- many WP hooks available +- translations managed via [Crowdin](https://crowdin.com/project/upload-field-with-uppy-for-acf) ## Installation @@ -75,7 +77,7 @@ If you use Composer to manage WordPress plugins, you can install it from [WordPr { "require": { "composer/installers": "^1.0 || ^2.0", - "wpackagist-plugin/acf-uppy": "^2.1" + "wpackagist-plugin/upload-field-with-uppy-for-acf": "^3.0" }, "extra": { "installer-paths": { @@ -111,17 +113,17 @@ If you use Composer to manage WordPress plugins, you can install it from this re { "require": { "composer/installers": "^1.0 || ^2.0", - "frugan-dev/acf-uppy": "^2.1" + "frugan-dev/upload-field-with-uppy-for-acf": "^3.0" }, "repositories": [ { "type": "package", "package": { - "name": "frugan-dev/acf-uppy", - "version": "2.1.0", + "name": "frugan-dev/upload-field-with-uppy-for-acf", + "version": "3.0.0", "type": "wordpress-plugin", "dist": { - "url": "https://github.com/frugan-dev/acf-uppy/releases/download/v2.1.0/acf-uppy.zip", + "url": "https://github.com/frugan-dev/upload-field-with-uppy-for-acf/releases/download/v3.0.0/upload-field-with-uppy-for-acf.zip", "type": "zip" } } @@ -156,105 +158,115 @@ Once installed: 2. Create a new field via ACF and select the `Uppy` type. 3. Read the description above for advanced usage instructions. +### Enabling Cache Busting + +If you use filename-based cache busting, the plugin supports the following definition in `wp-config.php`: + +```php +define('FRUGAN_UFWUFACF_CACHE_BUSTING_ENABLED', true); +``` + +For more information, see filename-based cache busting on [Nginx](https://github.com/h5bp/server-configs-nginx/blob/main/h5bp/location/web_performance_filename-based_cache_busting.conf) and [Apache](https://github.com/h5bp/server-configs-apache/blob/main/h5bp/web_performance/filename-based_cache_busting.conf). + ## Actions

-acf_uppy/download_fallback +uppy_field_for_acf/download_fallback ```php -do_action( 'acf_uppy/download_fallback', $postId ); +do_action( 'uppy_field_for_acf/download_fallback', $postId ); ``` -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_.
-acf_uppy/download_fallback/type={$postType} +uppy_field_for_acf/download_fallback/type={$postType} ```php -do_action( 'acf_uppy/download_fallback/type={$postType}', $postId ); +do_action( 'uppy_field_for_acf/download_fallback/type={$postType}', $postId ); ``` -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. -- `$postType` _(string)_: The type of the post containing _ACF Uppy Field_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_. +- `$postType` _(string)_: The type of the post containing _Upload Field with Uppy for ACF_.
## Filters
-acf_uppy/dest_path +uppy_field_for_acf/dest_path ```php -apply_filters( 'acf_uppy/dest_path', $destPath ); +apply_filters( 'uppy_field_for_acf/dest_path', $dest_path ); ``` -- `$destPath` _(string)_: The file destination absolute base path. -Default: `{ABSPATH}wp-content/uploads/acf-uppy`. +- `$dest_path` _(string)_: The file destination absolute base path. +Default: `{ABSPATH}wp-content/uploads/upload-field-with-uppy-for-acf`.
-acf_uppy/dest_path/type={$postType} +uppy_field_for_acf/dest_path/type={$postType} ```php -apply_filters( 'acf_uppy/dest_path/type={$postType}', $destPath, $postId, $field ); +apply_filters( 'uppy_field_for_acf/dest_path/type={$postType}', $dest_path, $postId, $field ); ``` -- `$destPath` _(string)_: The file destination absolute base path. -Default: `{ABSPATH}wp-content/uploads/acf-uppy`. -- `$postType` _(string)_: The type of the post containing _ACF Uppy Field_. -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. +- `$dest_path` _(string)_: The file destination absolute base path. +Default: `{ABSPATH}wp-content/uploads/upload-field-with-uppy-for-acf`. +- `$postType` _(string)_: The type of the post containing _Upload Field with Uppy for ACF_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_. - `$field` _(array)_: The field array holding all the field options.
-acf_uppy/tmp_path +uppy_field_for_acf/tmp_path ```php -apply_filters( 'acf_uppy/tmp_path', $tmpPath ); +apply_filters( 'uppy_field_for_acf/tmp_path', $tmp_path ); ``` -- `$tmpPath` _(string)_: The file temporary absolute path. -Default: `{sys_get_temp_dir()}/acf-uppy/{get_current_user_id()}`. +- `$tmp_path` _(string)_: The file temporary absolute path. +Default: `{sys_get_temp_dir()}/upload-field-with-uppy-for-acf/{get_current_user_id()}`.
-acf_uppy/symlink_url +uppy_field_for_acf/symlink_url ```php -apply_filters( 'acf_uppy/symlink_url', $symlinkUrl ); +apply_filters( 'uppy_field_for_acf/symlink_url', $symlink_url ); ``` -- `$symlinkUrl` _(string)_: The symlinks absolute base url. -Default: `{site_url()}/wp-content/plugins/acf-uppy/symlink`. +- `$symlink_url` _(string)_: The symlinks absolute base url. +Default: `{site_url()}/wp-content/plugins/upload-field-with-uppy-for-acf/symlink`.
-acf_uppy/symlink_path +uppy_field_for_acf/symlink_path ```php -apply_filters( 'acf_uppy/symlink_path', $symlinkPath ); +apply_filters( 'uppy_field_for_acf/symlink_path', $symlink_path ); ``` -- `$symlinkPath` _(string)_: The symlinks absolute base path. -Default: `{ABSPATH}wp-content/plugins/acf-uppy/symlink`. +- `$symlink_path` _(string)_: The symlinks absolute base path. +Default: `{ABSPATH}wp-content/plugins/upload-field-with-uppy-for-acf/symlink`.
-acf_uppy/base_path +uppy_field_for_acf/base_path ```php -apply_filters( 'acf_uppy/base_path', $basePath ); +apply_filters( 'uppy_field_for_acf/base_path', $basePath ); ``` - `$basePath` _(string)_: The base url endpoint. -Default: `acf-uppy`. +Default: `upload-field-with-uppy-for-acf`.
-acf_uppy/api_path +uppy_field_for_acf/api_path ```php -apply_filters( 'acf_uppy/api_path', $apiPath ); +apply_filters( 'uppy_field_for_acf/api_path', $apiPath ); ``` - `$apiPath` _(string)_: The TUS base url endpoint. Default: `wp-tus`. @@ -262,10 +274,10 @@ Default: `wp-tus`.
-acf_uppy/cache +uppy_field_for_acf/cache ```php -apply_filters( 'acf_uppy/cache', $cacheType ); +apply_filters( 'uppy_field_for_acf/cache', $cacheType ); ``` - `$cacheType` _(string)_: The TUS cache type. Options: `redis`, `apcu` or `file`. @@ -274,98 +286,98 @@ Default: `apcu`.
-acf_uppy/cache_ttl +uppy_field_for_acf/cache_ttl ```php -apply_filters( 'acf_uppy/cache_ttl', $cacheTtl ); +apply_filters( 'uppy_field_for_acf/cache_ttl', $cache_ttl ); ``` -- `$cacheTtl` _(string)_: The TUS cache TTL in secs. +- `$cache_ttl` _(string)_: The TUS cache TTL in secs. Default: `86400`.
-acf_uppy/file_name_exists +uppy_field_for_acf/file_name_exists ```php -apply_filters( 'acf_uppy/file_name_exists', $fileName, $destPath, $pathinfo, $counter ); +apply_filters( 'uppy_field_for_acf/file_name_exists', $fileName, $dest_path, $pathinfo, $counter ); ``` - `$fileName` _(string)_: The file name renamed. Default: `{$pathinfo['filename']}-{$counter}.{$pathinfo['extension']}`. -- `$destPath` _(string)_: The directory absolute path to the file. +- `$dest_path` _(string)_: The directory absolute path to the file. - `$pathinfo` _(array)_: The [pathinfo](https://www.php.net/manual/en/function.pathinfo.php) of the file. - `$counter` _(int)_: The incremented counter.
-acf_uppy/file_name +uppy_field_for_acf/file_name ```php -apply_filters( 'acf_uppy/file_name', $fileName, $destPath ); +apply_filters( 'uppy_field_for_acf/file_name', $fileName, $dest_path ); ``` - `$fileName` _(string)_: The file name. -- `$destPath` _(string)_: The directory absolute path to the file. +- `$dest_path` _(string)_: The directory absolute path to the file.
-acf_uppy/download_hash +uppy_field_for_acf/download_hash ```php -apply_filters( 'acf_uppy/download_hash', $hash, $destFile, $postId ); +apply_filters( 'uppy_field_for_acf/download_hash', $hash, $destFile, $postId ); ``` - `$hash` _(int|string)_: The hash used in download url. Default: `wp_hash( $destFile )`. - `$destFile` _(string)_: The absolute path of the file. -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_.
-acf_uppy/download_hash/type={$postType} +uppy_field_for_acf/download_hash/type={$postType} ```php -apply_filters( 'acf_uppy/download_hash/type={$postType}', $hash, $destFile, $postId ); +apply_filters( 'uppy_field_for_acf/download_hash/type={$postType}', $hash, $destFile, $postId ); ``` - `$hash` _(string)_: The hash used in download url. Default: `wp_hash( $destFile )`. -- `$postType` _(string)_: The type of the post containing _ACF Uppy Field_. +- `$postType` _(string)_: The type of the post containing _Upload Field with Uppy for ACF_. - `$destFile` _(string)_: The absolute path of the file. -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_.
-acf_uppy/download_allow +uppy_field_for_acf/download_allow ```php -apply_filters( 'acf_uppy/download_allow', $allow, $destFile, $postId ); +apply_filters( 'uppy_field_for_acf/download_allow', $allow, $destFile, $postId ); ``` - `$allow` _(bool)_: Whether or not to allow the file download. - `$destFile` _(string)_: The absolute path of the file. -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_.
-acf_uppy/download_allow/type={$postType} +uppy_field_for_acf/download_allow/type={$postType} ```php -apply_filters( 'acf_uppy/download_allow/type={$postType}', $allow, $destFile, $postId ); +apply_filters( 'uppy_field_for_acf/download_allow/type={$postType}', $allow, $destFile, $postId ); ``` - `$allow` _(bool)_: Whether or not to allow the file download. -- `$postType` _(string)_: The type of the post containing _ACF Uppy Field_. +- `$postType` _(string)_: The type of the post containing _Upload Field with Uppy for ACF_. - `$destFile` _(string)_: The absolute path of the file. -- `$postId` _(int)_: The ID of the post containing _ACF Uppy Field_. +- `$postId` _(int)_: The ID of the post containing _Upload Field with Uppy for ACF_.
-acf_uppy/download_symlink_delete_days +uppy_field_for_acf/download_symlink_delete_days ```php -apply_filters( 'acf_uppy/download_symlink_delete_days', $days ); +apply_filters( 'uppy_field_for_acf/download_symlink_delete_days', $days ); ``` - `$days` _(int)_: Number of days before old symlinks are deleted. Default: `1`. @@ -373,10 +385,10 @@ Default: `1`.
-acf_uppy/download_symlink_delete_max +uppy_field_for_acf/download_symlink_delete_max ```php -apply_filters( 'acf_uppy/download_symlink_delete_max', $max ); +apply_filters( 'uppy_field_for_acf/download_symlink_delete_max', $max ); ``` - `$max` _(int)_: How many old symlinks need to be deleted on each request. Default: `10`. @@ -384,12 +396,12 @@ Default: `10`.
-acf_uppy/custom_post_types +uppy_field_for_acf/custom_post_types ```php -apply_filters( 'acf_uppy/custom_post_types', $postTypes ); +apply_filters( 'uppy_field_for_acf/custom_post_types', $postTypes ); ``` -- `$postTypes` _(array)_: The types of the post containing _ACF Uppy Field_. +- `$postTypes` _(array)_: The types of the post containing _Upload Field with Uppy for ACF_. Default: `[]`.
diff --git a/acf-uppy/acf-uppy.php b/acf-uppy/acf-uppy.php deleted file mode 100644 index feead61..0000000 --- a/acf-uppy/acf-uppy.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * This source file is subject to the GNU GPLv3 or later license that is bundled - * with this source code in the file LICENSE. - */ - -use AcfUppy\AcfUppy; - -/* - * Plugin Name: ACF Uppy Field - * Plugin URI: https://github.com/frugan-dev/acf-uppy - * Description: Uppy Field for Advanced Custom Fields - * Version: 2.1.0 - * Requires PHP: 8.0 - * Author: Frugan - * Author URI: https://frugan.it - * License: GPLv3 or later - * License URI: http://www.gnu.org/licenses/gpl-3.0.html - * Donate link: https://buymeacoff.ee/frugan - */ -if (!defined('ABSPATH')) { - exit; -} - -if (file_exists(__DIR__.'/vendor/autoload.php')) { - require __DIR__.'/vendor/autoload.php'; -} - -define('ACF_UPPY_VERSION', '2.0.0'); -define('ACF_UPPY_NAME', dirname(plugin_basename(__FILE__))); -define('ACF_UPPY_NAME_UNDERSCORE', str_replace('-', '_', ACF_UPPY_NAME)); -define('ACF_UPPY_FIELD_TYPE', 'uppy'); - -$AcfUppy = new AcfUppy(); - -register_activation_hook(__FILE__, [$AcfUppy, 'activate']); -register_deactivation_hook(__FILE__, [$AcfUppy, 'deactivate']); diff --git a/acf-uppy/lang/README.md b/acf-uppy/lang/README.md deleted file mode 100644 index aaeee58..0000000 --- a/acf-uppy/lang/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Translations directory - -Use this directory to store .po and .mo files. - -This directory can be removed if not used. diff --git a/acf-uppy/readme.txt b/acf-uppy/readme.txt deleted file mode 100644 index 3280e20..0000000 --- a/acf-uppy/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -=== ACF Uppy Field === -Contributors: Frugan -Tags: acf, fields, custom fields, meta, repeater -Requires at least: 5.6.0 -Tested up to: 6.6.1 -Stable tag: 2.1.0 -Requires PHP: 8.0 -License: GPLv3 or later -License URI: http://www.gnu.org/licenses/gpl-3.0.html -Donate link: https://buymeacoff.ee/frugan - -Uppy Field for Advanced Custom Fields - -== Description == - -__ACF Uppy Field__ is a WordPress plugin that adds a new `Uppy` custom field to the list of fields of the [Advanced Custom Fields](https://www.advancedcustomfields.com) plugin. This custom field allows you to __upload files of all types and sizes__ using the [TUS protocol](https://tus.io) and the [Uppy JS uploader](https://uppy.io), overcoming the limitations of the default ACF `File` field. With __ACF Uppy Field__, you no longer need to increase server-side INI parameters such as `upload_max_filesize`, `post_max_size`, `max_execution_time` and `memory_limit`. - -= Requirements = - -@see https://github.com/frugan-dev/acf-uppy?tab=readme-ov-file#requirements - -== Installation == - -@see https://github.com/frugan-dev/acf-uppy?tab=readme-ov-file#installation - -== Changelog == - -@see https://github.com/frugan-dev/acf-uppy/blob/master/CHANGELOG.md - -= Links = -* [Github](https://github.com/frugan-dev/acf-uppy) -* [Support](https://github.com/frugan-dev/acf-uppy/issues) diff --git a/acf-uppy/src/AcfUppy.php b/acf-uppy/src/AcfUppy.php deleted file mode 100644 index 54b8eca..0000000 --- a/acf-uppy/src/AcfUppy.php +++ /dev/null @@ -1,578 +0,0 @@ - - * - * This source file is subject to the GNU GPLv3 or later license that is bundled - * with this source code in the file LICENSE. - */ - -namespace AcfUppy; - -use AcfUppy\Exception\ReadErrorException; -use AcfUppy\Middleware\Auth; -use AcfUppy\Middleware\UploadDir; -use AcfUppy\Middleware\UploadMetadata; -use Diversen\Sendfile; -use TusPhp\Cache\AbstractCache; -use TusPhp\Events\TusEvent; -use TusPhp\Tus\Server; - -class AcfUppy -{ - /** - * @var array{version:string,fieldType:string,url:string,path:string,destPath:mixed,tmpPath:mixed,symlinkUrl:mixed,symlinkPath:mixed,cacheTtl:mixed} - */ - public $settings; - - /** - * @var Server - */ - public $server; - - /** - * This function will setup the class functionality. - */ - public function __construct() - { - add_action( - 'plugins_loaded', - function (): void { - $this->server = new Server( - // Either redis, file or apcu. Leave empty for file based cache. - // https://github.com/ankitpokhrel/tus-php/issues/408#issuecomment-1250229371 - // It is not advised to use FileStore in production. FileStore was initially designed for development purposes - // and may not work properly in many cases. Please use redis or apcu cache in prod. - apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/cache', 'apcu') - ); - - $this->server->setApiPath( - // tus server endpoint. - '/'.apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/api_path', 'wp-tus') - ); - - $wp_upload_dir = wp_upload_dir(); - - // settings - // - these will be passed into the field class. - $this->settings = [ - 'version' => ACF_UPPY_VERSION, - 'fieldType' => ACF_UPPY_FIELD_TYPE, - 'url' => plugin_dir_url(__DIR__), - 'path' => plugin_dir_path(__DIR__), - 'destPath' => apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/dest_path', trailingslashit($wp_upload_dir['basedir']).ACF_UPPY_NAME), - 'tmpPath' => apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/tmp_path', trailingslashit(sys_get_temp_dir()).trailingslashit(ACF_UPPY_NAME).get_current_user_id()), - 'symlinkUrl' => apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/symlink_url', plugin_dir_url(__DIR__).'symlink'), - 'symlinkPath' => apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/symlink_path', plugin_dir_path(__DIR__).'symlink'), - 'cacheTtl' => apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/cache_ttl', $this->server->getCache()->getTtl()), // default: 86400 - ]; - - // https://github.com/ankitpokhrel/tus-php/issues/102 - $cache = $this->server->getCache(); - - if ($cache instanceof AbstractCache) { - $cache->setTtl($this->settings['cacheTtl']); - } - - $this->server->middleware()->add( - Auth::class, - UploadMetadata::class, - new UploadDir($this->settings, $this->server) - ); - - $this->server->event()->addListener( - 'tus-server.upload.complete', - function (TusEvent $tusEvent): void { - $fileMeta = $tusEvent->getFile()->details(); - $fieldName = basename(\dirname($fileMeta['file_path'])); - - $dirs = glob(trailingslashit($this->server->getUploadDir()).'*'); - - if (false === $dirs) { - throw new ReadErrorException('error reading '.trailingslashit($this->server->getUploadDir()).'*'); - } - - foreach ($dirs as $dir) { - if ($fileMeta['file_path'] === $dir) { - continue; - } - - if (is_file($dir)) { - wp_delete_file($dir); - } - } - - $requestKey = $tusEvent->getRequest()->key(); - - $cacheable = $this->server->getCache(); - - // getActualCacheKey() method is public only in FileStore - // https://github.com/ankitpokhrel/tus-php/blob/v2.1.0/src/Cache/FileStore.php#L267 - if (!method_exists($cacheable, 'getActualCacheKey') || !\is_callable([$cacheable, 'getActualCacheKey'])) { - return; - } - - // https://github.com/ankitpokhrel/tus-php/issues/102 - foreach ($cacheable->keys() as $cacheKey) { - if ($cacheable->getActualCacheKey($requestKey) === $cacheKey) { - continue; - } - - if ($oldFileMeta = $cacheable->get($cacheKey)) { - if (preg_match('~'.preg_quote('/'.get_current_user_id().'/'.$fieldName.'/').'~', $oldFileMeta['file_path'])) { - $cacheable->delete($cacheKey); - } - } - } - } - ); - }, - 0 - ); - - // https://github.com/ankitpokhrel/tus-php/wiki/WordPress-Integration - add_action( - 'init', - static function (): void { - global $wp; - - $wp->add_query_var('tus'); - $wp->add_query_var(ACF_UPPY_NAME_UNDERSCORE.'_action'); - $wp->add_query_var(ACF_UPPY_NAME_UNDERSCORE.'_pubkey'); - - // add_rewrite_tag( '%tus%', '([^&]+)' ); - add_rewrite_rule('^'.apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/api_path', 'wp-tus').'/?([^/]*)/?([^/]*)/?$', 'index.php?tus=$matches[1]', 'top'); - add_rewrite_rule('^'.apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/base_path', ACF_UPPY_NAME).'/([^/]+)/([0-9]{1,})/([^/]+)/?$', 'index.php?'.ACF_UPPY_NAME_UNDERSCORE.'_action=$matches[1]&page_id=$matches[2]&'.ACF_UPPY_NAME_UNDERSCORE.'_pubkey=$matches[3]', 'top'); - }, - 0 - ); - - add_action( - 'parse_request', - function ($wp): void { - if (!isset($wp->query_vars['tus'])) { - return; - } - - $response = $this->server->serve(); - - $response->send(); - - exit(0); - }, - 0 - ); - - add_action( - 'parse_request', - function ($wp): void { - if (empty($wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action']) || empty($wp->query_vars['page_id']) || empty($wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_pubkey'])) { - return; - } - - $postId = (int) $wp->query_vars['page_id']; - $postType = get_post_type($postId); - - switch ($wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action']) { - case 'download': - $fieldsObj = get_field_objects($postId); - - if (!empty($fieldsObj)) { - $destFiles = $this->getDestFiles($fieldsObj, $postId); - - if (!empty($destFiles)) { - foreach ($destFiles as $destFile) { - $hash = apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_hash', wp_hash($destFile), $destFile, $postId); - - if (!empty($postType)) { - $hash = apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_hash/type='.$postType, $hash, $destFile, $postId); - } - - if ($wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_pubkey'] === $hash) { - $found = true; - - break; - } - } - - if (!empty($found)) { - $allow = apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_allow', true, $destFile, $postId); - - if (!empty($postType)) { - $allow = apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_allow/type='.$postType, $allow, $destFile, $postId); - } - - if (!empty($allow)) { - require_once ABSPATH.'/wp-admin/includes/file.php'; - WP_Filesystem(); - - global $wp_filesystem; - - $i = 0; - $paths = glob(trailingslashit($this->settings['symlinkPath']).'*'); - - if (false === $paths) { - throw new ReadErrorException('error reading '.trailingslashit($this->settings['symlinkPath']).'*'); - } - - foreach ($paths as $path) { - if (is_dir($path)) { - if (basename($path) === $wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_pubkey']) { - continue; - } - - // https://stackoverflow.com/a/34512584 - $stat = stat($path); - - if (false !== $stat) { - $diff = ((time() - $stat['mtime']) / (60 * 60 * 24)); - - if ($diff >= apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_symlink_delete_days', 1)) { - @$wp_filesystem->rmdir($path, true); - } - } - - ++$i; - - if ($i > apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_symlink_delete_max', 10)) { - break; - } - } - } - - $symlinkPath = trailingslashit($this->settings['symlinkPath']).trailingslashit($wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_pubkey']); - - if (is_link($symlinkPath)) { - $symlinkPath = readlink($symlinkPath); - } - - $symlinkFile = $symlinkPath.basename($destFile); - - if (false === wp_mkdir_p($symlinkPath)) { - wp_die( - \sprintf( - // translators: %1$s: symlinkPath - __('Error creating symlinkPath (%1$s)', ACF_UPPY_NAME), - $symlinkPath - ), - 500, - ['back_link' => true] - ); - } - - if (!is_link($symlinkFile)) { - if (true !== @symlink($destFile, $symlinkFile)) { - @exec('ln -s '.escapeshellcmd($destFile).' '.escapeshellcmd($symlinkFile), $out, $status); - } - } - - if (is_link($symlinkFile)) { - wp_safe_redirect(trailingslashit($this->settings['symlinkUrl']).trailingslashit($wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_pubkey']).basename($destFile)); - - exit; - } - - // https://stackoverflow.com/a/1395173/3929620 - // https://zinoui.com/blog/download-large-files-with-php - // https://github.com/diversen/http-send-file - // https://github.com/apfelbox/PHP-File-Download - try { - (new Sendfile())->send($destFile); - - exit; - } catch (\Exception $e) { - wp_die( - $e->getMessage(), - 500, - ['back_link' => true] - ); - } - } - } - } - } - - break; - } - - do_action(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_fallback', $postId); - do_action(ACF_UPPY_NAME_UNDERSCORE.'/'.$wp->query_vars[ACF_UPPY_NAME_UNDERSCORE.'_action'].'_fallback/type='.$postType, $postId); - }, - 0 - ); - - add_action( - 'wp', - function ($wp): void { - if (!is_user_logged_in()) { - return; - } - - if (\defined('DOING_AJAX') && DOING_AJAX) { - return; - } - - if (is_dir($this->settings['tmpPath'])) { - require_once ABSPATH.'/wp-admin/includes/file.php'; - WP_Filesystem(); - - global $wp_filesystem; - - $paths = glob(trailingslashit($this->settings['tmpPath']).'*'); - - if (false === $paths) { - throw new ReadErrorException('error reading '.trailingslashit($this->settings['tmpPath']).'*'); - } - - foreach ($paths as $path) { - if (is_dir($path)) { - @$wp_filesystem->rmdir($path, true); - } - } - } - - // https://github.com/ankitpokhrel/tus-php/issues/102 - $cacheKeys = $this->server->getCache()->keys(); - // $this->server->getCache()->deleteAll( $cacheKeys ); - - foreach ($cacheKeys as $cacheKey) { - if (!($oldFileMeta = $this->server->getCache()->get($cacheKey))) { - continue; - } - - if (!preg_match('~^'.preg_quote(trailingslashit($this->settings['tmpPath'])).'~', $oldFileMeta['file_path'])) { - continue; - } - - $this->server->getCache()->delete($cacheKey); - } - } - ); - - add_action( - 'acf/save_post', - function ($postId): void { - $fieldsObj = get_field_objects($postId); - - if (!empty($fieldsObj)) { - $destPaths = $this->getDestPaths($fieldsObj, $postId); - - if (!empty($destPaths)) { - $destFiles = $this->getDestFiles($fieldsObj, $postId); - - foreach ($destPaths as $destPath) { - if (is_dir($destPath)) { - $paths = glob(trailingslashit($destPath).'*'); - - if (false === $paths) { - throw new ReadErrorException('error reading '.trailingslashit($destPath).'*'); - } - - foreach ($paths as $path) { - if (is_file($path)) { - if (\in_array($path, $destFiles, true)) { - continue; - } - - wp_delete_file($path); - } - } - } - } - } - } - } - ); - - // the hook runs only when the WordPress user empties the Trash - add_action( - 'before_delete_post', - function ($postId, $post): void { - if ('acf-field-group' === $post->post_type) { - return; - } - - if ('acf-field' === $post->post_type) { - $field = get_field_object($post->post_name, $postId); - - if (!empty($field)) { - require_once ABSPATH.'/wp-admin/includes/file.php'; - WP_Filesystem(); - - global $wp_filesystem; - - $args = [ - 'post_type' => 'any', // retrieves any type except revisions and types with ‘exclude_from_search’ set to true. - 'meta_key' => '_'.$field['name'], - 'meta_value' => $field['key'], - 'nopaging' => true, - ]; - - $query = new \WP_Query($args); - - if ($query->have_posts()) { - while ($query->have_posts()) { - $query->the_post(); - - $destPath = !empty($field['destPath']) ? trailingslashit($field['destPath']) : apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/dest_path/type='.get_post_type(), trailingslashit($this->settings['destPath']), get_the_ID(), $field); - $destPath .= trailingslashit((string) get_the_ID()).trailingslashit(sanitize_file_name($field['key'])); - - if (is_dir($destPath)) { - @$wp_filesystem->rmdir($destPath, true); - } - } - } - - wp_reset_postdata(); - } - } else { - $fieldsObj = get_field_objects($postId); - - if (!empty($fieldsObj)) { - $destPaths = $this->getDestPaths($fieldsObj, $postId, false); - - if (!empty($destPaths)) { - require_once ABSPATH.'/wp-admin/includes/file.php'; - WP_Filesystem(); - - global $wp_filesystem; - - foreach ($destPaths as $destPath) { - if (is_dir($destPath)) { - @$wp_filesystem->rmdir($destPath, true); - } - } - } - } - } - }, - 10, - 2 - ); - - // include field - add_action('acf/include_field_types', [$this, 'include_field']); // v5 - add_action('acf/register_fields', [$this, 'include_field']); // v4 - } - - /** - * This function will include the field type class. - * - * @param false|int $version major ACF version. Defaults to false - */ - public function include_field($version = false): void - { - // support empty $version - if (empty($version)) { - $version = 5; - } - - if ('mu-plugins' === basename(\dirname($this->settings['path']))) { - load_muplugin_textdomain( - ACF_UPPY_NAME, - trailingslashit(ACF_UPPY_NAME).'lang' - ); - } else { - load_plugin_textdomain( - ACF_UPPY_NAME, - false, - trailingslashit(ACF_UPPY_NAME).'lang' - ); - } - - if (class_exists($class = '\AcfUppy\AcfUppyFieldV'.$version)) { - new $class($this->settings, $this->server); - } - } - - public function getSubValues(array $values, string $fieldName, array $returns = []): array - { - if (!empty($values) && !empty($fieldName)) { - foreach ($values as $subValues) { - foreach ($subValues as $name => $value) { - if ($name === $fieldName && !empty($value)) { - $returns[] = $value; - } elseif (\is_array($value)) { - $returns += $this->getSubValues($value, $fieldName, $returns); - } - } - } - } - - return $returns; - } - - public function getDestFiles(array $fieldsObj, int $postId, array $values = [], array $returns = []): array - { - if (!empty($fieldsObj)) { - $postType = get_post_type($postId); - - foreach ($fieldsObj as $fieldObj) { - if ($fieldObj['type'] === $this->settings['fieldType']) { - $destPath = !empty($fieldObj['destPath']) ? trailingslashit($fieldObj['destPath']) : apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/dest_path/type='.$postType, trailingslashit($this->settings['destPath']), $postId, $fieldObj); - $destPath .= trailingslashit((string) $postId); - $destPath .= trailingslashit(sanitize_file_name($fieldObj['key'])); - - if (!empty($fieldObj['value'])) { - $returns[] = $destPath.$fieldObj['value']; - } elseif (!empty($values)) { - foreach ($this->getSubValues($values, $fieldObj['name']) as $value) { - $returns[] = $destPath.$value; - } - } - } elseif (!empty($fieldObj['sub_fields'])) { - if (!empty($fieldObj['value'])) { - $values = $fieldObj['value']; - } - - $returns += $this->getDestFiles($fieldObj['sub_fields'], $postId, $values, $returns); - } - } - } - - return $returns; - } - - public function getDestPaths(array $fieldsObj, int $postId, bool $fullPath = true, array $returns = []): array - { - if (!empty($fieldsObj)) { - $postType = get_post_type($postId); - - foreach ($fieldsObj as $fieldObj) { - if ($fieldObj['type'] === $this->settings['fieldType']) { - $destPath = !empty($fieldObj['destPath']) ? trailingslashit($fieldObj['destPath']) : apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/dest_path/type='.$postType, trailingslashit($this->settings['destPath']), $postId, $fieldObj); - $destPath .= trailingslashit((string) $postId); - - if ($fullPath) { - $destPath .= trailingslashit(sanitize_file_name($fieldObj['key'])); - } - - $returns[] = $destPath; - } elseif (!empty($fieldObj['sub_fields'])) { - $returns += $this->getDestPaths($fieldObj['sub_fields'], $postId, $fullPath, $returns); - } - } - } - - // http://stackoverflow.com/a/8321709 - return array_flip(array_flip($returns)); - } - - public static function activate(): void - { - // https://andrezrv.com/2014/08/12/efficiently-flush-rewrite-rules-plugin-activation/ - flush_rewrite_rules(); - delete_option('rewrite_rules'); - } - - public static function deactivate($network_deactivating = false): void - { - // https://andrezrv.com/2014/08/12/efficiently-flush-rewrite-rules-plugin-activation/ - flush_rewrite_rules(); - delete_option('rewrite_rules'); - } -} diff --git a/acf-uppy/src/AcfUppyFieldV5.php b/acf-uppy/src/AcfUppyFieldV5.php deleted file mode 100644 index b6cf885..0000000 --- a/acf-uppy/src/AcfUppyFieldV5.php +++ /dev/null @@ -1,464 +0,0 @@ -settings = $settings; - - // name (string) Single word, no spaces. Underscores allowed - $this->name = $this->settings['fieldType']; - - // label (string) Multiple words, can include spaces, visible when selecting a field type - $this->label = __('Uppy', ACF_UPPY_NAME); - - // category (string) basic | content | choice | relational | jquery | layout | CUSTOM GROUP NAME - $this->category = 'content'; - - // defaults (array) Array of default settings which are merged into the field object. These are used later in settings - $this->defaults = [ - 'maxFileSize' => 10, - - // https://www.iana.org/assignments/media-types/media-types.xhtml - 'allowedFileTypes' => null, - - 'destPath' => $this->settings['destPath'], - ]; - - /* - * l10n (array) Array of strings that are used in JavaScript. This allows JS strings to be translated in PHP and loaded via: - * var message = acf._e('uppy', 'error'); - */ - $this->l10n = [ - 'debug' => WP_DEBUG, - 'locale' => get_locale(), - 'apiPath' => home_url('/'.apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/api_path', 'wp-tus')), - // 'error' => __('Error! Please enter a higher value', ACF_UPPY_NAME), - ]; - - $this->server = $server; - - // do not delete! - parent::__construct(); - } - - /** - * Create extra settings for your field. These are visible when editing a field. - * - * @param array $field the $field being edited - */ - public function render_field_settings($field): void - { - // acf_render_field_setting - // - // This function will create a setting for your field. Simply pass the $field parameter and an array of field settings. - // The array of settings does not require a `value` or `prefix`; These settings are found from the $field array. - // - // More than one setting can be added by copy/paste the above code. - // Please note that you must also have a matching $defaults value for the field name (font_size) - acf_render_field_setting( - $field, - [ - 'label' => __('Max file size', ACF_UPPY_NAME), - 'instructions' => implode( - '
'.PHP_EOL, - [ - // translators: %1$s: maxFileSize - \sprintf(__('Default: %1$s', ACF_UPPY_NAME), ''.$this->defaults['maxFileSize'].''), - ] - ), - 'type' => 'number', - 'name' => 'maxFileSize', - 'append' => 'MB', - 'min' => 0, - 'step' => 1, - ] - ); - - acf_render_field_setting( - $field, - [ - 'label' => __('Allowed file types', ACF_UPPY_NAME), - 'instructions' => implode( - '
'.PHP_EOL, - [ - __('Wildcards mime types (e.g. image/*), exact mime types (e.g. image/jpeg), or file extensions (e.g. .jpg).', ACF_UPPY_NAME), - __('One value for each line.', ACF_UPPY_NAME), - // translators: %1$s: allowedFileTypes - \sprintf(__('Default: %1$s', ACF_UPPY_NAME), ''.$this->defaults['allowedFileTypes'].''), - ] - ), - 'type' => 'textarea', - 'name' => 'allowedFileTypes', - ] - ); - - acf_render_field_setting( - $field, - [ - 'label' => __('Uploads path', ACF_UPPY_NAME), - 'instructions' => implode( - '
'.PHP_EOL, - [ - __('Absolute path to the directory where to save all files.', ACF_UPPY_NAME), - __('It can also be outside the public directory.', ACF_UPPY_NAME), - // translators: %1$s: destPath - \sprintf(__('Default: %1$s', ACF_UPPY_NAME), ''.$this->defaults['destPath'].''), - ] - ), - 'type' => 'text', - 'name' => 'destPath', - ] - ); - } - - /** - * Create the HTML interface for your field. - * - * @param array $field the $field being edited - */ - public function render_field($field): void - { - global $post; - - $destFile = ''; - $hash = ''; - - if (!empty($field['value'])) { - $destPath = !empty($field['destPath']) ? trailingslashit($field['destPath']) : apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/dest_path/type='.$post->post_type, trailingslashit($this->settings['destPath']), $post->ID, $field); - $destPath .= trailingslashit($post->ID).trailingslashit(sanitize_file_name($field['key'])); - - $destFile = $destPath.$field['value']; - - if (file_exists($destFile)) { - $found = true; - - $hash = apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/download_hash', wp_hash($destFile), $destFile, $post->ID); - $hash = apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/download_hash/type='.$post->post_type, $hash, $destFile, $post->ID); - } - } - - if (!empty($field['allowedFileTypes'])) { - $array = preg_split('/\r\n|[\r\n]/', $field['allowedFileTypes']); - - if (false !== $array) { - // http://stackoverflow.com/a/8321709 - $array = array_flip(array_flip($array)); - - $field['allowedFileTypes'] = wp_json_encode($array); - } - } - ?> - -
-
-
-
-
- - - - - () - -
- settings['path'].'/asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*.js'); - - if (false === $paths) { - throw new ReadErrorException('error reading '.$this->settings['path'].'/asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*.js'); - } - - foreach ($paths as $file) { - wp_register_script( - $this->name.'-npm-'.basename($file, '.js'), - $this->settings['url'].'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/'.basename($file), - ['acf-input'], - $this->settings['version'], - true - ); - wp_enqueue_script($this->name.'-npm-'.basename($file, '.js')); - } - - $paths = glob($this->settings['path'].'/asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/*.js'); - - if (false === $paths) { - throw new ReadErrorException('error reading '.$this->settings['path'].'/asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/*.js'); - } - - foreach ($paths as $file) { - wp_register_script( - $this->name.'-'.basename($file, '.js'), - $this->settings['url'].'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/'.basename($file), - ['acf-input'], - $this->settings['version'], - true - ); - - if ('main' === basename($file, '.js')) { - wp_localize_script($this->name.'-'.basename($file, '.js'), $this->name.'L10n', $this->l10n); - } - - wp_enqueue_script($this->name.'-'.basename($file, '.js')); - } - - $files = [ - 'asset/js/locales/@uppy/'.get_locale().'.min.js', - ]; - - foreach ($files as $file) { - if (file_exists($this->settings['path'].'/'.$file)) { - wp_register_script( - $this->name.'-'.basename(\dirname($file)).'-'.basename($file, '.js'), - $this->settings['url'].$file, - ['acf-input'], - $this->settings['version'], - true - ); - wp_enqueue_script($this->name.'-'.basename(\dirname($file)).'-'.basename($file, '.js')); - - if ('@uppy' === basename(\dirname($file))) { - wp_add_inline_script($this->name.'-'.basename(\dirname($file)).'-'.basename($file, '.js'), 'window.Uppy.locales = []', 'before'); - } - } - } - - // register & include CSS - $paths = glob($this->settings['path'].'/asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*.css'); - - if (false === $paths) { - throw new ReadErrorException('error reading '.$this->settings['path'].'/asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*.css'); - } - - foreach ($paths as $file) { - wp_register_style( - $this->name.'-npm-'.basename($file, '.css'), - $this->settings['url'].'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/'.basename($file), - ['acf-input'], - $this->settings['version'] - ); - wp_enqueue_style($this->name.'-npm-'.basename($file, '.css')); - } - - $paths = glob($this->settings['path'].'/asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/*.css'); - - if (false === $paths) { - throw new ReadErrorException($this->settings['path'].'/asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/*.css'); - } - - foreach ($paths as $path) { - wp_register_style( - $this->name.'-'.basename($path, '.css'), - $this->settings['url'].'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/'.basename($path), - ['acf-input'], - $this->settings['version'] - ); - wp_enqueue_style($this->name.'-'.basename($path, '.css')); - } - } - - /** - * This filter is applied to the $value before it is saved in the db. - * - * @param array $field the field array holding all the field options - * - * @return mixed - */ - public function update_value(mixed $value, mixed $post_id, $field) - { - // ACF saves drafts without validation! - // https://support.advancedcustomfields.com/forums/topic/is-it-possible-to-apply-validation-to-draft-post/ - // https://github.com/AdvancedCustomFields/acf/blob/master/includes/forms/form-post.php#L311 - if (!empty($value) && empty($this->paths)) { - $postTypes = array_merge(apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/custom_post_types', []), ['post', 'page']); - - if (\in_array(get_post_type($post_id), $postTypes, true)) { - $post = get_post($post_id); - - if ('draft' === $post->post_status) { - acf_validate_save_post(); - } - } - } - - if (!empty($value) && !empty($this->paths)) { - $value = sanitize_file_name($value); - - $paths = array_shift($this->paths); - - if (!empty($paths['tmp'])) { - if (basename($paths['tmp']) !== $value) { - wp_die( - \sprintf( - // translators: %1$s: tmpPath, %2$s: file - __('Wrong tmpPath (%1$s) of file (%2$s)', ACF_UPPY_NAME), - $paths['tmp'], - $value - ), - 500, - ['back_link' => true] - ); - } - } - - if (!empty($paths['dest'])) { - $destPath = \dirname($paths['dest']); - $value = basename($paths['dest']); - - if (false === wp_mkdir_p($destPath)) { - wp_die( - \sprintf( - // translators: %1$s: destPath - __('Error creating destPath (%1$s)', ACF_UPPY_NAME), - $destPath - ), - 500, - ['back_link' => true] - ); - } - - if (!empty($paths['tmp'])) { - // https://wordpress.stackexchange.com/a/370377/99214 - if (!\function_exists('WP_Filesystem_Direct')) { - require_once ABSPATH.'wp-admin/includes/class-wp-filesystem-base.php'; - - require_once ABSPATH.'wp-admin/includes/class-wp-filesystem-direct.php'; - } - - $wpFilesystemDirect = new \WP_Filesystem_Direct(null); - - if (false === $wpFilesystemDirect->move($paths['tmp'], $paths['dest'])) { - wp_die( - \sprintf( - // translators: %1$s: tmpPath, %2$s: destPath - __('Error moving file from (%1$s) to (%2$s)', ACF_UPPY_NAME), - $paths['tmp'], - $paths['dest'] - ), - 500, - ['back_link' => true] - ); - } - } - } - } - - return $value; - } - - /** - * This filter is used to perform validation on the value prior to saving. - * All values are validated regardless of the field's required setting. - * This allows you to validate and return messages to the user if the value is not correct. - * - * @param bool $valid validation status based on the value and the field's required setting - * @param array $field the field array holding all the field options - * @param string $input the corresponding input name for $_POST value - * - * @return bool - */ - public function validate_value($valid, mixed $value, $field, $input) - { - $value = sanitize_file_name($value); - - $postId = (int) ($_POST['post_ID'] ?? $_POST['post_id']); - - $postType = get_post_type($postId); - - $tmpPath = trailingslashit($this->settings['tmpPath']).trailingslashit(sanitize_file_name($input)); - - $destPath = !empty($field['destPath']) ? trailingslashit($field['destPath']) : apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/dest_path/type='.$postType, trailingslashit($this->settings['destPath']), $postId, $field); - $destPath .= trailingslashit((string) $postId).trailingslashit(sanitize_file_name($field['key'])); - - if (!empty($field['required']) && empty($value)) { - $valid = false; - } elseif (!empty($value) && !file_exists($tmpPath.$value) && !file_exists($destPath.$value)) { - // Basic usage - $valid = false; - - // Advanced usage - // $valid = __('File doesn\'t exists!', ACF_UPPY_NAME); - } - - if (true === $valid && !empty($value)) { - $paths = []; - - $paths['tmp'] = file_exists($tmpPath.$value) ? $tmpPath.$value : false; - - if (!empty($paths['tmp'])) { - $pathinfo = pathinfo($value); - - $counter = 0; - - while (file_exists($destPath.$value)) { - $value = apply_filters( - ACF_UPPY_NAME_UNDERSCORE.'/file_name_exists', - $pathinfo['filename']. - '-'. - ++$counter. - (isset($pathinfo['extension']) ? '.'.$pathinfo['extension'] : ''), - $destPath, - $pathinfo, - $counter - ); - } - } - - $paths['dest'] = $destPath.apply_filters(ACF_UPPY_NAME_UNDERSCORE.'/file_name', $value, $destPath); - - $this->paths[] = $paths; - } - - return $valid; - } -} diff --git a/acf-uppy/symlink/.htaccess b/acf-uppy/symlink/.htaccess deleted file mode 100644 index 847311d..0000000 --- a/acf-uppy/symlink/.htaccess +++ /dev/null @@ -1,19 +0,0 @@ - - RewriteEngine Off - - - - - ForceType application/octet-stream - Header set Content-Disposition attachment - - - - - - Require all granted - - - Require all denied - - diff --git a/acf-uppy/tests/bootstrap.php b/acf-uppy/tests/bootstrap.php deleted file mode 100644 index db3cb70..0000000 --- a/acf-uppy/tests/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ - - * - * This source file is subject to the GNU GPLv3 or later license that is bundled - * with this source code in the file LICENSE. - */ diff --git a/acf-uppy/tests/data/wp-cfm/default.json b/acf-uppy/tests/data/wp-cfm/default.json deleted file mode 100644 index 1252a9e..0000000 --- a/acf-uppy/tests/data/wp-cfm/default.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "active_plugins": "a:11:{i:0;s:83:\"acf-repeater-flexible-content-collapser\/acf-repeater-flexible-content-collapser.php\";i:1;s:29:\"acf-repeater\/acf-repeater.php\";i:2;s:21:\"acf-uppy\/acf-uppy.php\";i:3;s:61:\"advanced-custom-fields-wpcli\/advanced-custom-fields-wpcli.php\";i:4;s:30:\"advanced-custom-fields\/acf.php\";i:5;s:23:\"debug-bar\/debug-bar.php\";i:6;s:23:\"plugin-check\/plugin.php\";i:7;s:51:\"rewrite-rules-inspector\/rewrite-rules-inspector.php\";i:8;s:41:\"wordpress-kint-debugger\/kint-debugger.php\";i:9;s:17:\"wp-cfm\/wp-cfm.php\";i:10;s:29:\"wp-mail-smtp\/wp_mail_smtp.php\";}", - "wp_debugging": "a:3:{s:8:\"wp_debug\";s:1:\"1\";s:16:\"wp_debug_display\";s:1:\"1\";s:30:\"wp_disable_fatal_error_handler\";s:1:\"1\";}", - ".label": "default" -} \ No newline at end of file diff --git a/acf-uppy/tests/stubs/constants.stub b/acf-uppy/tests/stubs/constants.stub deleted file mode 100644 index a1aecf9..0000000 --- a/acf-uppy/tests/stubs/constants.stub +++ /dev/null @@ -1,6 +0,0 @@ -=3.0.0 <4.0.0", + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" } @@ -10033,9 +9046,9 @@ "dev": true }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "source-map-resolve": { @@ -10096,15 +9109,15 @@ } }, "spritesmith": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/spritesmith/-/spritesmith-3.4.1.tgz", - "integrity": "sha512-NQZ8c7bZKbtqc0n0V+vVpurV72BwziOXw8AAU/nOdrjcjgCVoy+XUoopbrAYaNfJJgK730U98SB579+YtzfUJw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/spritesmith/-/spritesmith-3.5.1.tgz", + "integrity": "sha512-FrzGx9cD5SkH3Kxuk24vJJLBYHLyDskUJ2t6DSWfWkCd8+yFQAfBGVE7F0IhOpKu+aq1CZ9rgXnpaa4luIQgGg==", "dev": true, "requires": { "concat-stream": "~1.5.1", "layout": "~2.2.0", "pixelsmith": "^2.3.0", - "semver": "~5.0.3", + "semver": "~5.7.2", "through2": "~2.0.0" }, "dependencies": { @@ -10146,9 +9159,9 @@ } }, "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha512-5OkOBiw69xqmxOFIXwXsiY1HlE+om8nNptg1ZIf95fzcnfgOv2fLm7pmmGbRJsjJIqPpW5Kwy4wpDBTz5wQlUw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "string_decoder": { @@ -10198,14 +9211,6 @@ "dev": true, "requires": { "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } } }, "static-extend": { @@ -10429,12 +9434,12 @@ } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -10464,6 +9469,53 @@ "util.promisify": "~1.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -10472,6 +9524,15 @@ "requires": { "minimist": "^1.2.6" } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10754,12 +9815,6 @@ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -10917,9 +9972,9 @@ "dev": true }, "uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, "optional": true }, @@ -10960,15 +10015,15 @@ } }, "undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true }, "unicode-match-property-ecmascript": { @@ -10982,9 +10037,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true }, "unicode-property-aliases-ecmascript": { @@ -11095,13 +10150,13 @@ "optional": true }, "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { @@ -11294,6 +10349,35 @@ "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", "watchpack-chokidar2": "^2.0.1" + }, + "dependencies": { + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + } } }, "watchpack-chokidar2": { @@ -11723,12 +10807,43 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -11740,6 +10855,21 @@ "wrap-ansi": "^5.1.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -11759,6 +10889,12 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -11768,6 +10904,12 @@ "locate-path": "^3.0.0" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -12096,32 +11238,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "wrappy": { diff --git a/build/front/package.json b/build/front/package.json index 35a0c26..4cde1e7 100644 --- a/build/front/package.json +++ b/build/front/package.json @@ -1,6 +1,6 @@ { - "name": "acf-uppy", - "version": "2.0.0", + "name": "upload-field-with-uppy-for-acf", + "version": "3.0.0", "description": "Uppy Field for Advanced Custom Fields", "main": "index.js", "scripts": { diff --git a/build/front/src/js/index.js b/build/front/src/js/index.js index 7a95e63..4afb96f 100644 --- a/build/front/src/js/index.js +++ b/build/front/src/js/index.js @@ -11,296 +11,268 @@ import Informer from '@uppy/informer'; import prettierBytes from '@transloadit/prettier-bytes'; /** - * https://locutus.io/php/array/array_key_exists/ - * eslint-disable-line camelcase - * discuss at: https://locutus.io/php/array_key_exists/ - * original by: Kevin van Zonneveld (https://kvz.io) - * improved by: Felix Geisendoerfer (https://www.debuggable.com/felix) - * example 1: array_key_exists('kevin', {'kevin': 'van Zonneveld'}) - * returns 1: true + * Included when youtube_uploader fields are rendered for editing by publishers. */ -function array_key_exists(key, search) { - if (!search || (search.constructor !== Array && search.constructor !== Object)) { - return false - } - return key in search -} - -//https://developer.mozilla.org/it/docs/Web/API/Element/closest -function getParentsDataIds(el, parentSelector = 'tr.acf-row', ids = []) { - //https://stackoverflow.com/a/57449073/3929620 - var parent = el.parentElement.closest(parentSelector) - - if( parent && parent !== el ) { - - ids.push(parent.dataset.id) - - return getParentsDataIds(parent, parentSelector, ids) - } - - ids.reverse() - - if(uppyL10n.debug) { - console.log(ids) - } - - return ids -} - -//https://github.com/transloadit/uppy/issues/1575#issuecomment-500245017 -function resetFilesObj(files) { - Object.keys(files).forEach(function(key){ - delete files[key]; - }) -} - -(function($) { - - //https://stackoverflow.com/a/47647799/3929620 - var uppyObj = {} - var uppyCounter = 0 - - /** - * initialize_field - * - * This function will initialize the $field. - * - * @date 30/11/17 - * @since 5.6.5 - * - * @param n/a - * @return n/a - */ - - function initialize_field( $field ) { - - if(uppyL10n.debug) { - console.log($field) +( function( $ ) { + window.FRUGAN_UFWUFACF = window.FRUGAN_UFWUFACF || {}; + + FRUGAN_UFWUFACF.Field = class { + /** + * $field is a jQuery object wrapping field elements in the editor. + */ + constructor($field) { + this.field = $field; + this.postId = acf.get('post_id'); + + //https://stackoverflow.com/a/47647799/3929620 + this.uppyObj = {}; + this.uppyCounter = 0; + + this.init(); } - var uppyFileInputSelector = $field[0].querySelector('.UppyFileInput') - - if( uppyFileInputSelector ) { - - var uppyStatusBarSelector = $field[0].querySelector('.UppyStatusBar') - var uppyInformerSelector = $field[0].querySelector('.UppyInformer') - - //https://developer.mozilla.org/it/docs/Learn/HTML/Howto/Uso_attributi_data - var fieldName = uppyFileInputSelector.getAttribute('data-fieldName') - - //https://koukia.ca/top-6-ways-to-search-for-a-string-in-javascript-and-performance-benchmarks-ce3e9b81ad31 - var expr = /acfcloneindex/ - - if( expr.test(fieldName) ) { - - var ids = getParentsDataIds($field[0]) - - if( ids.length > 0 ) { - - var fieldNameArr = fieldName.split(expr) - - var slicedIds = ids.slice(-(fieldNameArr.length - 1)) - - var fieldName = '' - - //https://stackoverflow.com/a/44475397/3929620 - //https://dmitripavlutin.com/replace-all-string-occurrences-javascript/ - fieldNameArr.forEach(function(item, i){ - fieldName += item - - if(array_key_exists(i, slicedIds)) { - fieldName += slicedIds[i] - } - }) - } + init() { + if(window[this.field.data('type')].env.debug) { + console.log(this.field) } - - if( !expr.test(fieldName) ) { - - //https://stackoverflow.com/a/3261380/3929620 - var maxFileSize = uppyFileInputSelector.getAttribute('data-maxFileSize') - maxFileSize = maxFileSize.length !== 0 ? parseInt(maxFileSize) : null - - var allowedFileTypes = uppyFileInputSelector.getAttribute('data-allowedFileTypes') - allowedFileTypes = allowedFileTypes.length !== 0 ? JSON.parse(allowedFileTypes) : null - - uppyObj[uppyCounter] = new Uppy({ - id: 'uppy' + uppyCounter, - debug: uppyL10n.debug, - logger: Uppy.debugLogger, - locale: Uppy.locales[uppyL10n.locale], - //https://github.com/transloadit/uppy/issues/1575#issuecomment-700584697 - autoProceed: true, - allowMultipleUploads: true, - restrictions: { - maxFileSize: maxFileSize, - allowedFileTypes: allowedFileTypes, - //maxNumberOfFiles: 1, - }, - //https://github.com/transloadit/uppy/issues/1575#issuecomment-500245017 - //onBeforeFileAdded: (currentFile, files) => resetFilesObj(files) - }) - - uppyObj[uppyCounter] - .use(FileInput, { - id: 'FileInput' + uppyCounter, - target: uppyFileInputSelector, - replaceTargetContent: true, - //pretty: false, - }) - .use(Tus, { - endpoint: uppyL10n.apiPath, - limit: 1, - headers: { - 'Field-Name': fieldName, - //'Upload-Key': fieldName, + + var uppyFileInputSelector = this.field[0].querySelector('.UppyFileInput') + + if( uppyFileInputSelector ) { + + var uppyStatusBarSelector = this.field[0].querySelector('.UppyStatusBar') + var uppyInformerSelector = this.field[0].querySelector('.UppyInformer') + + //https://developer.mozilla.org/it/docs/Learn/HTML/Howto/Uso_attributi_data + var fieldName = uppyFileInputSelector.getAttribute('data-fieldName') + + //https://koukia.ca/top-6-ways-to-search-for-a-string-in-javascript-and-performance-benchmarks-ce3e9b81ad31 + var expr = /acfcloneindex/ + + if( expr.test(fieldName) ) { + + var ids = this.getParentsDataIds(this.field[0]) + + if( ids.length > 0 ) { + + var fieldNameArr = fieldName.split(expr) + + var slicedIds = ids.slice(-(fieldNameArr.length - 1)) + + var fieldName = '' + + //https://stackoverflow.com/a/44475397/3929620 + //https://dmitripavlutin.com/replace-all-string-occurrences-javascript/ + fieldNameArr.forEach(function(item, i){ + fieldName += item + + if(this.arrayKeyExists(i, slicedIds)) { + fieldName += slicedIds[i] + } + }) + } + } + + if( !expr.test(fieldName) ) { + + //https://stackoverflow.com/a/3261380/3929620 + var max_file_size = uppyFileInputSelector.getAttribute('data-max_file_size') + max_file_size = max_file_size.length !== 0 ? parseInt(max_file_size) : null + + var allowed_file_types = uppyFileInputSelector.getAttribute('data-allowed_file_types') + allowed_file_types = allowed_file_types.length !== 0 ? JSON.parse(allowed_file_types) : null + + this.uppyObj[this.uppyCounter] = new Uppy({ + id: 'uppy' + this.uppyCounter, + debug: window[this.field.data('type')].env.debug, + logger: Uppy.debugLogger, + locale: Uppy.locales[window[this.field.data('type')].env.locale], + //https://github.com/transloadit/uppy/issues/1575#issuecomment-700584697 + autoProceed: true, + allowMultipleUploads: true, + restrictions: { + maxFileSize: max_file_size, + allowedFileTypes: allowed_file_types, + //maxNumberOfFiles: 1, }, + //https://github.com/transloadit/uppy/issues/1575#issuecomment-500245017 + //onBeforeFileAdded: (currentFile, files) => this.resetFilesObj(files) }) - .use(StatusBar, { - target: uppyStatusBarSelector, - hideUploadButton: true, - hideAfterFinish: true, - }) - //https://community.transloadit.com/t/launching-uppy-informer-errors-manually/14907/2 - .use(Informer, { - target: uppyInformerSelector, - }) - - uppyObj[uppyCounter] - .on('upload-success', (file, response) => { - - //https://developer.mozilla.org/it/docs/Web/HTML/Element/input/file#Note - //https://stackoverflow.com/a/8714421/3929620 - document.querySelector('input[name="' + fieldName + '"]').value = file.name - - var span = document.createElement('span') - span.classList.add('dashicons', 'dashicons-trash') - - var a1 = document.createElement('a') - //https://developer.mozilla.org/it/docs/Learn/HTML/Howto/Uso_attributi_data - a1.dataset.fieldName = fieldName - a1.className = 'UppyDelete' - a1.href = 'javascript:;' - a1.appendChild(span) - - //var a2 = document.createElement('a') - - //FIXME - same uploaded files with different Upload-Key return same uploadURL - //https://github.com/ankitpokhrel/tus-php/blob/37e6527b97d0ff44e730064c2c9fddcc0f9f90c5/src/Tus/Server.php#L545 - //https://github.com/transloadit/uppy/issues/1520 - //a2.href = response.uploadURL + '/get' - - //a2.target = '_blank' - //a2.appendChild(document.createTextNode(file.name)) - - var html = a1.outerHTML + ' ' + file.name + ` (${prettierBytes(file.size)})` - - $field[0].querySelector('.UppyResponse').innerHTML = html - }) - - //https://github.com/transloadit/uppy/issues/179#issuecomment-312543794 - uppyObj[uppyCounter].reset() - - uppyCounter++ + + this.uppyObj[this.uppyCounter] + .use(FileInput, { + id: 'FileInput' + this.uppyCounter, + target: uppyFileInputSelector, + replaceTargetContent: true, + //pretty: false, + }) + .use(Tus, { + endpoint: window[this.field.data('type')].env.api_path, + limit: 1, + headers: { + 'Field-Name': fieldName, + //'Upload-Key': fieldName, + }, + }) + .use(StatusBar, { + target: uppyStatusBarSelector, + hideUploadButton: true, + hideAfterFinish: true, + }) + //https://community.transloadit.com/t/launching-uppy-informer-errors-manually/14907/2 + .use(Informer, { + target: uppyInformerSelector, + }) + + this.uppyObj[this.uppyCounter] + .on('upload-success', (file, response) => { + + //https://developer.mozilla.org/it/docs/Web/HTML/Element/input/file#Note + //https://stackoverflow.com/a/8714421/3929620 + document.querySelector('input[name="' + fieldName + '"]').value = file.name + + var span = document.createElement('span') + span.classList.add('dashicons', 'dashicons-trash') + + var a1 = document.createElement('a') + //https://developer.mozilla.org/it/docs/Learn/HTML/Howto/Uso_attributi_data + a1.dataset.fieldName = fieldName + a1.className = 'UppyDelete' + a1.href = 'javascript:;' + a1.appendChild(span) + + //var a2 = document.createElement('a') + + //FIXME - same uploaded files with different Upload-Key return same uploadURL + //https://github.com/ankitpokhrel/tus-php/blob/37e6527b97d0ff44e730064c2c9fddcc0f9f90c5/src/Tus/Server.php#L545 + //https://github.com/transloadit/uppy/issues/1520 + //a2.href = response.uploadURL + '/get' + + //a2.target = '_blank' + //a2.appendChild(document.createTextNode(file.name)) + + var html = a1.outerHTML + ' ' + file.name + ` (${prettierBytes(file.size)})` + + this.field[0].querySelector('.UppyResponse').innerHTML = html + }) + + //https://github.com/transloadit/uppy/issues/179#issuecomment-312543794 + this.uppyObj[this.uppyCounter].reset() + + this.uppyCounter++ + } } - } - } - - //http://youmightnotneedjquery.com/ - //https://gomakethings.com/listening-for-click-events-with-vanilla-javascript/ - //https://medium.com/@florenceliang/javascript-event-delegation-and-event-target-vs-event-currenttarget-c9680c3a46d1 - //https://stackoverflow.com/a/55470424/3929620 - document.addEventListener('click', function(e) { - for (var target = e.target; target && target != this; target = target.parentNode) { - if (target.matches('.UppyDelete')) { - e.preventDefault(); - - var fieldName = target.dataset.fieldName - - if( fieldName ) { - - //https://koukia.ca/top-6-ways-to-search-for-a-string-in-javascript-and-performance-benchmarks-ce3e9b81ad31 - var expr = /acfcloneindex/ - - if( expr.test(fieldName) ) { - - var ids = getParentsDataIds(target) - - if( ids.length > 0 ) { - - var fieldNameArr = fieldName.split(expr) - - var slicedIds = ids.slice(-(fieldNameArr.length - 1)) - - var fieldName = '' - - //https://stackoverflow.com/a/44475397/3929620 - //https://dmitripavlutin.com/replace-all-string-occurrences-javascript/ - fieldNameArr.forEach(function(item, i){ - fieldName += item - if(array_key_exists(i, slicedIds)) { - fieldName += slicedIds[i] + //http://youmightnotneedjquery.com/ + //https://gomakethings.com/listening-for-click-events-with-vanilla-javascript/ + //https://medium.com/@florenceliang/javascript-event-delegation-and-event-target-vs-event-currenttarget-c9680c3a46d1 + //https://stackoverflow.com/a/55470424/3929620 + document.addEventListener('click', function(e) { + for (var target = e.target; target && target != this; target = target.parentNode) { + if (target.matches('.UppyDelete')) { + e.preventDefault(); + + var fieldName = target.dataset.fieldName + + if( fieldName ) { + + //https://koukia.ca/top-6-ways-to-search-for-a-string-in-javascript-and-performance-benchmarks-ce3e9b81ad31 + var expr = /acfcloneindex/ + + if( expr.test(fieldName) ) { + + var ids = this.getParentsDataIds(target) + + if( ids.length > 0 ) { + + var fieldNameArr = fieldName.split(expr) + + var slicedIds = ids.slice(-(fieldNameArr.length - 1)) + + var fieldName = '' + + //https://stackoverflow.com/a/44475397/3929620 + //https://dmitripavlutin.com/replace-all-string-occurrences-javascript/ + fieldNameArr.forEach(function(item, i){ + fieldName += item + + if(this.arrayKeyExists(i, slicedIds)) { + fieldName += slicedIds[i] + } + }) } - }) + } + + if( !expr.test(fieldName) ) { + + //https://stackoverflow.com/a/8714421/3929620 + document.querySelector('input[name="' + fieldName + '"]').value = '' + } } - } - - if( !expr.test(fieldName) ) { - - //https://stackoverflow.com/a/8714421/3929620 - document.querySelector('input[name="' + fieldName + '"]').value = '' + + target.parentNode.innerHTML = '' + + break; } } + }, false); + } - target.parentNode.innerHTML = '' - - break; + /** + * https://locutus.io/php/array/array_key_exists/ + * eslint-disable-line camelcase + * discuss at: https://locutus.io/php/array_key_exists/ + * original by: Kevin van Zonneveld (https://kvz.io) + * improved by: Felix Geisendoerfer (https://www.debuggable.com/felix) + * example 1: array_key_exists('kevin', {'kevin': 'van Zonneveld'}) + * returns 1: true + */ + arrayKeyExists(key, search) { + if (!search || (search.constructor !== Array && search.constructor !== Object)) { + return false } + return key in search } - }, false); - - if( typeof acf.add_action !== 'undefined' ) { - - /* - * ready & append (ACF5) - * - * These two events are called when a field element is ready for initizliation. - * - ready: on page load similar to $(document).ready() - * - append: on new DOM elements appended via repeater field or other AJAX calls - * - * @param n/a - * @return n/a - */ - - acf.add_action('ready_field/type=uppy', initialize_field); - acf.add_action('append_field/type=uppy', initialize_field); - - - } else { - - /* - * acf/setup_fields (ACF4) - * - * These single event is called when a field element is ready for initizliation. - * - * @param event an event object. This can be ignored - * @param element An element which contains the new HTML - * @return n/a - */ - $(document).on('acf/setup_fields', function(e, postbox){ - - // find all relevant fields - $(postbox).find('.field[data-field_type="uppy"]').each(function(){ - - // initialize - initialize_field( $(this) ); - - }); - - }); + //https://developer.mozilla.org/it/docs/Web/API/Element/closest + getParentsDataIds(el, parentSelector = 'tr.acf-row', ids = []) { + //https://stackoverflow.com/a/57449073/3929620 + var parent = el.parentElement.closest(parentSelector) + + if( parent && parent !== el ) { + + ids.push(parent.dataset.id) + + return this.getParentsDataIds(parent, parentSelector, ids) + } + + ids.reverse() + + if(window[this.field.data('type')].env.debug) { + console.log(ids) + } + + return ids + } + //https://github.com/transloadit/uppy/issues/1575#issuecomment-500245017 + resetFilesObj(files) { + Object.keys(files).forEach(function(key){ + delete files[key]; + }) + } } -})(jQuery); + if( typeof acf.add_action !== 'undefined' ) { + /** + * Run initialize_field when existing fields of this type load, + * or when new fields are appended via repeaters or similar. + */ + acf.add_action( 'ready_field/type=upload_field_with_uppy_for_acf', function($field) { + new FRUGAN_UFWUFACF.Field($field); + }); + acf.add_action( 'append_field/type=upload_field_with_uppy_for_acf', function($field) { + new FRUGAN_UFWUFACF.Field($field); + }); + } +} )( jQuery ); diff --git a/build/front/webpack.config.js b/build/front/webpack.config.js index a955586..4e9beb3 100755 --- a/build/front/webpack.config.js +++ b/build/front/webpack.config.js @@ -33,7 +33,7 @@ module.exports = (env, argv = {}) => { output: { filename: 'js/' + (isProduction ? 'min/' : '') + '[name].js', - path: path.resolve(__dirname, '../../acf-uppy/asset'), + path: path.resolve(__dirname, '../../upload-field-with-uppy-for-acf/asset'), publicPath: '/' }, @@ -84,7 +84,7 @@ module.exports = (env, argv = {}) => { optimization: { //https://github.com/webpack/webpack.js.org/blob/ac5f6b4da11d6745005526f7c37b0d2bf629682a/src/content/configuration/optimization.md#optimizationruntimechunk runtimeChunk: { - name: entrypoint => `runtime~${package.name}` + name: entrypoint => `runtime-${package.name}` }, splitChunks: { diff --git a/docker-compose.yml b/docker-compose.yml index 36f3041..2473224 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,8 +31,8 @@ services: - ${PHPSTAN_PRO_WEB_PORT:-11111}:11111 volumes: - wordpress_data:/bitnami/wordpress:rw - # `-plugin` suffix avoids conflicts w/ $AcfUppy->settings['tmpPath'] - - ${PWD}/${PLUGIN_NAME:-acf-uppy}:/tmp/${PLUGIN_NAME:-acf-uppy}-plugin:rw + # `-plugin` suffix avoids conflicts + - ${PWD}/${PLUGIN_NAME:-upload-field-with-uppy-for-acf}:/tmp/${PLUGIN_NAME:-upload-field-with-uppy-for-acf}-plugin:rw - ${PWD}/tmp/certs:/certs - ${PWD}/tmp/phpstan-fixer:/tmp/phpstan-fixer:rw environment: diff --git a/acf-uppy/.gitignore b/upload-field-with-uppy-for-acf/.gitignore similarity index 100% rename from acf-uppy/.gitignore rename to upload-field-with-uppy-for-acf/.gitignore diff --git a/acf-uppy/.php-cs-fixer.dist.php b/upload-field-with-uppy-for-acf/.php-cs-fixer.dist.php similarity index 92% rename from acf-uppy/.php-cs-fixer.dist.php rename to upload-field-with-uppy-for-acf/.php-cs-fixer.dist.php index 580dfd8..1e4df48 100644 --- a/acf-uppy/.php-cs-fixer.dist.php +++ b/upload-field-with-uppy-for-acf/.php-cs-fixer.dist.php @@ -3,7 +3,7 @@ declare(strict_types=1); /* - * This file is part of the ACF Uppy Field WordPress plugin. + * This file is part of the WordPress plugin "Upload Field with Uppy for ACF". * * (ɔ) Frugan * @@ -18,7 +18,7 @@ use PhpCsFixer\RuleSet; $header = <<<'EOF' - This file is part of the ACF Uppy Field WordPress plugin. + This file is part of the WordPress plugin "Upload Field with Uppy for ACF". (ɔ) Frugan diff --git a/acf-uppy/composer.json b/upload-field-with-uppy-for-acf/composer.json similarity index 92% rename from acf-uppy/composer.json rename to upload-field-with-uppy-for-acf/composer.json index dd2bcb3..2a40051 100644 --- a/acf-uppy/composer.json +++ b/upload-field-with-uppy-for-acf/composer.json @@ -1,6 +1,6 @@ { - "name": "frugan-dev/acf-uppy", - "description": "Advanced Custom Fields: Uppy Field", + "name": "frugan-dev/upload-field-with-uppy-for-acf", + "description": "Upload Field with Uppy for ACF", "license": "GPL-3.0-or-later", "type": "wordpress-plugin", "require": { @@ -14,6 +14,7 @@ "friendsofphp/php-cs-fixer": "^3.58", "frugan-dev/acf-repeater": "^2.1", "hoppinger/advanced-custom-fields-wpcli": "dev-master", + "inpsyde/wonolog": "2.x-dev", "jameelmoses/wordpress-kint-debugger": "^2.0", "nikic/php-parser": "^5.0", "php-parallel-lint/php-parallel-lint": "^1.4", @@ -29,6 +30,7 @@ "wp-coding-standards/wpcs": "^3.1", "wpackagist-plugin/acf-repeater-flexible-content-collapser": "^1.2", "wpackagist-plugin/advanced-custom-fields": "^5.9 || ^6.0", + "wpackagist-plugin/classic-editor": "^1.6", "wpackagist-plugin/debug-bar": "^1.1", "wpackagist-plugin/plugin-check": "^1.0", "wpackagist-plugin/query-monitor": "^3.16", @@ -59,7 +61,7 @@ ], "autoload": { "psr-4": { - "AcfUppy\\": "src/" + "FruganUFWUFACF\\": "src/" } }, "config": { diff --git a/acf-uppy/composer.lock b/upload-field-with-uppy-for-acf/composer.lock similarity index 90% rename from acf-uppy/composer.lock rename to upload-field-with-uppy-for-acf/composer.lock index b7404e8..a7f1c61 100644 --- a/acf-uppy/composer.lock +++ b/upload-field-with-uppy-for-acf/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "af9c0822f809d5311e43b293cc91fdda", + "content-hash": "4019e7ec937d1e28941abb847b2e0a2b", "packages": [ { "name": "ankitpokhrel/tus-php", @@ -374,16 +374,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -437,7 +437,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -453,7 +453,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -1273,16 +1273,16 @@ }, { "name": "symfony/console", - "version": "v5.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cef62396a0477e94fc52e87a17c6e5c32e226b7f" + "reference": "108d436c2af470858bdaba3257baab3a74172017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cef62396a0477e94fc52e87a17c6e5c32e226b7f", - "reference": "cef62396a0477e94fc52e87a17c6e5c32e226b7f", + "url": "https://api.github.com/repos/symfony/console/zipball/108d436c2af470858bdaba3257baab3a74172017", + "reference": "108d436c2af470858bdaba3257baab3a74172017", "shasum": "" }, "require": { @@ -1352,7 +1352,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.42" + "source": "https://github.com/symfony/console/tree/v5.4.45" }, "funding": [ { @@ -1368,7 +1368,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:21:55+00:00" + "time": "2024-10-08T07:27:17+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1439,16 +1439,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4" + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", "shasum": "" }, "require": { @@ -1504,7 +1504,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" }, "funding": [ { @@ -1520,7 +1520,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -1603,16 +1603,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "9c375b2abef0b657aa0b7612b763df5c12a465ab" + "reference": "3f38426b9447521b044fbee56a1b31b18e049042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9c375b2abef0b657aa0b7612b763df5c12a465ab", - "reference": "9c375b2abef0b657aa0b7612b763df5c12a465ab", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3f38426b9447521b044fbee56a1b31b18e049042", + "reference": "3f38426b9447521b044fbee56a1b31b18e049042", "shasum": "" }, "require": { @@ -1659,7 +1659,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.42" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.45" }, "funding": [ { @@ -1675,20 +1675,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T11:59:59+00:00" + "time": "2024-10-21T20:36:41+00:00" }, { "name": "symfony/mime", - "version": "v5.4.41", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42" + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/c71c7a1aeed60b22d05e738197e31daf2120bd42", - "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064", "shasum": "" }, "require": { @@ -1744,7 +1744,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.41" + "source": "https://github.com/symfony/mime/tree/v5.4.45" }, "funding": [ { @@ -1760,24 +1760,24 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:36:24+00:00" + "time": "2024-10-23T20:18:32+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -1823,7 +1823,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -1839,24 +1839,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -1901,7 +1901,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -1917,26 +1917,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -1985,7 +1984,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -2001,24 +2000,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -2066,7 +2065,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -2082,24 +2081,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -2146,80 +2145,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -2235,24 +2161,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -2295,7 +2221,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -2311,24 +2237,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -2375,7 +2301,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -2391,24 +2317,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -2451,7 +2377,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -2467,7 +2393,7 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/service-contracts", @@ -2554,16 +2480,16 @@ }, { "name": "symfony/string", - "version": "v5.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "909cec913edea162a3b2836788228ad45fcab337" + "reference": "7f6807add88b1e2635f3c6de5e1ace631ed7cad2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/909cec913edea162a3b2836788228ad45fcab337", - "reference": "909cec913edea162a3b2836788228ad45fcab337", + "url": "https://api.github.com/repos/symfony/string/zipball/7f6807add88b1e2635f3c6de5e1ace631ed7cad2", + "reference": "7f6807add88b1e2635f3c6de5e1ace631ed7cad2", "shasum": "" }, "require": { @@ -2620,7 +2546,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.42" + "source": "https://github.com/symfony/string/tree/v5.4.45" }, "funding": [ { @@ -2636,20 +2562,20 @@ "type": "tidelift" } ], - "time": "2024-07-20T18:38:32+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/translation", - "version": "v5.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1d702caccb9f091b738696185f778b1bfef7b5b2" + "reference": "98f26acc99341ca4bab345fb14d7b1d7cb825bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1d702caccb9f091b738696185f778b1bfef7b5b2", - "reference": "1d702caccb9f091b738696185f778b1bfef7b5b2", + "url": "https://api.github.com/repos/symfony/translation/zipball/98f26acc99341ca4bab345fb14d7b1d7cb825bed", + "reference": "98f26acc99341ca4bab345fb14d7b1d7cb825bed", "shasum": "" }, "require": { @@ -2717,7 +2643,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.42" + "source": "https://github.com/symfony/translation/tree/v5.4.45" }, "funding": [ { @@ -2733,7 +2659,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:14:19+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/translation-contracts", @@ -2817,20 +2743,20 @@ "packages-dev": [ { "name": "behat/behat", - "version": "v3.14.0", + "version": "v3.15.0", "source": { "type": "git", "url": "https://github.com/Behat/Behat.git", - "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340" + "reference": "132e32fdad69340f503b103a5ccaf5dd72ce7d83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Behat/zipball/2a3832d9cb853a794af3a576f9e524ae460f3340", - "reference": "2a3832d9cb853a794af3a576f9e524ae460f3340", + "url": "https://api.github.com/repos/Behat/Behat/zipball/132e32fdad69340f503b103a5ccaf5dd72ce7d83", + "reference": "132e32fdad69340f503b103a5ccaf5dd72ce7d83", "shasum": "" }, "require": { - "behat/gherkin": "^4.9.0", + "behat/gherkin": "^4.10.0", "behat/transliterator": "^1.2", "ext-mbstring": "*", "php": "^7.2 || ^8.0", @@ -2844,7 +2770,6 @@ }, "require-dev": { "herrera-io/box": "~1.6.1", - "phpspec/prophecy": "^1.15", "phpunit/phpunit": "^8.5 || ^9.0", "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0", "vimeo/psalm": "^4.8" @@ -2881,7 +2806,7 @@ } ], "description": "Scenario-oriented BDD framework for PHP", - "homepage": "http://behat.org/", + "homepage": "https://behat.org/", "keywords": [ "Agile", "BDD", @@ -2898,31 +2823,31 @@ ], "support": { "issues": "https://github.com/Behat/Behat/issues", - "source": "https://github.com/Behat/Behat/tree/v3.14.0" + "source": "https://github.com/Behat/Behat/tree/v3.15.0" }, - "time": "2023-12-09T13:55:02+00:00" + "time": "2024-10-30T07:54:51+00:00" }, { "name": "behat/gherkin", - "version": "v4.9.0", + "version": "v4.10.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", - "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", "shasum": "" }, "require": { "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-22.0.0", + "cucumber/cucumber": "dev-gherkin-24.1.0", "phpunit/phpunit": "~8|~9", - "symfony/yaml": "~3|~4|~5" + "symfony/yaml": "~3|~4|~5|~6|~7" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -2961,9 +2886,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.10.0" }, - "time": "2021-10-12T13:05:09+00:00" + "time": "2024-10-19T14:46:06+00:00" }, { "name": "behat/transliterator", @@ -3226,26 +3151,26 @@ }, { "name": "composer/pcre", - "version": "3.2.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90" + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/ea4ab6f9580a4fd221e0418f2c357cdd39102a90", - "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "conflict": { - "phpstan/phpstan": "<1.11.8" + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan": "^1.11.10", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "^8 || ^9" }, @@ -3285,7 +3210,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.2.0" + "source": "https://github.com/composer/pcre/tree/3.3.1" }, "funding": [ { @@ -3301,28 +3226,28 @@ "type": "tidelift" } ], - "time": "2024-07-25T09:36:02+00:00" + "time": "2024-08-27T18:44:43+00:00" }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -3366,7 +3291,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -3382,7 +3307,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -3530,16 +3455,16 @@ }, { "name": "ergebnis/composer-normalize", - "version": "2.43.0", + "version": "2.44.0", "source": { "type": "git", "url": "https://github.com/ergebnis/composer-normalize.git", - "reference": "4b46330c84bb8f43fac79f5c5a05162fc7c80d75" + "reference": "bd0c446426bb837ae0cc9f97948167e658bd11d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/4b46330c84bb8f43fac79f5c5a05162fc7c80d75", - "reference": "4b46330c84bb8f43fac79f5c5a05162fc7c80d75", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/bd0c446426bb837ae0cc9f97948167e658bd11d2", + "reference": "bd0c446426bb837ae0cc9f97948167e658bd11d2", "shasum": "" }, "require": { @@ -3550,20 +3475,20 @@ "ext-json": "*", "justinrainbow/json-schema": "^5.2.12", "localheinz/diff": "^1.1.1", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "composer/composer": "^2.7.7", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.30.1", - "ergebnis/phpunit-slow-test-detector": "^2.14.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.0", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.19", + "phpunit/phpunit": "^9.6.20", "psalm/plugin-phpunit": "~0.19.0", - "rector/rector": "^1.1.0", - "symfony/filesystem": "^5.4.40", - "vimeo/psalm": "^5.24.0" + "rector/rector": "^1.2.5", + "symfony/filesystem": "^5.4.41", + "vimeo/psalm": "^5.26.1" }, "type": "composer-plugin", "extra": { @@ -3603,37 +3528,37 @@ "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/composer-normalize" }, - "time": "2024-06-16T13:22:18+00:00" + "time": "2024-09-30T21:56:22+00:00" }, { "name": "ergebnis/json", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json.git", - "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0" + "reference": "84051b4e243d6a8e2f8271604b11ffa52d29bc7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json/zipball/a457f25a5ba7ea11fc94f84d53678c5211abfce0", - "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "url": "https://api.github.com/repos/ergebnis/json/zipball/84051b4e243d6a8e2f8271604b11ffa52d29bc7a", + "reference": "84051b4e243d6a8e2f8271604b11ffa52d29bc7a", "shasum": "" }, "require": { "ext-json": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.36.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.1", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpunit/phpunit": "^9.6.18", + "psalm/plugin-phpunit": "~0.19.0", + "rector/rector": "^1.2.5", + "vimeo/psalm": "^5.26.1" }, "type": "library", "extra": { @@ -3668,20 +3593,20 @@ "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json" }, - "time": "2024-01-29T15:09:24+00:00" + "time": "2024-09-27T15:01:05+00:00" }, { "name": "ergebnis/json-normalizer", - "version": "4.5.0", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-normalizer.git", - "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152" + "reference": "859fd3cee417f0b10a8e6ffb8dbeb03587106b8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/f0ee9e70739f121b27fac8b743e4a52b23de2152", - "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/859fd3cee417f0b10a8e6ffb8dbeb03587106b8b", + "reference": "859fd3cee417f0b10a8e6ffb8dbeb03587106b8b", "shasum": "" }, "require": { @@ -3691,20 +3616,20 @@ "ergebnis/json-schema-validator": "^4.2.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "composer/semver": "^3.4.0", + "composer/semver": "^3.4.3", "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.36.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.1", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.4", - "vimeo/psalm": "^5.20.0" + "phpunit/phpunit": "^9.6.19", + "psalm/plugin-phpunit": "~0.19.0", + "rector/rector": "^1.2.5", + "vimeo/psalm": "^5.26.1" }, "suggest": { "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer" @@ -3737,39 +3662,43 @@ "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-normalizer" }, - "time": "2024-01-30T09:10:15+00:00" + "time": "2024-09-27T15:11:59+00:00" }, { "name": "ergebnis/json-pointer", - "version": "3.4.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-pointer.git", - "reference": "b654757d873050622c2166f55ab25d04685261c5" + "reference": "f6ff71e69305b8ab5e4457e374b35dcd0812609b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/b654757d873050622c2166f55ab25d04685261c5", - "reference": "b654757d873050622c2166f55ab25d04685261c5", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/f6ff71e69305b8ab5e4457e374b35dcd0812609b", + "reference": "f6ff71e69305b8ab5e4457e374b35dcd0812609b", "shasum": "" }, "require": { - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { + "ergebnis/composer-normalize": "^2.43.0", "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.32.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.0", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpunit/phpunit": "^9.6.19", + "psalm/plugin-phpunit": "~0.19.0", + "rector/rector": "^1.2.1", + "vimeo/psalm": "^5.25.0" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -3803,38 +3732,38 @@ "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-pointer" }, - "time": "2024-01-29T16:37:15+00:00" + "time": "2024-09-27T15:47:15+00:00" }, { "name": "ergebnis/json-printer", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-printer.git", - "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced" + "reference": "d2e51379dc62d73017a779a78fcfba568de39e0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/549e16fe6de34b8c3aee7b421be12caa552f3ced", - "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/d2e51379dc62d73017a779a78fcfba568de39e0a", + "reference": "d2e51379dc62d73017a779a78fcfba568de39e0a", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.36.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.1", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpunit/phpunit": "^9.6.19", + "psalm/plugin-phpunit": "~0.19.0", + "rector/rector": "~1.2.5", + "vimeo/psalm": "^5.26.1" }, "type": "library", "autoload": { @@ -3865,20 +3794,20 @@ "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-printer" }, - "time": "2024-01-29T15:33:37+00:00" + "time": "2024-09-27T15:19:56+00:00" }, { "name": "ergebnis/json-schema-validator", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-schema-validator.git", - "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef" + "reference": "73f938f8995c6ad1e37d2c1dfeaa8336861f9db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", - "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/73f938f8995c6ad1e37d2c1dfeaa8336861f9db8", + "reference": "73f938f8995c6ad1e37d2c1dfeaa8336861f9db8", "shasum": "" }, "require": { @@ -3886,19 +3815,19 @@ "ergebnis/json-pointer": "^3.4.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.36.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.1", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpunit/phpunit": "^9.6.20", + "psalm/plugin-phpunit": "~0.19.0", + "rector/rector": "^1.2.5", + "vimeo/psalm": "^5.26.1" }, "type": "library", "extra": { @@ -3935,7 +3864,7 @@ "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-schema-validator" }, - "time": "2024-01-29T16:50:15+00:00" + "time": "2024-09-27T15:16:33+00:00" }, { "name": "evenement/evenement", @@ -3986,16 +3915,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { @@ -4035,7 +3964,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, "funding": [ { @@ -4043,20 +3972,20 @@ "type": "github" } ], - "time": "2024-02-07T09:43:46+00:00" + "time": "2024-08-06T10:04:20+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.62.0", + "version": "v3.64.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "627692f794d35c43483f34b01d94740df2a73507" + "reference": "58dd9c931c785a79739310aef5178928305ffa67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/627692f794d35c43483f34b01d94740df2a73507", - "reference": "627692f794d35c43483f34b01d94740df2a73507", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", + "reference": "58dd9c931c785a79739310aef5178928305ffa67", "shasum": "" }, "require": { @@ -4138,7 +4067,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.62.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0" }, "funding": [ { @@ -4146,7 +4075,7 @@ "type": "github" } ], - "time": "2024-08-07T17:03:09+00:00" + "time": "2024-08-30T23:09:38+00:00" }, { "name": "frugan-dev/acf-repeater", @@ -4220,6 +4149,86 @@ }, "time": "2022-11-25T13:49:26+00:00" }, + { + "name": "inpsyde/wonolog", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/inpsyde/Wonolog.git", + "reference": "a0c8bd8c748e25dff384551e234d0fe9cfad5230" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inpsyde/Wonolog/zipball/a0c8bd8c748e25dff384551e234d0fe9cfad5230", + "reference": "a0c8bd8c748e25dff384551e234d0fe9cfad5230", + "shasum": "" + }, + "require": { + "monolog/monolog": "^2.3.5", + "php": ">=7.2 < 8.3", + "psr/log": "^1.1.4", + "wecodemore/wordpress-early-hook": "^1.1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "brain/monkey": "^2.6.1", + "globalis/wp-cli-bin": "^2.7.1", + "inpsyde/php-coding-standards": "^1", + "inpsyde/wp-stubs-versions": "dev-latest", + "mikey179/vfsstream": "~v1.6.11", + "mockery/mockery": "^1.3.6", + "phpunit/phpunit": "^8.5.33", + "roots/wordpress-no-content": ">=6.1.1", + "symfony/process": "^v4.4.44", + "vimeo/psalm": "^4.30.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev", + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "inc/bootstrap.php" + ], + "psr-4": { + "Inpsyde\\Wonolog\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Inpsyde GmbH", + "email": "hello@inpsyde.com", + "homepage": "https://inpsyde.com", + "role": "Company" + } + ], + "description": "Monolog-based logging package for WordPress.", + "keywords": [ + "debug", + "debugging", + "log", + "logger", + "logging", + "monolog", + "psr-3", + "wordpress" + ], + "support": { + "docs": "https://inpsyde.github.io/Wonolog/docs", + "issues": "https://github.com/inpsyde/Wonolog/issues", + "source": "https://github.com/inpsyde/Wonolog" + }, + "time": "2023-03-01T13:57:26+00:00" + }, { "name": "jameelmoses/wordpress-kint-debugger", "version": "v2.0.0", @@ -4453,18 +4462,120 @@ ], "time": "2020-07-06T04:49:32+00:00" }, + { + "name": "monolog/monolog", + "version": "2.9.3", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a30bfe2e142720dfa990d0a7e573997f5d884215", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.9.3" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-04-12T20:52:51+00:00" + }, { "name": "nikic/php-parser", - "version": "v5.1.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -4507,9 +4618,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-07-01T20:03:41+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "php-parallel-lint/php-console-color", @@ -4675,16 +4786,16 @@ }, { "name": "php-stubs/wordpress-stubs", - "version": "v6.6.0", + "version": "v6.6.2", "source": { "type": "git", "url": "https://github.com/php-stubs/wordpress-stubs.git", - "reference": "86e8753e89d59849276dcdd91b9a7dd78bb4abe2" + "reference": "f50fd7ed45894d036e4fef9ab7e5bbbaff6a30cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/86e8753e89d59849276dcdd91b9a7dd78bb4abe2", - "reference": "86e8753e89d59849276dcdd91b9a7dd78bb4abe2", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/f50fd7ed45894d036e4fef9ab7e5bbbaff6a30cc", + "reference": "f50fd7ed45894d036e4fef9ab7e5bbbaff6a30cc", "shasum": "" }, "require-dev": { @@ -4717,9 +4828,9 @@ ], "support": { "issues": "https://github.com/php-stubs/wordpress-stubs/issues", - "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.6.0" + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.6.2" }, - "time": "2024-07-17T08:50:38+00:00" + "time": "2024-09-30T07:10:48+00:00" }, { "name": "phpcsstandards/phpcsextra", @@ -4948,22 +5059,22 @@ }, { "name": "phpstan/extension-installer", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/phpstan/extension-installer.git", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203" + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f6b87faf9fc7978eab2f7919a8760bc9f58f9203", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", "shasum": "" }, "require": { "composer-plugin-api": "^2.0", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.0" + "phpstan/phpstan": "^1.9.0 || ^2.0" }, "require-dev": { "composer/composer": "^2.0", @@ -4984,24 +5095,28 @@ "MIT" ], "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.4.1" + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" }, - "time": "2024-06-10T08:20:49+00:00" + "time": "2024-09-04T20:21:43+00:00" }, { "name": "phpstan/phpstan", - "version": "1.11.10", + "version": "1.12.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f" + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/640410b32995914bde3eed26fa89552f9c2c082f", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", "shasum": "" }, "require": { @@ -5046,7 +5161,7 @@ "type": "github" } ], - "time": "2024-08-08T09:02:50+00:00" + "time": "2024-10-18T11:12:07+00:00" }, { "name": "phpunit/php-timer", @@ -5162,30 +5277,30 @@ }, { "name": "psr/log", - "version": "2.0.0", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5206,9 +5321,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2021-07-14T16:41:46+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "react/cache", @@ -5742,21 +5857,21 @@ }, { "name": "rector/rector", - "version": "1.2.3", + "version": "1.2.8", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "2433e95410aef1b34b15d7f1b6a134365a4ddb39" + "reference": "05755bf43617449c08ee8e50fb840c85ad3b1240" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/2433e95410aef1b34b15d7f1b6a134365a4ddb39", - "reference": "2433e95410aef1b34b15d7f1b6a134365a4ddb39", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/05755bf43617449c08ee8e50fb840c85ad3b1240", + "reference": "05755bf43617449c08ee8e50fb840c85ad3b1240", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.11.9" + "phpstan/phpstan": "^1.12.5" }, "conflict": { "rector/rector-doctrine": "*", @@ -5789,7 +5904,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.2.3" + "source": "https://github.com/rectorphp/rector/tree/1.2.8" }, "funding": [ { @@ -5797,7 +5912,7 @@ "type": "github" } ], - "time": "2024-08-12T16:36:46+00:00" + "time": "2024-10-18T11:54:27+00:00" }, { "name": "roave/security-advisories", @@ -5805,23 +5920,23 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "a143e7459e3961149eb6a8eecc98dfa19799d02a" + "reference": "f7a59dd2b8c3ed9bc58f5679d8eda9ba3ebd86fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/a143e7459e3961149eb6a8eecc98dfa19799d02a", - "reference": "a143e7459e3961149eb6a8eecc98dfa19799d02a", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f7a59dd2b8c3ed9bc58f5679d8eda9ba3ebd86fb", + "reference": "f7a59dd2b8c3ed9bc58f5679d8eda9ba3ebd86fb", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", - "admidio/admidio": "<4.3.10", + "admidio/admidio": "<4.3.12", "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", "aheinze/cockpit": "<2.2", - "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.04.6", + "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2", "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", "aimeos/ai-client-html": ">=2020.04.1,<2020.10.27|>=2021.04.1,<2021.10.22|>=2022.04.1,<2022.10.13|>=2023.04.1,<2023.10.15|>=2024.04.1,<2024.04.7", - "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9", + "aimeos/ai-controller-frontend": "<2020.10.15|>=2021.04.1,<2021.10.8|>=2022.04.1,<2022.10.8|>=2023.04.1,<2023.10.9|==2024.04.1", "aimeos/aimeos-core": ">=2022.04.1,<2022.10.17|>=2023.04.1,<2023.10.17|>=2024.04.1,<2024.04.7", "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", "airesvsg/acf-to-rest-api": "<=3.1", @@ -5830,6 +5945,7 @@ "alextselegidis/easyappointments": "<1.5", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", + "ameos/ameos_tarteaucitron": "<1.2.23", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<=1.7.2|>=2,<=2.1", "amphp/http-client": ">=4,<4.4", @@ -5848,7 +5964,7 @@ "athlon1600/php-proxy-app": "<=3", "austintoddj/canvas": "<=3.4.2", "auth0/wordpress": "<=4.6", - "automad/automad": "<=2.0.0.0-alpha5", + "automad/automad": "<2.0.0.0-alpha5", "automattic/jetpack": "<9.8", "awesome-support/awesome-support": "<=6.0.7", "aws/aws-sdk-php": "<3.288.1", @@ -5862,7 +5978,7 @@ "barrelstrength/sprout-forms": "<3.9", "barryvdh/laravel-translation-manager": "<0.6.2", "barzahlen/barzahlen-php": "<2.0.1", - "baserproject/basercms": "<5.0.9", + "baserproject/basercms": "<=5.1.1", "bassjobsen/bootstrap-3-typeahead": ">4.0.2", "bbpress/bbpress": "<2.6.5", "bcosca/fatfree": "<3.7.2", @@ -5907,21 +6023,23 @@ "codeigniter4/shield": "<1.0.0.0-beta8", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", - "concrete5/concrete5": "<9.3.3", + "concrete5/concrete5": "<9.3.4", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", - "contao/contao": ">=3,<3.5.37|>=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/contao": "<=5.4.1", "contao/core": "<3.5.39", - "contao/core-bundle": "<4.13.40|>=5,<5.3.4", + "contao/core-bundle": "<4.13.49|>=5,<5.3.15|>=5.4,<5.4.3", "contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8", "contao/managed-edition": "<=1.5", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", - "craftcms/cms": "<4.6.2|>=5.0.0.0-beta1,<=5.2.2", + "craftcms/cms": "<4.6.2|>=5,<=5.2.2", "croogo/croogo": "<4", "cuyz/valinor": "<0.12", + "czim/file-handling": "<1.5|>=2,<2.3", "czproject/git-php": "<4.0.3", + "damienharper/auditor-bundle": "<5.2.6", "dapphp/securimage": "<3.6.6", "darylldoyle/safe-svg": "<1.9.10", "datadog/dd-trace": ">=0.30,<0.30.2", @@ -5932,6 +6050,7 @@ "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1|>=7,<7.4", "desperado/xml-bundle": "<=0.1.7", + "dev-lancer/minecraft-motd-parser": "<=1.0.5", "devgroup/dotplant": "<2020.09.14-dev", "directmailteam/direct-mail": "<6.0.3|>=7,<7.0.3|>=8,<9.5.2", "doctrine/annotations": "<1.2.7", @@ -5946,8 +6065,9 @@ "dolibarr/dolibarr": "<19.0.2", "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", - "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.1.8|>=10.2,<10.2.2", - "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "drupal/core": ">=6,<6.38|>=7,<7.96|>=8,<10.2.9|>=10.3,<10.3.6|>=11,<11.0.5", + "drupal/core-recommended": ">=8,<10.2.9|>=10.3,<10.3.6|>=11,<11.0.5", + "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.80|>=8,<10.2.9|>=10.3,<10.3.6|>=11,<11.0.5", "duncanmcclean/guest-entries": "<3.1.2", "dweeves/magmi": "<=0.7.24", "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", @@ -5976,20 +6096,22 @@ "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.35", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", - "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev|>=3.3,<3.3.40", "ezsystems/ezplatform-solr-search-engine": ">=1.7,<1.7.12|>=2,<2.0.2|>=3.3,<3.3.15", "ezsystems/ezplatform-user": ">=1,<1.0.1", "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.31", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", - "ezyang/htmlpurifier": "<4.1.1", + "ezyang/htmlpurifier": "<=4.2", "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", "facturascripts/facturascripts": "<=2022.08", "fastly/magento2": "<1.2.26", "feehi/cms": "<=2.1.1", "feehi/feehicms": "<=2.1.1", "fenom/fenom": "<=2.12.1", + "filament/infolists": ">=3,<3.2.115", + "filament/tables": ">=3,<3.2.115", "filegator/filegator": "<7.8", "filp/whoops": "<2.1.13", "fineuploader/php-traditional-server": "<=1.2.2", @@ -6021,15 +6143,15 @@ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.3", - "froxlor/froxlor": "<2.1.9", + "froxlor/froxlor": "<=2.2.0.0-RC3", "frozennode/administrator": "<=5.0.12", "fuel/core": "<1.8.1", - "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "funadmin/funadmin": "<=5.0.2", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", "getformwork/formwork": "<1.13.1|==2.0.0.0-beta1", "getgrav/grav": "<1.7.46", - "getkirby/cms": "<4.1.1", + "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", "getkirby/kirby": "<=2.5.12", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", @@ -6057,6 +6179,7 @@ "hyn/multi-tenant": ">=5.6,<5.7.2", "ibexa/admin-ui": ">=4.2,<4.2.3|>=4.6.0.0-beta1,<4.6.9", "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3|>=4.5,<4.5.6|>=4.6,<4.6.2", + "ibexa/fieldtype-richtext": ">=4.6,<4.6.10", "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", "ibexa/post-install": "<=1.0.4", "ibexa/solr": ">=4.5,<4.5.4", @@ -6075,6 +6198,7 @@ "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", "in2code/ipandlanguageredirect": "<5.1.2", "in2code/lux": "<17.6.1|>=18,<24.0.2", + "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.4.1", "innologi/typo3-appointments": "<2.0.6", "intelliants/subrion": "<4.2.2", "inter-mediator/inter-mediator": "==5.5", @@ -6104,18 +6228,20 @@ "kelvinmo/simplexrd": "<3.1.1", "kevinpapst/kimai2": "<1.16.7", "khodakhah/nodcms": "<=3", - "kimai/kimai": "<2.16", + "kimai/kimai": "<=2.20.1", "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", "klaviyo/magento2-extension": ">=1,<3", "knplabs/knp-snappy": "<=1.4.2", "kohana/core": "<3.3.3", - "krayin/laravel-crm": "<1.2.2", + "krayin/laravel-crm": "<=1.3", "kreait/firebase-php": ">=3.2,<3.8.1", "kumbiaphp/kumbiapp": "<=1.1.1", "la-haute-societe/tcpdf": "<6.2.22", "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", "laminas/laminas-http": "<2.14.2", + "lara-zeus/artemis": ">=1,<=1.0.6", + "lara-zeus/dynamic-dashboard": ">=3,<=3.0.1", "laravel/fortify": "<1.11.1", "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", "laravel/laravel": ">=5.4,<5.4.22", @@ -6131,13 +6257,14 @@ "librenms/librenms": "<2017.08.18", "liftkit/database": "<2.13.2", "lightsaml/lightsaml": "<1.3.5", - "limesurvey/limesurvey": "<3.27.19", + "limesurvey/limesurvey": "<6.5.12", "livehelperchat/livehelperchat": "<=3.91", - "livewire/livewire": ">2.2.4,<2.2.6|>=3.3.5,<3.4.9", + "livewire/livewire": "<2.12.7|>=3.0.0.0-beta1,<3.5.2", "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "luyadev/yii-helpers": "<1.2.1", - "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch8|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch6|==2.4.7", + "maestroerror/php-heic-to-jpg": "<1.0.5", + "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch10|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch8|>=2.4.7.0-beta1,<2.4.7.0-patch3", "magento/core": "<=1.9.4.5", "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", @@ -6145,11 +6272,13 @@ "magneto/core": "<1.9.4.4-dev", "maikuolan/phpmussel": ">=1,<1.6", "mainwp/mainwp": "<=4.4.3.3", - "mantisbt/mantisbt": "<2.26.2", + "mantisbt/mantisbt": "<=2.26.3", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", - "mautic/core": "<4.4.12|>=5.0.0.0-alpha,<5.0.4", + "mautic/core": "<4.4.13|>=5,<5.1.1", + "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", "mdanter/ecc": "<2", + "mediawiki/cargo": "<3.6.1", "mediawiki/core": "<1.36.2", "mediawiki/matomo": "<2.4.3", "mediawiki/semantic-media-wiki": "<4.0.2", @@ -6183,6 +6312,7 @@ "munkireport/softwareupdate": "<1.6", "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", + "nategood/httpful": "<1", "neoan3-apps/template": "<1.1.1", "neorazorx/facturascripts": "<2022.04", "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", @@ -6205,7 +6335,7 @@ "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", - "october/october": "<=3.4.4", + "october/october": "<=3.6.4", "october/rain": "<1.0.472|>=1.1,<1.1.2", "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", "omeka/omeka-s": "<4.0.3", @@ -6257,7 +6387,7 @@ "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5", "phpoffice/common": "<0.2.9", "phpoffice/phpexcel": "<1.8", - "phpoffice/phpspreadsheet": "<1.16", + "phpoffice/phpspreadsheet": "<1.29.2|>=2,<2.1.1|>=2.2,<2.3", "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.4.3", @@ -6266,9 +6396,10 @@ "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<=1.5.1", + "pimcore/admin-ui-classic-bundle": "<1.5.4", "pimcore/customer-management-framework-bundle": "<4.0.6", "pimcore/data-hub": "<1.2.4", + "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", @@ -6293,13 +6424,13 @@ "processwire/processwire": "<=3.0.229", "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<1.11.6", + "pterodactyl/panel": "<1.11.8", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", "ptrofimov/beanstalk_console": "<1.7.14", "pubnub/pubnub": "<6.1", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6.0-beta", - "pxlrbt/filament-excel": "<2.3.3", + "pxlrbt/filament-excel": "<1.1.14|>=2.0.0.0-alpha,<2.3.3", "pyrocms/pyrocms": "<=3.9.1", "qcubed/qcubed": "<=3.1.1", "quickapps/cms": "<=2.0.0.0-beta2", @@ -6310,7 +6441,7 @@ "rap2hpoutre/laravel-log-viewer": "<0.13", "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<=5.15.1", + "redaxo/source": "<=5.17.1", "remdex/livehelperchat": "<4.29", "reportico-web/reportico": "<=8.1", "rhukster/dom-sanitizer": "<1.0.7", @@ -6366,7 +6497,7 @@ "slim/slim": "<2.6", "slub/slub-events": "<3.0.3", "smarty/smarty": "<4.5.3|>=5,<5.1.1", - "snipe/snipe-it": "<6.4.2", + "snipe/snipe-it": "<7.0.10", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spatie/browsershot": "<3.57.4", @@ -6376,6 +6507,7 @@ "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<24.05.1", + "starcitizentools/citizen-skin": ">=2.6.3,<2.31", "statamic/cms": "<4.46|>=5.3,<5.6.2", "stormpath/sdk": "<9.9.99", "studio-42/elfinder": "<=2.1.64", @@ -6383,7 +6515,7 @@ "subhh/libconnect": "<7.0.8|>=8,<8.1", "sukohi/surpass": "<1", "sulu/form-bundle": ">=2,<2.5.3", - "sulu/sulu": "<1.6.44|>=2,<2.4.17|>=2.5,<2.5.13", + "sulu/sulu": "<1.6.44|>=2,<2.5.21|>=2.6,<2.6.5", "sumocoders/framework-user-bundle": "<1.4", "superbig/craft-audit": "<3.0.2", "swag/paypal": "<5.4.4", @@ -6450,18 +6582,18 @@ "tinymighty/wiki-seo": "<1.2.2", "titon/framework": "<9.9.99", "tobiasbg/tablepress": "<=2.0.0.0-RC1", - "topthink/framework": "<6.0.17|>=6.1,<6.1.5|>=8,<8.0.4", + "topthink/framework": "<6.0.17|>=6.1,<=8.0.4", "topthink/think": "<=6.1.1", "topthink/thinkphp": "<=3.2.3", "torrentpier/torrentpier": "<=2.4.3", "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", - "tribalsystems/zenario": "<9.5.60602", + "tribalsystems/zenario": "<=9.7.61188", "truckersmp/phpwhois": "<=4.3.1", "ttskch/pagination-service-provider": "<1", "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", - "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", + "twig/twig": "<1.44.8|>=2,<2.16.1|>=3,<3.11.1|>=3.12,<3.14", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<10.4.46|>=11,<11.5.40|>=12,<12.4.21|>=13,<13.3.1", "typo3/cms-core": "<=8.7.56|>=9,<=9.5.47|>=10,<=10.4.44|>=11,<=11.5.36|>=12,<=12.4.14|>=13,<=13.1", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", @@ -6511,6 +6643,7 @@ "winter/wn-dusk-plugin": "<2.1", "winter/wn-system-module": "<1.2.4", "wintercms/winter": "<=1.2.3", + "wireui/wireui": "<1.19.3|>=2,<2.1.3", "woocommerce/woocommerce": "<6.6|>=8.8,<8.8.5|>=8.9,<8.9.3", "wp-cli/wp-cli": ">=0.12,<2.5", "wp-graphql/wp-graphql": "<=1.14.5", @@ -6613,7 +6746,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T19:04:53+00:00" + "time": "2024-10-29T22:05:01+00:00" }, { "name": "sebastian/diff", @@ -6683,16 +6816,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.2", + "version": "3.10.3", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", "shasum": "" }, "require": { @@ -6759,20 +6892,20 @@ "type": "open_collective" } ], - "time": "2024-07-21T23:26:44+00:00" + "time": "2024-09-18T10:38:58+00:00" }, { "name": "symfony/config", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e" + "reference": "b9d94b0753da249439694c4a3847f57465b40d1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e", - "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e", + "url": "https://api.github.com/repos/symfony/config/zipball/b9d94b0753da249439694c4a3847f57465b40d1d", + "reference": "b9d94b0753da249439694c4a3847f57465b40d1d", "shasum": "" }, "require": { @@ -6822,7 +6955,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.40" + "source": "https://github.com/symfony/config/tree/v5.4.45" }, "funding": [ { @@ -6838,20 +6971,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-10-22T13:05:35+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "c8409889fdbf48b99271930ea0ebcf3ee5e1ceae" + "reference": "0c199da64bb27e4216ccccb83f451e2ec66b3c4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c8409889fdbf48b99271930ea0ebcf3ee5e1ceae", - "reference": "c8409889fdbf48b99271930ea0ebcf3ee5e1ceae", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0c199da64bb27e4216ccccb83f451e2ec66b3c4b", + "reference": "0c199da64bb27e4216ccccb83f451e2ec66b3c4b", "shasum": "" }, "require": { @@ -6911,7 +7044,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.42" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.45" }, "funding": [ { @@ -6927,20 +7060,20 @@ "type": "tidelift" } ], - "time": "2024-07-25T13:57:40+00:00" + "time": "2024-10-22T18:49:16+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.41", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "6d29dd9340b372fa603f04e6df4dd76bb808591e" + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6d29dd9340b372fa603f04e6df4dd76bb808591e", - "reference": "6d29dd9340b372fa603f04e6df4dd76bb808591e", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", "shasum": "" }, "require": { @@ -6978,7 +7111,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.41" + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" }, "funding": [ { @@ -6994,20 +7127,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:36:24+00:00" + "time": "2024-10-22T13:05:35+00:00" }, { "name": "symfony/finder", - "version": "v5.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0724c51fa067b198e36506d2864e09a52180998a" + "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0724c51fa067b198e36506d2864e09a52180998a", - "reference": "0724c51fa067b198e36506d2864e09a52180998a", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { @@ -7041,7 +7174,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.42" + "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { @@ -7057,20 +7190,20 @@ "type": "tidelift" } ], - "time": "2024-07-22T08:53:29+00:00" + "time": "2024-09-28T13:32:08+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4" + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/bd1afbde6613a8d6b956115e0e14b196191fd0c4", - "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", "shasum": "" }, "require": { @@ -7110,7 +7243,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.40" + "source": "https://github.com/symfony/options-resolver/tree/v5.4.45" }, "funding": [ { @@ -7126,20 +7259,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/process", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046" + "reference": "95f3f19d0f8f06e4253c66a0828ddb69f8b8ede4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/deedcb3bb4669cae2148bc920eafd2b16dc7c046", - "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046", + "url": "https://api.github.com/repos/symfony/process/zipball/95f3f19d0f8f06e4253c66a0828ddb69f8b8ede4", + "reference": "95f3f19d0f8f06e4253c66a0828ddb69f8b8ede4", "shasum": "" }, "require": { @@ -7172,7 +7305,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.40" + "source": "https://github.com/symfony/process/tree/v5.4.45" }, "funding": [ { @@ -7188,20 +7321,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625" + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e9daf3b7c805c747638b2cc48f1649e594f9625", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004", "shasum": "" }, "require": { @@ -7234,7 +7367,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.40" + "source": "https://github.com/symfony/stopwatch/tree/v5.4.45" }, "funding": [ { @@ -7250,20 +7383,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83" + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/81cad0ceab3d61fe14fe941ff18a230ac9c80f83", - "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e", + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e", "shasum": "" }, "require": { @@ -7309,7 +7442,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.40" + "source": "https://github.com/symfony/yaml/tree/v5.4.45" }, "funding": [ { @@ -7325,7 +7458,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "szepeviktor/phpstan-wordpress", @@ -7427,6 +7560,68 @@ }, "time": "2022-08-26T09:36:52+00:00" }, + { + "name": "wecodemore/wordpress-early-hook", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/wecodemore/wordpress-early-hook.git", + "reference": "4a54f490dd1d5a87aa8b8470592df0ec4620be8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wecodemore/wordpress-early-hook/zipball/4a54f490dd1d5a87aa8b8470592df0ec4620be8e", + "reference": "4a54f490dd1d5a87aa8b8470592df0ec4620be8e", + "shasum": "" + }, + "require": { + "php": ">=7.1 < 8.4" + }, + "require-dev": { + "inpsyde/php-coding-standards": "^1.0.0", + "phpunit/phpunit": "^7.5.20 || ^9.6.4", + "roave/security-advisories": "dev-latest", + "roots/wordpress-no-content": ">=6.1.1", + "vimeo/psalm": "^4.30.0" + }, + "type": "library", + "autoload": { + "files": [ + "wordpress-early-hook.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Giuseppe Mazzapica", + "email": "giuseppe.mazzapica@gmail.com", + "homepage": "https://gmazzap.me", + "role": "Developer" + } + ], + "description": "Small library to safely add WordPress hooks before WordPress is loaded.", + "keywords": [ + "actions", + "filters", + "hooks", + "wordpress", + "wordpress actions", + "wordpress filters", + "wordpress hooks", + "wp", + "wp actions", + "wp filters", + "wp hooks" + ], + "support": { + "issues": "https://github.com/wecodemore/wordpress-early-hook/issues", + "source": "https://github.com/wecodemore/wordpress-early-hook" + }, + "time": "2024-01-08T14:44:02+00:00" + }, { "name": "wp-coding-standards/wpcs", "version": "3.1.0", @@ -7513,15 +7708,15 @@ }, { "name": "wpackagist-plugin/advanced-custom-fields", - "version": "6.3.5", + "version": "6.3.10.2", "source": { "type": "svn", "url": "https://plugins.svn.wordpress.org/advanced-custom-fields/", - "reference": "tags/6.3.5" + "reference": "tags/6.3.10.2" }, "dist": { "type": "zip", - "url": "https://downloads.wordpress.org/plugin/advanced-custom-fields.6.3.5.zip" + "url": "https://downloads.wordpress.org/plugin/advanced-custom-fields.6.3.10.2.zip" }, "require": { "composer/installers": "^1.0 || ^2.0" @@ -7529,6 +7724,24 @@ "type": "wordpress-plugin", "homepage": "https://wordpress.org/plugins/advanced-custom-fields/" }, + { + "name": "wpackagist-plugin/classic-editor", + "version": "1.6.5", + "source": { + "type": "svn", + "url": "https://plugins.svn.wordpress.org/classic-editor/", + "reference": "tags/1.6.5" + }, + "dist": { + "type": "zip", + "url": "https://downloads.wordpress.org/plugin/classic-editor.1.6.5.zip" + }, + "require": { + "composer/installers": "^1.0 || ^2.0" + }, + "type": "wordpress-plugin", + "homepage": "https://wordpress.org/plugins/classic-editor/" + }, { "name": "wpackagist-plugin/debug-bar", "version": "1.1.6", @@ -7549,15 +7762,15 @@ }, { "name": "wpackagist-plugin/plugin-check", - "version": "1.0.2", + "version": "1.2.0", "source": { "type": "svn", "url": "https://plugins.svn.wordpress.org/plugin-check/", - "reference": "tags/1.0.2" + "reference": "tags/1.2.0" }, "dist": { "type": "zip", - "url": "https://downloads.wordpress.org/plugin/plugin-check.1.0.2.zip" + "url": "https://downloads.wordpress.org/plugin/plugin-check.1.2.0.zip" }, "require": { "composer/installers": "^1.0 || ^2.0" @@ -7642,6 +7855,7 @@ "minimum-stability": "stable", "stability-flags": { "hoppinger/advanced-custom-fields-wpcli": 20, + "inpsyde/wonolog": 20, "roave/security-advisories": 20 }, "prefer-stable": false, @@ -7649,7 +7863,7 @@ "platform": { "php": "^8.0" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "8.0" }, diff --git a/acf-uppy/exclude_from.txt b/upload-field-with-uppy-for-acf/exclude_from.txt similarity index 100% rename from acf-uppy/exclude_from.txt rename to upload-field-with-uppy-for-acf/exclude_from.txt diff --git a/acf-uppy/grumphp.yml.dist b/upload-field-with-uppy-for-acf/grumphp.yml.dist similarity index 95% rename from acf-uppy/grumphp.yml.dist rename to upload-field-with-uppy-for-acf/grumphp.yml.dist index 677fbc9..1a5db79 100644 --- a/acf-uppy/grumphp.yml.dist +++ b/upload-field-with-uppy-for-acf/grumphp.yml.dist @@ -19,7 +19,8 @@ grumphp: phplint: exclude: ['symlink', 'vendor'] - phpmnd: ~ + phpmnd: + exclude_path: ['vendor'] phpparser: ignore_patterns: ['symlink', 'vendor'] diff --git a/acf-uppy/include_from.txt b/upload-field-with-uppy-for-acf/include_from.txt similarity index 82% rename from acf-uppy/include_from.txt rename to upload-field-with-uppy-for-acf/include_from.txt index c89817e..7cd8446 100644 --- a/acf-uppy/include_from.txt +++ b/upload-field-with-uppy-for-acf/include_from.txt @@ -11,5 +11,5 @@ - vendor/predis/predis/docker/unstable_cluster/ + vendor/** + readme.txt -+ acf-uppy.php ++ upload-field-with-uppy-for-acf.php - * diff --git a/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.mo b/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..f6affae67fdb50c2d69ba07cdc148ebe2e9fda21 GIT binary patch literal 2911 zcmai0&2tn*6mJDZ*Kf2GtE7CSKt9Y&vKtVbRIGwPtP~(ANWj}xXQp?yW6$*1-Lu(n z@?>dw)vE`+cvdgouyXR|*@MMDpnrfTf88_55)3l6lV5+ley`uhykGu2eDE8F=T*FK z;r$u!QM}ilz#lyKfJcD80?z~g03HS&ev+{lfG2=&1LuHKz+1qRz!C5@;J3hO;7>p= ze;?@e{SAB%c<2CQ&jUXIehs|Z&hG<^Lw3R#^KI=U$6xzB+w0q+671O5*5a<;>m z57<}0*MY~LW9%K^1)vX^x9uNXF~k(tV=%er!BO@iUZ`YG9A)>sG7U397golGEgdf->x-PMa;-910`+ zvgIQ|TqznzB`nSG%U68Jwl^I-tdsV%z zWIFLOX4m<+F<|9g!ETg-MqJgf2NwiShlIO{n5~9rY;sGSoJfbIOu3@U=yfHEX~b7> z3loSN&p9HkxDzI3YbCGUP#fsZ*jlAD&uB>smC>d|(ATPJD_FX?xa5<=>5ewpiV=1< zWp2nF@htP3rP!n?e`bo(+ByVe5OlSy z<|qPoN2)C42F40mz#X4lIwj&fCRy-Y%$zwrO=8Sb_b7plO5~71@Iuza*oo3gUGAuf zH>&(}%Ve5hk>@)^f-JJYwFl^fAbF_KF4MXI$)2rFe?BS_Jz;6*~qjw{K_ z-Q|R&>o2c%t}kD|GV!1r&vq7di6}uE!kwVH#%`ukD57~vhum1<7S>jmq6-r_Z*?F{ zbfrwSFZ_fqtV`EfQMKVJTGFPl36=QfF|`Z5dH?xixNxeZV++(hJ>U5_`cRa@G&f(- zB9o5h;&WJUCebZjn^Y_|_7iF@u)BLzZ29QfYpA${`u+L7z;8U?$InBVbfbG>uD?gQ#}%EIUWf#oGMwa1x=EB)}1V58TY zIB`pGlMYwlMl=gY_S?8JPF0 z6=70s&|$d^G=hOre9~D7O)#w`*h7uDCz9GZNiwtrv{PA0$Tm$PMSDQ~OD7pxUnT~! zlnx*2giHilp9+iuP5bl79+5{<3Qproz~@E^#8zqRcmdNIN*jKojPJ0FA52K5(XT|F zds=LnW~JW#k%R^8X^I@@a&_Z zrxJ#AUP`1O$AMdtwtt|JFmeC|xNlwVkWb(v(2<^oEC^}Dsgm2jkV7ArG5biDbg@Q< zl6UXo;NwULR=nya)$nA(N8U-E=dvzy;bqENk2Hw3sI}s7C9OgXjRgNR%$E6NRn$yDKOS4@T;(*s3gK63vd?L zJFwOsF=3%d(*Dwc!bn3;%UzR7-E*L&vSm~g%IGc#1J%CHb98+t{69H9PY;vYZk@HY F^)KHBXJ7yT literal 0 HcmV?d00001 diff --git a/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.po b/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.po new file mode 100644 index 0000000..45a30fa --- /dev/null +++ b/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf-it_IT.po @@ -0,0 +1,117 @@ +msgid "" +msgstr "" +"Project-Id-Version: upload-field-with-uppy-for-acf\n" +"Report-Msgid-Bugs-To: https://wordpress.org/tags/_s\n" +"POT-Creation-Date: 2024-10-30 12:28+0100\n" +"PO-Revision-Date: 2024-10-30 12:35+0100\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"Language: it_IT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.5\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_ex;_x;_ex;_n:1,2;_n:1,2,4c;_nx:1,2;_nx:1,2,4c;_n_noop:1,2;_n_noop:1,2,4c;_nx_noop:1,2;_nx_noop:1,2,4c;esc_html__;esc_html_e;esc_html_x;esc_attr__;esc_attr_e;esc_attr_x\n" +"X-Poedit-Basepath: ..\n" +"X-Crowdin-Project: upload-field-with-uppy-for-acf\n" +"X-Crowdin-Project-ID: 732521\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: upload-field-with-uppy-for-acf.pot\n" +"X-Crowdin-File-ID: 22\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SearchPathExcluded-1: *.rst\n" + +#: src/Bootstrap.php:96 src/Field.php:70 +msgid "Upload Field with Uppy for ACF" +msgstr "" + +#: src/Bootstrap.php:98 +#, php-format +msgid "%1$s plugin is required." +msgstr "È richiesto il plugin %1$s ." + +#: src/Bootstrap.php:98 +msgid "Advanced Custom Fields" +msgstr "" + +#: src/Field.php:77 +msgid "Uppy" +msgstr "" + +#: src/Field.php:87 +msgid "Upload Field with Uppy for ACF is a WordPress plugin that adds a new \"Uppy\" custom field to the list of fields of the Advanced Custom Fields plugin." +msgstr "Upload Field with Uppy for ACF è un plugin di WordPress che aggiunge un nuovo campo personalizzato \"Uppy\" all'elenco dei campi del plugin Advanced Custom Fields." + +#: src/Field.php:125 +msgid "There was a technical problem, please try again later." +msgstr "Si è verificato un problema tecnico, riprova più tardi." + +#: src/Field.php:210 src/Field.php:319 src/Field.php:426 src/Field.php:606 +#: src/Field.php:628 src/Field.php:688 src/Field.php:707 src/Field.php:937 +#, php-format +msgid "Error reading \"%1$s\"" +msgstr "Errore nel leggere \"%1$s\"" + +#: src/Field.php:359 +#, php-format +msgid "Error creating symlink_path \"%1$s\"" +msgstr "Errore nel creare symlink_path \"%1$s\"" + +#: src/Field.php:467 +msgid "Max file size" +msgstr "Dimensione massima file" + +#: src/Field.php:472 src/Field.php:493 src/Field.php:511 +#, php-format +msgid "Default: %1$s" +msgstr "Predefinito: %1$s" + +#: src/Field.php:486 +msgid "Allowed file types" +msgstr "Tipi di file consentiti" + +#: src/Field.php:490 +msgid "Wildcards mime types (e.g. image/*), exact mime types (e.g. image/jpeg), or file extensions (e.g. .jpg)." +msgstr "Caratteri jolly per i tipi di mime (ad esempio, immagine/*), tipi di mime esatti (ad esempio, immagine/jpeg) o estensioni di file (ad esempio, .jpg)." + +#: src/Field.php:491 +msgid "One value for each line." +msgstr "Un valore per ogni riga." + +#: src/Field.php:504 +msgid "Uploads path" +msgstr "Percorso di caricamento" + +#: src/Field.php:508 +msgid "Absolute path to the directory where to save all files." +msgstr "Percorso assoluto alla directory in cui salvare tutti i file." + +#: src/Field.php:509 +msgid "It can also be outside the public directory." +msgstr "Può anche essere al di fuori della directory pubblica." + +#: src/Field.php:805 +#, php-format +msgid "Wrong tmp_path \"%1$s\" of file \"%2$s\"" +msgstr "Errato tmp_path \"%1$s\" del file \"%2$s\"" + +#: src/Field.php:823 +#, php-format +msgid "Error creating dest_path \"%1$s\"" +msgstr "Errore nel creare dest_path \"%1$s\"" + +#: src/Field.php:845 +#, php-format +msgid "Error moving file from \"%1$s\" to \"%2$s\"" +msgstr "Errore durante lo spostamento del file da \"%1$s\" a \"%2$s\"" + +#: src/Middleware/Auth.php:28 +msgid "Unauthorized" +msgstr "Non Autorizzato" + +#: src/Middleware/UploadDir.php:53 +msgid "Wrong headers" +msgstr "Intestazioni sbagliate" diff --git a/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf.pot b/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf.pot new file mode 100644 index 0000000..dc42031 --- /dev/null +++ b/upload-field-with-uppy-for-acf/lang/upload-field-with-uppy-for-acf.pot @@ -0,0 +1,111 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: upload-field-with-uppy-for-acf\n" +"Report-Msgid-Bugs-To: https://wordpress.org/tags/_s\n" +"POT-Creation-Date: 2024-10-30 12:28+0100\n" +"PO-Revision-Date: 2017-MO-DA HO:MI+ZONE\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_ex;_x;_ex;_n:1,2;_n:1,2,4c;_nx:1,2;_nx:1,2,4c;_n_noop:1,2;_n_noop:1,2,4c;_nx_noop:1,2;_nx_noop:1,2,4c;esc_html__;esc_html_e;esc_html_x;esc_attr__;esc_attr_e;esc_attr_x\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SearchPathExcluded-1: *.rst\n" + +#: src/Bootstrap.php:96 src/Field.php:70 +msgid "Upload Field with Uppy for ACF" +msgstr "" + +#: src/Bootstrap.php:98 +#, php-format +msgid "%1$s plugin is required." +msgstr "" + +#: src/Bootstrap.php:98 +msgid "Advanced Custom Fields" +msgstr "" + +#: src/Field.php:77 +msgid "Uppy" +msgstr "" + +#: src/Field.php:87 +msgid "Upload Field with Uppy for ACF is a WordPress plugin that adds a new \"Uppy\" custom field to the list of fields of the Advanced Custom Fields plugin." +msgstr "" + +#: src/Field.php:125 +msgid "There was a technical problem, please try again later." +msgstr "" + +#: src/Field.php:210 src/Field.php:319 src/Field.php:426 src/Field.php:606 +#: src/Field.php:628 src/Field.php:688 src/Field.php:707 src/Field.php:937 +#, php-format +msgid "Error reading \"%1$s\"" +msgstr "" + +#: src/Field.php:359 +#, php-format +msgid "Error creating symlink_path \"%1$s\"" +msgstr "" + +#: src/Field.php:467 +msgid "Max file size" +msgstr "" + +#: src/Field.php:472 src/Field.php:493 src/Field.php:511 +#, php-format +msgid "Default: %1$s" +msgstr "" + +#: src/Field.php:486 +msgid "Allowed file types" +msgstr "" + +#: src/Field.php:490 +msgid "Wildcards mime types (e.g. image/*), exact mime types (e.g. image/jpeg), or file extensions (e.g. .jpg)." +msgstr "" + +#: src/Field.php:491 +msgid "One value for each line." +msgstr "" + +#: src/Field.php:504 +msgid "Uploads path" +msgstr "" + +#: src/Field.php:508 +msgid "Absolute path to the directory where to save all files." +msgstr "" + +#: src/Field.php:509 +msgid "It can also be outside the public directory." +msgstr "" + +#: src/Field.php:805 +#, php-format +msgid "Wrong tmp_path \"%1$s\" of file \"%2$s\"" +msgstr "" + +#: src/Field.php:823 +#, php-format +msgid "Error creating dest_path \"%1$s\"" +msgstr "" + +#: src/Field.php:845 +#, php-format +msgid "Error moving file from \"%1$s\" to \"%2$s\"" +msgstr "" + +#: src/Middleware/Auth.php:28 +msgid "Unauthorized" +msgstr "" + +#: src/Middleware/UploadDir.php:53 +msgid "Wrong headers" +msgstr "" diff --git a/acf-uppy/phpstan.neon.dist b/upload-field-with-uppy-for-acf/phpstan.neon.dist similarity index 89% rename from acf-uppy/phpstan.neon.dist rename to upload-field-with-uppy-for-acf/phpstan.neon.dist index 8306f3d..04131ed 100755 --- a/acf-uppy/phpstan.neon.dist +++ b/upload-field-with-uppy-for-acf/phpstan.neon.dist @@ -1,7 +1,7 @@ parameters: level: 5 bootstrapFiles: - - tests/stubs/constants.stub + - tests/bootstrap.php scanDirectories: - /bitnami/wordpress/wp-content/plugins/advanced-custom-fields/includes paths: @@ -11,6 +11,3 @@ parameters: - ./symlink/ #ignoreErrors: # - '#^Function apply_filters(_ref_array)? invoked with [34567] parameters, 2 required\.$#' - - - diff --git a/acf-uppy/psalm.xml.dist b/upload-field-with-uppy-for-acf/psalm.xml.dist similarity index 100% rename from acf-uppy/psalm.xml.dist rename to upload-field-with-uppy-for-acf/psalm.xml.dist diff --git a/upload-field-with-uppy-for-acf/readme.txt b/upload-field-with-uppy-for-acf/readme.txt new file mode 100644 index 0000000..fcc2116 --- /dev/null +++ b/upload-field-with-uppy-for-acf/readme.txt @@ -0,0 +1,32 @@ +=== Upload Field with Uppy for ACF === +Contributors: Frugan +Tags: acf, fields, repeater, upload, tus +Requires at least: 5.6.0 +Tested up to: 6.6.1 +Stable tag: 3.0.0 +Requires PHP: 8.0 +License: GPLv3 or later +License URI: http://www.gnu.org/licenses/gpl-3.0.html +Donate link: https://buymeacoff.ee/frugan + +Upload Field with Uppy for ACF + +== Description == + +__Upload Field with Uppy for ACF__ is a WordPress plugin that adds a new `Uppy` custom field to the list of fields of the [Advanced Custom Fields](https://www.advancedcustomfields.com) plugin. This custom field allows you to __upload files of all types and sizes__ using the [TUS protocol](https://tus.io) and the [Uppy JS uploader](https://uppy.io), overcoming the limitations of the default ACF `File` field. With __Upload Field with Uppy for ACF__, you no longer need to increase server-side INI parameters such as `upload_max_filesize`, `post_max_size`, `max_execution_time` and `memory_limit`. + += Requirements = + +@see https://github.com/frugan-dev/upload-field-with-uppy-for-acf?tab=readme-ov-file#requirements + +== Installation == + +@see https://github.com/frugan-dev/upload-field-with-uppy-for-acf?tab=readme-ov-file#installation + +== Changelog == + +@see https://github.com/frugan-dev/upload-field-with-uppy-for-acf/blob/master/CHANGELOG.md + += Links = +* [Github](https://github.com/frugan-dev/upload-field-with-uppy-for-acf) +* [Support](https://github.com/frugan-dev/upload-field-with-uppy-for-acf/issues) diff --git a/acf-uppy/rector.php b/upload-field-with-uppy-for-acf/rector.php similarity index 92% rename from acf-uppy/rector.php rename to upload-field-with-uppy-for-acf/rector.php index 14074e6..c5ab75f 100644 --- a/acf-uppy/rector.php +++ b/upload-field-with-uppy-for-acf/rector.php @@ -3,7 +3,7 @@ declare(strict_types=1); /* - * This file is part of the ACF Uppy Field WordPress plugin. + * This file is part of the WordPress plugin "Upload Field with Uppy for ACF". * * (ɔ) Frugan * diff --git a/upload-field-with-uppy-for-acf/src/Bootstrap.php b/upload-field-with-uppy-for-acf/src/Bootstrap.php new file mode 100644 index 0000000..9bb4c2f --- /dev/null +++ b/upload-field-with-uppy-for-acf/src/Bootstrap.php @@ -0,0 +1,120 @@ + + * + * This source file is subject to the GNU GPLv3 or later license that is bundled + * with this source code in the file LICENSE. + */ + +namespace FruganUFWUFACF; + +if (!\defined('ABSPATH')) { + exit; +} + +class Bootstrap +{ + private static ?self $instance = null; + + protected function __construct() + { + add_action('muplugins_loaded', [$this, 'muplugins_loaded']); + add_action('plugins_loaded', [$this, 'plugins_loaded']); + add_action('init', [$this, 'init'], 0); + add_action('admin_init', [$this, 'admin_init'], 999); + add_action('deactivated_plugin', [$this, 'deactivated_plugin']); + + if (!$this->is_mu_plugin()) { + delete_option(FRUGAN_UFWUFACF_NAME.'__activated'); + + register_activation_hook(FRUGAN_UFWUFACF_BASENAME, static fn (): array => [Field::class, 'activate']); + register_deactivation_hook(FRUGAN_UFWUFACF_BASENAME, static fn (): array => [Field::class, 'deactivate']); + } + } + + public static function get_instance(): self + { + if (!self::$instance instanceof self) { + // @phpstan-ignore-next-line + self::$instance = new static(); + } + + return self::$instance; + } + + public function muplugins_loaded(): void + { + if ($this->is_mu_plugin()) { + load_muplugin_textdomain( + FRUGAN_UFWUFACF_NAME, + trailingslashit(FRUGAN_UFWUFACF_NAME).'lang' + ); + } + } + + public function plugins_loaded(): void + { + if (!$this->is_mu_plugin()) { + load_plugin_textdomain( + FRUGAN_UFWUFACF_NAME, + false, + trailingslashit(FRUGAN_UFWUFACF_NAME).'lang' + ); + } + } + + public function init(): void + { + if (!class_exists('acf') || !\function_exists('acf_register_field_type')) { + return; + } + + if ($this->is_mu_plugin() && !get_option(FRUGAN_UFWUFACF_NAME.'__activated')) { + Field::activate(); + update_option(FRUGAN_UFWUFACF_NAME.'__activated', true); + } + + acf_register_field_type(Field::class); + } + + public function admin_init(): void + { + if (!class_exists('acf')) { + $this->deactivate(); + + if (isset($_GET['activate'])) { + unset($_GET['activate']); + } + + add_action('admin_notices', static function (): void { + echo '
'; + echo '

'.esc_html__('Upload Field with Uppy for ACF', 'upload-field-with-uppy-for-acf').'

'; + // translators: %s: plugin name + echo '

'.esc_html(\sprintf(__('%1$s plugin is required.', 'upload-field-with-uppy-for-acf'), __('Advanced Custom Fields', 'upload-field-with-uppy-for-acf'))).'

'; + echo '
'; + }); + } + } + + public function deactivated_plugin(string $plugin): void + { + if (\in_array($plugin, ['advanced-custom-fields/acf.php', 'advanced-custom-fields-pro/acf.php'], true)) { + $this->deactivate(); + } + } + + private function deactivate(): void + { + deactivate_plugins(FRUGAN_UFWUFACF_BASENAME); + } + + private function is_mu_plugin(): bool + { + return \defined('WPMU_PLUGIN_DIR') && str_contains(FRUGAN_UFWUFACF_PATH, WPMU_PLUGIN_DIR); + } +} diff --git a/upload-field-with-uppy-for-acf/src/Field.php b/upload-field-with-uppy-for-acf/src/Field.php new file mode 100644 index 0000000..7f450f5 --- /dev/null +++ b/upload-field-with-uppy-for-acf/src/Field.php @@ -0,0 +1,1070 @@ + + * + * This source file is subject to the GNU GPLv3 or later license that is bundled + * with this source code in the file LICENSE. + */ + +namespace FruganUFWUFACF; + +use Diversen\Sendfile; +use FruganUFWUFACF\Middleware\Auth; +use FruganUFWUFACF\Middleware\UploadDir; +use FruganUFWUFACF\Middleware\UploadMetadata; +use Inpsyde\Wonolog\Configurator; +use TusPhp\Cache\AbstractCache; +use TusPhp\Events\TusEvent; +use TusPhp\Tus\Server; + +if (!\defined('ABSPATH')) { + exit; +} + +/** + * Class Field. + * + * @property string $title + */ +class Field extends \acf_field +{ + /** + * Controls field type visibilty in REST requests. + * + * @var bool + */ + public $show_in_rest = true; + + public string $slug; + + public ?Server $server = null; + + public array $paths = []; + + /** + * Environment values relating to the theme or plugin. + * + * @var array plugin or theme context such as 'url' and 'version' + */ + private array $env; + + /** + * Constructor. + */ + public function __construct() + { + $this->slug = 'uppy'; + + /* + * Field type reference used in PHP and JS code. + * + * No spaces. Underscores allowed. + */ + $this->name = FRUGAN_UFWUFACF_NAME_UNDERSCORE; + + $this->title = __('Upload Field with Uppy for ACF', 'upload-field-with-uppy-for-acf'); + + /* + * Field type label. + * + * For public-facing UI. May contain spaces. + */ + $this->label = __('Uppy', 'upload-field-with-uppy-for-acf'); + + // The category the field appears within in the field type picker. + $this->category = 'content'; // basic | content | choice | relational | jquery | layout | CUSTOM GROUP NAME + + /* + * Field type Description. + * + * For field descriptions. May contain spaces. + */ + $this->description = __('Upload Field with Uppy for ACF is a WordPress plugin that adds a new "Uppy" custom field to the list of fields of the Advanced Custom Fields plugin.', 'upload-field-with-uppy-for-acf'); + + /* + * Field type Doc URL. + * + * For linking to a documentation page. Displayed in the field picker modal. + */ + $this->doc_url = 'https://github.com/frugan-dev/upload-field-with-uppy-for-acf'; + + /* + * Field type Tutorial URL. + * + * For linking to a tutorial resource. Displayed in the field picker modal. + */ + $this->tutorial_url = 'https://github.com/frugan-dev/upload-field-with-uppy-for-acf'; + + $this->set_server(); + + $wp_upload_dir = wp_upload_dir(); + + // Defaults for your custom user-facing settings for this field type. + $this->defaults = [ + 'dest_path' => apply_filters($this->name.'/dest_path', trailingslashit($wp_upload_dir['basedir']).$this->slug), + 'max_file_size' => 10, + // https://www.iana.org/assignments/media-types/media-types.xhtml + 'allowed_file_types' => null, + ]; + + /* + * Strings used in JavaScript code. + * + * Allows JS strings to be translated in PHP and loaded in JS via: + * + * ```js + * const errorMessage = acf._e("uppy", "error"); + * ``` + */ + $this->l10n = [ + 'technical_problem' => __('There was a technical problem, please try again later.', 'upload-field-with-uppy-for-acf'), + ]; + + $this->env = [ + 'version' => FRUGAN_UFWUFACF_VERSION, + 'url' => FRUGAN_UFWUFACF_URL, + 'path' => FRUGAN_UFWUFACF_PATH, + 'debug' => WP_DEBUG, + 'locale' => get_locale(), + 'tmp_path' => apply_filters($this->name.'/tmp_path', trailingslashit(sys_get_temp_dir()).trailingslashit($this->slug).get_current_user_id()), + 'symlink_url' => apply_filters($this->name.'/symlink_url', FRUGAN_UFWUFACF_URL.'symlink'), + 'symlink_path' => apply_filters($this->name.'/symlink_path', FRUGAN_UFWUFACF_PATH.'symlink'), + 'api_path' => home_url('/'.apply_filters($this->name.'/api_path', 'wp-tus')), + 'cache_ttl' => apply_filters($this->name.'/cache_ttl', $this->server->getCache()->getTtl()), // default: 86400 + 'cache_busting' => \defined('FRUGAN_UFWUFACF_CACHE_BUSTING_ENABLED') && !empty(FRUGAN_UFWUFACF_CACHE_BUSTING_ENABLED) && !is_numeric(FRUGAN_UFWUFACF_CACHE_BUSTING_ENABLED) && filter_var(FRUGAN_UFWUFACF_CACHE_BUSTING_ENABLED, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ? true : false, + ]; + + /* + * Field type preview image. + * + * A preview image for the field type in the picker modal. + */ + // $this->preview_image = $this->env['url'] . '/asset/img/preview-custom.png'; + + $this->setup_server(); + $this->setup_rewites(); + + parent::__construct(); + + add_action('parse_request', [$this, 'parse_request'], 0); + add_action('wp', [$this, 'wp']); + add_action('before_delete_post', [$this, 'before_delete_post'], 10, 2); + add_action('acf/save_post', [$this, 'save_post']); + } + + public function set_server(): void + { + if ($this->server instanceof Server) { + return; + } + + $this->server = new Server( + // Either redis, file or apcu. Leave empty for file based cache. + // https://github.com/ankitpokhrel/tus-php/issues/408#issuecomment-1250229371 + // It is not advised to use FileStore in production. FileStore was initially designed for development purposes + // and may not work properly in many cases. Please use redis or apcu cache in prod. + apply_filters($this->name.'/cache', 'apcu') + ); + } + + public function get_server() + { + return $this->server; + } + + public function setup_server(): void + { + $this->server->setApiPath( + // tus server endpoint. + '/'.apply_filters($this->name.'/api_path', 'wp-tus') + ); + + // https://github.com/ankitpokhrel/tus-php/issues/102 + $cache = $this->server->getCache(); + + if ($cache instanceof AbstractCache) { + $cache->setTtl($this->env['cache_ttl']); + } + + $this->server->middleware()->add( + Auth::class, + UploadMetadata::class, + new UploadDir($this->env, $this->server) + ); + + $this->server->event()->addListener( + 'tus-server.upload.complete', + function (TusEvent $tusEvent): void { + $fileMeta = $tusEvent->getFile()->details(); + $fieldName = basename(\dirname($fileMeta['file_path'])); + + $dirs = glob(trailingslashit($this->server->getUploadDir()).'*'); + + if (false === $dirs) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), trailingslashit($this->server->getUploadDir()).'*'))); + } + + foreach ($dirs as $dir) { + if ($fileMeta['file_path'] === $dir) { + continue; + } + + if (is_file($dir)) { + wp_delete_file($dir); + } + } + + $requestKey = $tusEvent->getRequest()->key(); + + $cacheable = $this->server->getCache(); + + // getActualCacheKey() method is public only in FileStore + // https://github.com/ankitpokhrel/tus-php/blob/v2.1.0/src/Cache/FileStore.php#L267 + if (!method_exists($cacheable, 'getActualCacheKey') || !\is_callable([$cacheable, 'getActualCacheKey'])) { + return; + } + + // https://github.com/ankitpokhrel/tus-php/issues/102 + foreach ($cacheable->keys() as $cacheKey) { + if ($cacheable->getActualCacheKey($requestKey) === $cacheKey) { + continue; + } + + if ($oldFileMeta = $cacheable->get($cacheKey)) { + if (preg_match('~'.preg_quote('/'.get_current_user_id().'/'.$fieldName.'/').'~', $oldFileMeta['file_path'])) { + $cacheable->delete($cacheKey); + } + } + } + } + ); + } + + // https://github.com/ankitpokhrel/tus-php/wiki/WordPress-Integration + public function setup_rewites(): void + { + global $wp; + + $wp->add_query_var('tus'); + $wp->add_query_var($this->name.'_action'); + $wp->add_query_var($this->name.'_pubkey'); + + // add_rewrite_tag( '%tus%', '([^&]+)' ); + add_rewrite_rule('^'.apply_filters($this->name.'/api_path', 'wp-tus').'/?([^/]*)/?([^/]*)/?$', 'index.php?tus=$matches[1]', 'top'); + add_rewrite_rule('^'.apply_filters($this->name.'/base_path', $this->slug).'/([^/]+)/([0-9]{1,})/([^/]+)/?$', 'index.php?'.$this->name.'_action=$matches[1]&page_id=$matches[2]&'.$this->name.'_pubkey=$matches[3]', 'top'); + } + + public function parse_request($wp): void + { + if (isset($wp->query_vars['tus'])) { + $response = $this->server->serve(); + $response->send(); + + exit; + } + + if (empty($wp->query_vars[$this->name.'_action']) || empty($wp->query_vars['page_id']) || empty($wp->query_vars[$this->name.'_pubkey'])) { + return; + } + + $postId = (int) $wp->query_vars['page_id']; + $postType = get_post_type($postId); + + switch ($wp->query_vars[$this->name.'_action']) { + case 'download': + $fieldsObj = get_field_objects($postId); + + if (!empty($fieldsObj)) { + $destFiles = $this->get_dest_files($fieldsObj, $postId); + + if (!empty($destFiles)) { + foreach ($destFiles as $destFile) { + $hash = apply_filters($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_hash', wp_hash($destFile), $destFile, $postId); + + if (!empty($postType)) { + $hash = apply_filters($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_hash/type='.$postType, $hash, $destFile, $postId); + } + + if ($wp->query_vars[$this->name.'_pubkey'] === $hash) { + $found = true; + + break; + } + } + + if (!empty($found)) { + $allow = apply_filters($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_allow', true, $destFile, $postId); + + if (!empty($postType)) { + $allow = apply_filters($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_allow/type='.$postType, $allow, $destFile, $postId); + } + + if (!empty($allow)) { + require_once ABSPATH.'/wp-admin/includes/file.php'; + WP_Filesystem(); + + global $wp_filesystem; + + $i = 0; + $paths = glob(trailingslashit($this->env['symlink_path']).'*'); + + if (false === $paths) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), trailingslashit($this->env['symlink_path']).'*'))); + } + + foreach ($paths as $path) { + if (is_dir($path)) { + if (basename($path) === $wp->query_vars[$this->name.'_pubkey']) { + continue; + } + + // https://stackoverflow.com/a/34512584 + $stat = stat($path); + + if (false !== $stat) { + $diff = ((time() - $stat['mtime']) / (60 * 60 * 24)); + + if ($diff >= apply_filters($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_symlink_delete_days', 1)) { + @$wp_filesystem->rmdir($path, true); + } + } + + ++$i; + + if ($i > apply_filters($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_symlink_delete_max', 10)) { + break; + } + } + } + + $symlink_path = trailingslashit($this->env['symlink_path']).trailingslashit($wp->query_vars[$this->name.'_pubkey']); + + if (is_link($symlink_path)) { + $symlink_path = readlink($symlink_path); + } + + $symlinkFile = $symlink_path.basename($destFile); + + if (false === wp_mkdir_p($symlink_path)) { + wp_die( + esc_html(\sprintf( + // translators: %1$s: symlink_path + __('Error creating symlink_path "%1$s"', 'upload-field-with-uppy-for-acf'), + $symlink_path + )), + 500, + ['back_link' => true] + ); + } + + if (!is_link($symlinkFile)) { + if (true !== @symlink($destFile, $symlinkFile)) { + @exec('ln -s '.escapeshellcmd($destFile).' '.escapeshellcmd($symlinkFile), $out, $status); + } + } + + if (is_link($symlinkFile)) { + wp_safe_redirect(trailingslashit($this->env['symlink_url']).trailingslashit($wp->query_vars[$this->name.'_pubkey']).basename($destFile)); + + exit; + } + + // https://stackoverflow.com/a/1395173/3929620 + // https://zinoui.com/blog/download-large-files-with-php + // https://github.com/diversen/http-send-file + // https://github.com/apfelbox/PHP-File-Download + try { + (new Sendfile())->send($destFile); + + exit; + } catch (\Exception $e) { + wp_die( + esc_html($e->getMessage()), + 500, + ['back_link' => true] + ); + } + } + } + } + } + + break; + } + + do_action($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_fallback', $postId); + do_action($this->name.'/'.$wp->query_vars[$this->name.'_action'].'_fallback/type='.$postType, $postId); + } + + public function wp($wp): void + { + if (!is_user_logged_in()) { + return; + } + + if (\defined('DOING_AJAX') && DOING_AJAX) { + return; + } + + if (is_dir($this->env['tmp_path'])) { + require_once ABSPATH.'/wp-admin/includes/file.php'; + WP_Filesystem(); + + global $wp_filesystem; + + $paths = glob(trailingslashit($this->env['tmp_path']).'*'); + + if (false === $paths) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), trailingslashit($this->env['tmp_path']).'*'))); + } + + foreach ($paths as $path) { + if (is_dir($path)) { + @$wp_filesystem->rmdir($path, true); + } + } + } + + // https://github.com/ankitpokhrel/tus-php/issues/102 + $cacheKeys = $this->server->getCache()->keys(); + // $this->server->getCache()->deleteAll( $cacheKeys ); + + foreach ($cacheKeys as $cacheKey) { + if (!($oldFileMeta = $this->server->getCache()->get($cacheKey))) { + continue; + } + + if (!preg_match('~^'.preg_quote(trailingslashit($this->env['tmp_path'])).'~', $oldFileMeta['file_path'])) { + continue; + } + + $this->server->getCache()->delete($cacheKey); + } + } + + /** + * Settings to display when users configure a field of this type. + * + * These settings appear on the ACF “Edit Field Group” admin page when + * setting up the field. + * + * @param array $field + */ + public function render_field_settings($field): void + { + // Repeat for each setting you wish to display for this field type. + acf_render_field_setting( + $field, + [ + 'label' => __('Max file size', 'upload-field-with-uppy-for-acf'), + 'instructions' => implode( + '
'.PHP_EOL, + [ + // translators: %1$s: max_file_size + \sprintf(__('Default: %1$s', 'upload-field-with-uppy-for-acf'), ''.$this->defaults['max_file_size'].''), + ] + ), + 'type' => 'number', + 'name' => 'max_file_size', + 'append' => 'MB', + 'min' => 0, + 'step' => 1, + ] + ); + + acf_render_field_setting( + $field, + [ + 'label' => __('Allowed file types', 'upload-field-with-uppy-for-acf'), + 'instructions' => implode( + '
'.PHP_EOL, + [ + __('Wildcards mime types (e.g. image/*), exact mime types (e.g. image/jpeg), or file extensions (e.g. .jpg).', 'upload-field-with-uppy-for-acf'), + __('One value for each line.', 'upload-field-with-uppy-for-acf'), + // translators: %1$s: allowed_file_types + \sprintf(__('Default: %1$s', 'upload-field-with-uppy-for-acf'), ''.$this->defaults['allowed_file_types'].''), + ] + ), + 'type' => 'textarea', + 'name' => 'allowed_file_types', + ] + ); + + acf_render_field_setting( + $field, + [ + 'label' => __('Uploads path', 'upload-field-with-uppy-for-acf'), + 'instructions' => implode( + '
'.PHP_EOL, + [ + __('Absolute path to the directory where to save all files.', 'upload-field-with-uppy-for-acf'), + __('It can also be outside the public directory.', 'upload-field-with-uppy-for-acf'), + // translators: %1$s: dest_path + \sprintf(__('Default: %1$s', 'upload-field-with-uppy-for-acf'), ''.$this->defaults['dest_path'].''), + ] + ), + 'type' => 'text', + 'name' => 'dest_path', + ] + ); + + // To render field settings on other tabs in ACF 6.0+: + // https://www.advancedcustomfields.com/resources/adding-custom-settings-fields/#moving-field-setting + } + + /** + * HTML content to show when a publisher edits the field on the edit screen. + * + * @param array $field the field settings and values + */ + public function render_field($field): void + { + global $post; + + $destFile = ''; + $hash = ''; + + if (!empty($field['value'])) { + $dest_path = !empty($field['dest_path']) ? trailingslashit($field['dest_path']) : apply_filters($this->name.'/dest_path/type='.$post->post_type, trailingslashit($this->defaults['dest_path']), $post->ID, $field); + $dest_path .= trailingslashit($post->ID).trailingslashit(sanitize_file_name($field['key'])); + + $destFile = $dest_path.$field['value']; + + if (file_exists($destFile)) { + $found = true; + + $hash = apply_filters($this->name.'/download_hash', wp_hash($destFile), $destFile, $post->ID); + $hash = apply_filters($this->name.'/download_hash/type='.$post->post_type, $hash, $destFile, $post->ID); + } + } + + if (!empty($field['allowed_file_types'])) { + $array = preg_split('/\r\n|[\r\n]/', $field['allowed_file_types']); + + if (false !== $array) { + // http://stackoverflow.com/a/8321709 + $array = array_flip(array_flip($array)); + + $field['allowed_file_types'] = wp_json_encode($array); + } + } + ?> + +
+
+
+
+
+ + + + + () + +
+ env['version']; + $url = trailingslashit($this->env['url']); + $path = trailingslashit($this->env['path']); + $cache_busting = $this->env['cache_busting']; + + $ext = '.js'; + $files = glob($path.'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*'.$ext); + + if (false === $files) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), $path.'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*'.$ext))); + } + + foreach ($files as $file) { + $part = 'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/'.basename($file, $ext); + + wp_register_script( + FRUGAN_UFWUFACF_NAME.'-npm-'.basename($file, $ext), + $url.$part.($cache_busting ? '.'.filemtime($path.$part.$ext) : '').$ext, + ['acf-input'], + $version, + [ + 'in_footer' => true, + ] + ); + wp_enqueue_script(FRUGAN_UFWUFACF_NAME.'-npm-'.basename($file, $ext)); + } + + $files = glob($path.'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/*'.$ext); + + if (false === $files) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), $path.'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/*'.$ext))); + } + + foreach ($files as $file) { + $part = 'asset/js'.(!empty(WP_DEBUG) ? '' : '/min').'/'.basename($file, $ext); + + wp_register_script( + FRUGAN_UFWUFACF_NAME.'-'.basename($file, '.js'), + $url.$part.($cache_busting ? '.'.filemtime($path.$part.$ext) : '').$ext, + ['acf-input'], + $version, + [ + 'in_footer' => true, + ] + ); + + if ('main' === basename($file, $ext)) { + // $object_name is the name of the variable which will contain the data. + // Note that this should be unique to both the script and to the plugin or theme. + // Thus, the value here should be properly prefixed with the slug or another unique value, + // to prevent conflicts. However, as this is a JavaScript object name, it cannot contain dashes. + // Use underscores or camelCasing. + wp_localize_script(FRUGAN_UFWUFACF_NAME.'-'.basename($file, $ext), $this->name, [ + 'env' => $this->env, + ]); + } + + wp_enqueue_script(FRUGAN_UFWUFACF_NAME.'-'.basename($file, $ext)); + } + + $files = [ + 'asset/js/locales/@uppy/'.get_locale().'.min'.$ext, + ]; + + foreach ($files as $file) { + if (file_exists($path.$file)) { + $part = trailingslashit(\dirname($file)).basename($file, $ext); + + wp_register_script( + FRUGAN_UFWUFACF_NAME.'-'.basename(\dirname($file)).'-'.basename($file, $ext), + $url.$part.($cache_busting ? '.'.filemtime($path.$part.$ext) : '').$ext, + ['acf-input'], + $version, + [ + 'in_footer' => true, + ] + ); + wp_enqueue_script(FRUGAN_UFWUFACF_NAME.'-'.basename(\dirname($file)).'-'.basename($file, $ext)); + + if ('@uppy' === basename(\dirname($file))) { + wp_add_inline_script(FRUGAN_UFWUFACF_NAME.'-'.basename(\dirname($file)).'-'.basename($file, $ext), 'window.Uppy.locales = []', 'before'); + } + } + } + + $ext = '.css'; + $files = glob($path.'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*'.$ext); + + if (false === $files) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), $path.'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/*'.$ext))); + } + + foreach ($files as $file) { + $part = 'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/npm/'.basename($file, $ext); + + wp_register_style( + FRUGAN_UFWUFACF_NAME.'-npm-'.basename($file, $ext), + $url.$part.($cache_busting ? '.'.filemtime($path.$part.$ext) : '').$ext, + ['acf-input'], + $version + ); + wp_enqueue_style(FRUGAN_UFWUFACF_NAME.'-npm-'.basename($file, $ext)); + } + + $files = glob($path.'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/*'.$ext); + + if (false === $files) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), $path.'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/*'.$ext))); + } + + foreach ($files as $file) { + $part = 'asset/css'.(!empty(WP_DEBUG) ? '' : '/min').'/'.basename($file, $ext); + + wp_register_style( + FRUGAN_UFWUFACF_NAME.'-'.basename($file, '.css'), + $url.$part.($cache_busting ? '.'.filemtime($path.$part.$ext) : '').$ext, + ['acf-input'], + $version + ); + wp_enqueue_style(FRUGAN_UFWUFACF_NAME.'-'.basename($file, $ext)); + } + } + + public function validate_value($valid, mixed $value, $field, $input) + { + $value = sanitize_file_name($value); + + $postId = (int) ($_POST['post_ID'] ?? $_POST['post_id']); + + $postType = get_post_type($postId); + + $tmp_path = trailingslashit($this->env['tmp_path']).trailingslashit(sanitize_file_name($input)); + + $dest_path = !empty($field['dest_path']) ? trailingslashit($field['dest_path']) : apply_filters($this->name.'/dest_path/type='.$postType, trailingslashit($this->defaults['dest_path']), $postId, $field); + $dest_path .= trailingslashit((string) $postId).trailingslashit(sanitize_file_name($field['key'])); + + if (!empty($field['required']) && empty($value)) { + $valid = false; + } elseif (!empty($value) && !file_exists($tmp_path.$value) && !file_exists($dest_path.$value)) { + // Basic usage + $valid = false; + + // Advanced usage + // $valid = __('File doesn\'t exists!', 'upload-field-with-uppy-for-acf'); + } + + if (true === $valid && !empty($value)) { + $paths = []; + + $paths['tmp'] = file_exists($tmp_path.$value) ? $tmp_path.$value : false; + + if (!empty($paths['tmp'])) { + $pathinfo = pathinfo($value); + + $counter = 0; + + while (file_exists($dest_path.$value)) { + $value = apply_filters( + $this->name.'/file_name_exists', + $pathinfo['filename']. + '-'. + ++$counter. + (isset($pathinfo['extension']) ? '.'.$pathinfo['extension'] : ''), + $dest_path, + $pathinfo, + $counter + ); + } + } + + $paths['dest'] = $dest_path.apply_filters($this->name.'/file_name', $value, $dest_path); + + $this->paths[] = $paths; + } + + return $valid; + } + + public function update_value(mixed $value, mixed $post_id, $field) + { + // ACF saves drafts without validation! + // https://support.advancedcustomfields.com/forums/topic/is-it-possible-to-apply-validation-to-draft-post/ + // https://github.com/AdvancedCustomFields/acf/blob/master/includes/forms/form-post.php#L311 + if (!empty($value) && empty($this->paths)) { + $postTypes = array_merge(apply_filters($this->name.'/custom_post_types', []), ['post', 'page']); + + if (\in_array(get_post_type($post_id), $postTypes, true)) { + $post = get_post($post_id); + + if ('draft' === $post->post_status) { + acf_validate_save_post(); + } + } + } + + if (!empty($value) && !empty($this->paths)) { + $value = sanitize_file_name($value); + + $paths = array_shift($this->paths); + + if (!empty($paths['tmp'])) { + if (basename($paths['tmp']) !== $value) { + wp_die( + esc_html(\sprintf( + // translators: %1$s: tmp_path, %2$s: file + __('Wrong tmp_path "%1$s" of file "%2$s"', 'upload-field-with-uppy-for-acf'), + $paths['tmp'], + $value + )), + 500, + ['back_link' => true] + ); + } + } + + if (!empty($paths['dest'])) { + $dest_path = \dirname($paths['dest']); + $value = basename($paths['dest']); + + if (false === wp_mkdir_p($dest_path)) { + wp_die( + esc_html(\sprintf( + // translators: %1$s: dest_path + __('Error creating dest_path "%1$s"', 'upload-field-with-uppy-for-acf'), + $dest_path + )), + 500, + ['back_link' => true] + ); + } + + if (!empty($paths['tmp'])) { + // https://wordpress.stackexchange.com/a/370377/99214 + if (!\function_exists('WP_Filesystem_Direct')) { + require_once ABSPATH.'wp-admin/includes/class-wp-filesystem-base.php'; + + require_once ABSPATH.'wp-admin/includes/class-wp-filesystem-direct.php'; + } + + $wpFilesystemDirect = new \WP_Filesystem_Direct(null); + + if (false === $wpFilesystemDirect->move($paths['tmp'], $paths['dest'])) { + wp_die( + esc_html(\sprintf( + // translators: %1$s: tmp_path, %2$s: dest_path + __('Error moving file from "%1$s" to "%2$s"', 'upload-field-with-uppy-for-acf'), + $paths['tmp'], + $paths['dest'] + )), + 500, + ['back_link' => true] + ); + } + } + } + } + + return $value; + } + + public function before_delete_post(int $post_id, \WP_Post $wpPost): void + { + if ('acf-field-group' === $wpPost->post_type) { + return; + } + + if ('acf-field' === $wpPost->post_type) { + $field = get_field_object($wpPost->post_name, $post_id); + + if (!empty($field)) { + require_once ABSPATH.'/wp-admin/includes/file.php'; + WP_Filesystem(); + + global $wp_filesystem; + + $args = [ + 'post_type' => 'any', // retrieves any type except revisions and types with ‘exclude_from_search’ set to true. + 'meta_key' => '_'.$field['name'], + 'meta_value' => $field['key'], + 'nopaging' => true, + ]; + + $query = new \WP_Query($args); + + if ($query->have_posts()) { + while ($query->have_posts()) { + $query->the_post(); + + $dest_path = !empty($field['dest_path']) ? trailingslashit($field['dest_path']) : apply_filters($this->name.'/dest_path/type='.get_post_type(), trailingslashit($this->defaults['dest_path']), get_the_ID(), $field); + $dest_path .= trailingslashit((string) get_the_ID()).trailingslashit(sanitize_file_name($field['key'])); + + if (is_dir($dest_path)) { + @$wp_filesystem->rmdir($dest_path, true); + } + } + } + + wp_reset_postdata(); + } + } else { + $fieldsObj = get_field_objects($post_id); + + if (!empty($fieldsObj)) { + $dest_paths = $this->get_dest_paths($fieldsObj, $post_id, false); + + if (!empty($dest_paths)) { + require_once ABSPATH.'/wp-admin/includes/file.php'; + WP_Filesystem(); + + global $wp_filesystem; + + foreach ($dest_paths as $dest_path) { + if (is_dir($dest_path)) { + @$wp_filesystem->rmdir($dest_path, true); + } + } + } + } + } + } + + public function save_post($postId): void + { + $fieldsObj = get_field_objects($postId); + + if (!empty($fieldsObj)) { + $dest_paths = $this->get_dest_paths($fieldsObj, $postId); + + if (!empty($dest_paths)) { + $destFiles = $this->get_dest_files($fieldsObj, $postId); + + foreach ($dest_paths as $dest_path) { + if (is_dir($dest_path)) { + $paths = glob(trailingslashit($dest_path).'*'); + + if (false === $paths) { + // translators: %s: path + throw new \RuntimeException(esc_html(\sprintf(__('Error reading "%1$s"', 'upload-field-with-uppy-for-acf'), trailingslashit($dest_path).'*'))); + } + + foreach ($paths as $path) { + if (is_file($path)) { + if (\in_array($path, $destFiles, true)) { + continue; + } + + wp_delete_file($path); + } + } + } + } + } + } + } + + public static function activate(): void + { + // https://andrezrv.com/2014/08/12/efficiently-flush-rewrite-rules-plugin-activation/ + flush_rewrite_rules(); + delete_option('rewrite_rules'); + } + + public static function deactivate($network_deactivating = false): void + { + // https://andrezrv.com/2014/08/12/efficiently-flush-rewrite-rules-plugin-activation/ + flush_rewrite_rules(); + delete_option('rewrite_rules'); + } + + public function get_sub_values(array $values, string $fieldName, array $returns = []): array + { + if (!empty($values) && !empty($fieldName)) { + foreach ($values as $subValues) { + foreach ($subValues as $name => $value) { + if ($name === $fieldName && !empty($value)) { + $returns[] = $value; + } elseif (\is_array($value)) { + $returns += $this->get_sub_values($value, $fieldName, $returns); + } + } + } + } + + return $returns; + } + + public function get_dest_files(array $fieldsObj, int $postId, array $values = [], array $returns = []): array + { + if (!empty($fieldsObj)) { + $postType = get_post_type($postId); + + foreach ($fieldsObj as $fieldObj) { + if ($fieldObj['type'] === $this->name) { + $dest_path = !empty($fieldObj['dest_path']) ? trailingslashit($fieldObj['dest_path']) : apply_filters($this->name.'/dest_path/type='.$postType, trailingslashit($this->defaults['dest_path']), $postId, $fieldObj); + $dest_path .= trailingslashit((string) $postId); + $dest_path .= trailingslashit(sanitize_file_name($fieldObj['key'])); + + if (!empty($fieldObj['value'])) { + $returns[] = $dest_path.$fieldObj['value']; + } elseif (!empty($values)) { + foreach ($this->get_sub_values($values, $fieldObj['name']) as $value) { + $returns[] = $dest_path.$value; + } + } + } elseif (!empty($fieldObj['sub_fields'])) { + if (!empty($fieldObj['value'])) { + $values = $fieldObj['value']; + } + + $returns += $this->get_dest_files($fieldObj['sub_fields'], $postId, $values, $returns); + } + } + } + + return $returns; + } + + public function get_dest_paths(array $fieldsObj, int $postId, bool $fullPath = true, array $returns = []): array + { + if (!empty($fieldsObj)) { + $postType = get_post_type($postId); + + foreach ($fieldsObj as $fieldObj) { + if ($fieldObj['type'] === $this->name) { + $dest_path = !empty($fieldObj['dest_path']) ? trailingslashit($fieldObj['dest_path']) : apply_filters($this->name.'/dest_path/type='.$postType, trailingslashit($this->defaults['dest_path']), $postId, $fieldObj); + $dest_path .= trailingslashit((string) $postId); + + if ($fullPath) { + $dest_path .= trailingslashit(sanitize_file_name($fieldObj['key'])); + } + + $returns[] = $dest_path; + } elseif (!empty($fieldObj['sub_fields'])) { + $returns += $this->get_dest_paths($fieldObj['sub_fields'], $postId, $fullPath, $returns); + } + } + } + + // http://stackoverflow.com/a/8321709 + return array_flip(array_flip($returns)); + } + + public function log($level, $message, array $context = []): void + { + if ($this->is_wonolog_active()) { + do_action('wonolog.log.'.$level, $message, $context); + } else { + if ($message instanceof \Throwable) { + $message = $message->getMessage(); + } elseif (is_wp_error($message)) { + $context['wp_error_data'] = $message->get_error_data(); + $message = $message->get_error_message(); + } + + if (\is_array($message)) { + $message = 'Message: '.wp_json_encode($message); + } + + if (!empty($context)) { + $message .= ' | Context: '.wp_json_encode($context); + } + + error_log($message); + } + } + + public function is_wonolog_active() + { + return \function_exists('did_action') && class_exists(Configurator::class) && \defined(Configurator::class.'::ACTION_SETUP') && did_action(Configurator::ACTION_SETUP); + } +} diff --git a/acf-uppy/src/Middleware/Auth.php b/upload-field-with-uppy-for-acf/src/Middleware/Auth.php similarity index 70% rename from acf-uppy/src/Middleware/Auth.php rename to upload-field-with-uppy-for-acf/src/Middleware/Auth.php index 64d487f..5e77c54 100644 --- a/acf-uppy/src/Middleware/Auth.php +++ b/upload-field-with-uppy-for-acf/src/Middleware/Auth.php @@ -3,7 +3,7 @@ declare(strict_types=1); /* - * This file is part of the ACF Uppy Field WordPress plugin. + * This file is part of the WordPress plugin "Upload Field with Uppy for ACF". * * (ɔ) Frugan * @@ -11,7 +11,7 @@ * with this source code in the file LICENSE. */ -namespace AcfUppy\Middleware; +namespace FruganUFWUFACF\Middleware; use TusPhp\Middleware\TusMiddleware; use TusPhp\Request; @@ -25,7 +25,7 @@ class Auth implements TusMiddleware public function handle(Request $request, Response $response): void { if (!is_user_logged_in()) { - throw new \Exception(__('Unauthorized', ACF_UPPY_NAME)); + throw new \Exception(esc_html__('Unauthorized', 'upload-field-with-uppy-for-acf')); } } } diff --git a/acf-uppy/src/Middleware/UploadDir.php b/upload-field-with-uppy-for-acf/src/Middleware/UploadDir.php similarity index 80% rename from acf-uppy/src/Middleware/UploadDir.php rename to upload-field-with-uppy-for-acf/src/Middleware/UploadDir.php index 8f821cb..8be2d15 100644 --- a/acf-uppy/src/Middleware/UploadDir.php +++ b/upload-field-with-uppy-for-acf/src/Middleware/UploadDir.php @@ -3,7 +3,7 @@ declare(strict_types=1); /* - * This file is part of the ACF Uppy Field WordPress plugin. + * This file is part of the WordPress plugin "Upload Field with Uppy for ACF". * * (ɔ) Frugan * @@ -11,7 +11,7 @@ * with this source code in the file LICENSE. */ -namespace AcfUppy\Middleware; +namespace FruganUFWUFACF\Middleware; use TusPhp\Middleware\TusMiddleware; use TusPhp\Request; @@ -21,7 +21,7 @@ class UploadDir implements TusMiddleware { /** - * @var array{version:string,fieldType:string,url:string,path:string,destPath:string,tmpPath:string,symlinkUrl:string,symlinkPath:string,cacheTtl:string} + * @var array{version:string,fieldType:string,url:string,path:string,dest_path:string,tmp_path:string,symlink_url:string,symlink_path:string,cache_ttl:string} */ public $settings; @@ -31,7 +31,7 @@ class UploadDir implements TusMiddleware public $server; /** - * @param array{version:string,fieldType:string,url:string,path:string,destPath:string,tmpPath:string,symlinkUrl:string,symlinkPath:string,cacheTtl:string} $settings + * @param array{version:string,fieldType:string,url:string,path:string,dest_path:string,tmp_path:string,symlink_url:string,symlink_path:string,cache_ttl:string} $settings */ public function __construct( array $settings, @@ -50,12 +50,12 @@ public function handle(Request $request, Response $response): void $fieldName = $request->header('Field-Name'); if (null === $fieldName) { - throw new \Exception(__('Wrong headers', ACF_UPPY_NAME)); + throw new \Exception(esc_html__('Wrong headers', 'upload-field-with-uppy-for-acf')); } $fieldName = sanitize_file_name($fieldName); - $this->server->setUploadDir(trailingslashit($this->settings['tmpPath']).$fieldName); + $this->server->setUploadDir(trailingslashit($this->settings['tmp_path']).$fieldName); if (!is_dir($this->server->getUploadDir())) { wp_mkdir_p($this->server->getUploadDir()); diff --git a/acf-uppy/src/Middleware/UploadMetadata.php b/upload-field-with-uppy-for-acf/src/Middleware/UploadMetadata.php similarity index 93% rename from acf-uppy/src/Middleware/UploadMetadata.php rename to upload-field-with-uppy-for-acf/src/Middleware/UploadMetadata.php index aee807b..1af3452 100644 --- a/acf-uppy/src/Middleware/UploadMetadata.php +++ b/upload-field-with-uppy-for-acf/src/Middleware/UploadMetadata.php @@ -3,7 +3,7 @@ declare(strict_types=1); /* - * This file is part of the ACF Uppy Field WordPress plugin. + * This file is part of the WordPress plugin "Upload Field with Uppy for ACF". * * (ɔ) Frugan * @@ -11,7 +11,7 @@ * with this source code in the file LICENSE. */ -namespace AcfUppy\Middleware; +namespace FruganUFWUFACF\Middleware; use Symfony\Component\HttpFoundation\HeaderUtils; use TusPhp\Middleware\TusMiddleware; diff --git a/acf-uppy/symlink/.gitignore b/upload-field-with-uppy-for-acf/symlink/.gitignore similarity index 100% rename from acf-uppy/symlink/.gitignore rename to upload-field-with-uppy-for-acf/symlink/.gitignore diff --git a/acf-uppy/src/Exception/ReadErrorException.php b/upload-field-with-uppy-for-acf/tests/bootstrap.php similarity index 54% rename from acf-uppy/src/Exception/ReadErrorException.php rename to upload-field-with-uppy-for-acf/tests/bootstrap.php index 41a3fe3..4316c4d 100644 --- a/acf-uppy/src/Exception/ReadErrorException.php +++ b/upload-field-with-uppy-for-acf/tests/bootstrap.php @@ -3,7 +3,7 @@ declare(strict_types=1); /* - * This file is part of the ACF Uppy Field WordPress plugin. + * This file is part of the WordPress plugin "Upload Field with Uppy for ACF". * * (ɔ) Frugan * @@ -11,6 +11,6 @@ * with this source code in the file LICENSE. */ -namespace AcfUppy\Exception; +require_once __DIR__.'/stubs/functions.stub'; -class ReadErrorException extends \Exception {} +require_once __DIR__.'/stubs/constants.stub'; diff --git a/acf-uppy/tests/data/acf/default.json b/upload-field-with-uppy-for-acf/tests/data/acf/default.json similarity index 76% rename from acf-uppy/tests/data/acf/default.json rename to upload-field-with-uppy-for-acf/tests/data/acf/default.json index 8c2324e..675e564 100644 --- a/acf-uppy/tests/data/acf/default.json +++ b/upload-field-with-uppy-for-acf/tests/data/acf/default.json @@ -4,10 +4,11 @@ "title": "Uppy", "fields": [ { - "key": "field_666c1e691d836", + "key": "field_6721f6b8c8503", "label": "uppy", "name": "uppy", - "type": "uppy", + "aria-label": "", + "type": "upload_field_with_uppy_for_acf", "instructions": "", "required": 0, "conditional_logic": 0, @@ -16,14 +17,16 @@ "class": "", "id": "" }, - "maxFileSize": 10, - "allowedFileTypes": "", - "destPath": "\/opt\/bitnami\/wordpress\/wp-content\/uploads\/acf-uppy" + "max_file_size": 0, + "allowed_file_types": "", + "dest_path": "\/opt\/bitnami\/wordpress\/wp-content\/uploads\/uppy", + "allow_in_bindings": 0 }, { "key": "field_666f5c7c5fa26", "label": "repeater", "name": "repeater", + "aria-label": "", "type": "repeater", "instructions": "", "required": 0, @@ -46,7 +49,8 @@ "key": "field_666f5c965fa27", "label": "uppy", "name": "uppy", - "type": "uppy", + "aria-label": "", + "type": "upload_field_with_uppy_for_acf", "instructions": "", "required": 0, "conditional_logic": 0, @@ -55,9 +59,10 @@ "class": "", "id": "" }, - "maxFileSize": 10, - "allowedFileTypes": "", - "destPath": "\/opt\/bitnami\/wordpress\/wp-content\/uploads\/acf-uppy" + "max_file_size": 0, + "allowed_file_types": "", + "dest_path": "\/opt\/bitnami\/wordpress\/wp-content\/uploads\/uppy", + "allow_in_bindings": 0 } ] } @@ -88,4 +93,4 @@ "description": "", "show_in_rest": 0 } -] \ No newline at end of file +] diff --git a/upload-field-with-uppy-for-acf/tests/data/wp-cfm/default.json b/upload-field-with-uppy-for-acf/tests/data/wp-cfm/default.json new file mode 100644 index 0000000..a629c1d --- /dev/null +++ b/upload-field-with-uppy-for-acf/tests/data/wp-cfm/default.json @@ -0,0 +1,7 @@ +{ + "active_plugins": "a:12:{i:0;s:83:\"acf-repeater-flexible-content-collapser\/acf-repeater-flexible-content-collapser.php\";i:1;s:29:\"acf-repeater\/acf-repeater.php\";i:2;s:61:\"advanced-custom-fields-wpcli\/advanced-custom-fields-wpcli.php\";i:3;s:30:\"advanced-custom-fields\/acf.php\";i:4;s:33:\"classic-editor\/classic-editor.php\";i:5;s:23:\"debug-bar\/debug-bar.php\";i:6;s:23:\"plugin-check\/plugin.php\";i:7;s:51:\"rewrite-rules-inspector\/rewrite-rules-inspector.php\";i:8;s:65:\"upload-field-with-uppy-for-acf\/upload-field-with-uppy-for-acf.php\";i:9;s:41:\"wordpress-kint-debugger\/kint-debugger.php\";i:10;s:17:\"wp-cfm\/wp-cfm.php\";i:12;s:29:\"wp-mail-smtp\/wp_mail_smtp.php\";}", + "classic-editor-allow-users": "allow", + "classic-editor-replace": "block", + "wp_debugging": "a:3:{s:8:\"wp_debug\";s:1:\"1\";s:16:\"wp_debug_display\";s:1:\"1\";s:30:\"wp_disable_fatal_error_handler\";s:1:\"1\";}", + ".label": "default" +} \ No newline at end of file diff --git a/acf-uppy/tests/phpunit.xml b/upload-field-with-uppy-for-acf/tests/phpunit.xml similarity index 100% rename from acf-uppy/tests/phpunit.xml rename to upload-field-with-uppy-for-acf/tests/phpunit.xml diff --git a/upload-field-with-uppy-for-acf/tests/stubs/constants.stub b/upload-field-with-uppy-for-acf/tests/stubs/constants.stub new file mode 100644 index 0000000..60b8422 --- /dev/null +++ b/upload-field-with-uppy-for-acf/tests/stubs/constants.stub @@ -0,0 +1,8 @@ + + * + * This source file is subject to the GNU GPLv3 or later license that is bundled + * with this source code in the file LICENSE. + */ + +use FruganUFWUFACF\Bootstrap; + +/* + * Plugin Name: Upload Field with Uppy for ACF + * Plugin URI: https://github.com/frugan-dev/upload-field-with-uppy-for-acf + * Description: Upload Field with Uppy for ACF is a WordPress plugin that adds a new "Uppy" custom field to the list of fields of the Advanced Custom Fields plugin. + * Version: 3.0.0 + * Requires PHP: 8.0 + * Author: Frugan + * Author URI: https://frugan.it + * License: GPLv3 or later + * License URI: http://www.gnu.org/licenses/gpl-3.0.html + * Donate link: https://buymeacoff.ee/frugan + */ + +if (!defined('ABSPATH')) { + exit; +} + +if (file_exists(__DIR__.'/vendor/autoload.php')) { + require __DIR__.'/vendor/autoload.php'; +} + +define('FRUGAN_UFWUFACF_VERSION', '3.0.0'); +define('FRUGAN_UFWUFACF_BASENAME', plugin_basename(__FILE__)); +define('FRUGAN_UFWUFACF_NAME', dirname(FRUGAN_UFWUFACF_BASENAME)); +define('FRUGAN_UFWUFACF_NAME_UNDERSCORE', str_replace('-', '_', FRUGAN_UFWUFACF_NAME)); +define('FRUGAN_UFWUFACF_URL', plugin_dir_url(__FILE__)); +define('FRUGAN_UFWUFACF_PATH', plugin_dir_path(__FILE__)); + +Bootstrap::get_instance();