mirror of
https://github.com/mrclay/minify.git
synced 2025-09-06 12:10:45 +02:00
Compare commits
58 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
9b492d3c6a | ||
|
b632b916a7 | ||
|
a4c3c41161 | ||
|
7378a0efe8 | ||
|
c0dd8f50a1 | ||
|
63a812af8d | ||
|
8836df06d2 | ||
|
2f33b69786 | ||
|
8e4b0ceb86 | ||
|
266ddd7d54 | ||
|
07ed67aa77 | ||
|
2bbcce054d | ||
|
9040437901 | ||
|
f954e1bd58 | ||
|
a8a77e6054 | ||
|
25065b1559 | ||
|
807f41903e | ||
|
b81ad2289a | ||
|
fecf395de3 | ||
|
2bd66ae3f9 | ||
|
4453f3a4cb | ||
|
f50353a952 | ||
|
bd7d1077b3 | ||
|
40f89b528c | ||
|
b1bbdccef0 | ||
|
258e495451 | ||
|
b97a1db01d | ||
|
3081a88dbd | ||
|
df7fddfa09 | ||
|
c580d24e1b | ||
|
f9c96b6a3c | ||
|
d3decb27e1 | ||
|
0038cdb5de | ||
|
5659799c42 | ||
|
57be61586e | ||
|
2198482600 | ||
|
c2f40feb0c | ||
|
5c300aca97 | ||
|
76c1edc6ff | ||
|
919fc10139 | ||
|
bb7fc74330 | ||
|
eb4c0f6541 | ||
|
b6ef6fa397 | ||
|
00b9f28630 | ||
|
be40d4f9b2 | ||
|
9ee5fb7701 | ||
|
7d60fb9d0f | ||
|
6236431c8f | ||
|
404664509c | ||
|
9ed7f9dc24 | ||
|
d9b392c474 | ||
|
004f6bf730 | ||
|
72ece76cdf | ||
|
bde7a41021 | ||
|
88aca4019d | ||
|
70952d88f9 | ||
|
6b274afd0b | ||
|
449f009b39 |
263
.php_cs
263
.php_cs
@@ -1,27 +1,240 @@
|
||||
<?php
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
$finder = Symfony\CS\Finder\DefaultFinder::create()
|
||||
->in(__DIR__ . '/lib')
|
||||
;
|
||||
return PhpCsFixer\Config::create()
|
||||
->setUsingCache(true)
|
||||
->setRiskyAllowed(true)
|
||||
->setRules(
|
||||
[
|
||||
'align_multiline_comment' => [
|
||||
'comment_type' => 'all_multiline',
|
||||
],
|
||||
'array_indentation' => true,
|
||||
'array_syntax' => [
|
||||
'syntax' => 'long',
|
||||
],
|
||||
'backtick_to_shell_exec' => true,
|
||||
'binary_operator_spaces' => [
|
||||
'operators' => ['=>' => 'align_single_space_minimal'],
|
||||
],
|
||||
'blank_line_after_namespace' => true,
|
||||
'blank_line_after_opening_tag' => false,
|
||||
'blank_line_before_statement' => true,
|
||||
'braces' => true,
|
||||
'cast_spaces' => [
|
||||
'space' => 'single',
|
||||
],
|
||||
'class_attributes_separation' => true,
|
||||
'class_keyword_remove' => false,
|
||||
'combine_consecutive_issets' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'combine_nested_dirname' => true,
|
||||
// 'compact_nullable_typehint' => true, // PHP >= 7.1
|
||||
'concat_space' => [
|
||||
'spacing' => 'one',
|
||||
],
|
||||
'date_time_immutable' => false,
|
||||
'declare_equal_normalize' => true,
|
||||
'declare_strict_types' => false, // some tests need declare_strict_types === 0
|
||||
'dir_constant' => true,
|
||||
'elseif' => true,
|
||||
'encoding' => true,
|
||||
'ereg_to_preg' => true,
|
||||
'error_suppression' => false,
|
||||
'escape_implicit_backslashes' => false,
|
||||
'explicit_indirect_variable' => true,
|
||||
'explicit_string_variable' => true,
|
||||
'final_internal_class' => true,
|
||||
'fopen_flag_order' => true,
|
||||
'fopen_flags' => true,
|
||||
'full_opening_tag' => true,
|
||||
'fully_qualified_strict_types' => false, // maybe better for readability, so keep it ...
|
||||
'function_declaration' => true,
|
||||
'function_to_constant' => true,
|
||||
'function_typehint_space' => true,
|
||||
'general_phpdoc_annotation_remove' => [
|
||||
'annotations' => [
|
||||
'author',
|
||||
'package',
|
||||
'version',
|
||||
],
|
||||
],
|
||||
'heredoc_to_nowdoc' => false,
|
||||
'implode_call' => false,
|
||||
'include' => true,
|
||||
'increment_style' => false, // maybe better for readability, so keep it ...
|
||||
'indentation_type' => true,
|
||||
'line_ending' => true,
|
||||
'linebreak_after_opening_tag' => false,
|
||||
/* // Requires PHP >= 7.1
|
||||
'list_syntax' => [
|
||||
'syntax' => 'short',
|
||||
],
|
||||
*/
|
||||
'logical_operators' => true,
|
||||
'lowercase_cast' => true,
|
||||
'lowercase_constants' => true,
|
||||
'lowercase_keywords' => true,
|
||||
'lowercase_static_reference' => true,
|
||||
'magic_constant_casing' => true,
|
||||
'magic_method_casing' => true,
|
||||
'method_argument_space' => [
|
||||
'ensure_fully_multiline' => true,
|
||||
'keep_multiple_spaces_after_comma' => false,
|
||||
],
|
||||
'method_chaining_indentation' => false, // maybe better for readability, so keep it ...
|
||||
'modernize_types_casting' => true,
|
||||
'multiline_comment_opening_closing' => false, // maybe better for readability, so keep it ...
|
||||
'multiline_whitespace_before_semicolons' => [
|
||||
'strategy' => 'no_multi_line',
|
||||
],
|
||||
'native_constant_invocation' => true,
|
||||
'native_function_casing' => true,
|
||||
'native_function_invocation' => true,
|
||||
'new_with_braces' => true,
|
||||
'no_alias_functions' => true,
|
||||
'no_alternative_syntax' => true,
|
||||
'no_binary_string' => true,
|
||||
'no_blank_lines_after_class_opening' => false,
|
||||
'no_blank_lines_after_phpdoc' => true,
|
||||
'no_blank_lines_before_namespace' => false,
|
||||
'no_break_comment' => true,
|
||||
'no_closing_tag' => true,
|
||||
'no_empty_comment' => true,
|
||||
'no_empty_phpdoc' => true,
|
||||
'no_empty_statement' => true,
|
||||
'no_extra_blank_lines' => true,
|
||||
'no_homoglyph_names' => true,
|
||||
'no_leading_import_slash' => true,
|
||||
'no_leading_namespace_whitespace' => true,
|
||||
'no_mixed_echo_print' => [
|
||||
'use' => 'echo',
|
||||
],
|
||||
'no_multiline_whitespace_around_double_arrow' => true,
|
||||
'no_null_property_initialization' => true,
|
||||
'no_php4_constructor' => true,
|
||||
'no_short_bool_cast' => true,
|
||||
'no_short_echo_tag' => true,
|
||||
'no_singleline_whitespace_before_semicolons' => true,
|
||||
'no_spaces_after_function_name' => true,
|
||||
'no_spaces_around_offset' => true,
|
||||
'no_spaces_inside_parenthesis' => true,
|
||||
'no_superfluous_elseif' => false, // maybe better for readability, so keep it ...
|
||||
'no_superfluous_phpdoc_tags' => false, // maybe add extra description, so keep it ...
|
||||
'no_trailing_comma_in_list_call' => true,
|
||||
'no_trailing_comma_in_singleline_array' => true,
|
||||
'no_trailing_whitespace' => true,
|
||||
'no_trailing_whitespace_in_comment' => true,
|
||||
'no_unneeded_control_parentheses' => true,
|
||||
'no_unneeded_curly_braces' => true,
|
||||
'no_unneeded_final_method' => true,
|
||||
'no_unreachable_default_argument_value' => false, // do not changes the logic of the code ...
|
||||
'no_unset_on_property' => true,
|
||||
'no_unused_imports' => true,
|
||||
'no_useless_else' => true,
|
||||
'no_useless_return' => true,
|
||||
'no_whitespace_before_comma_in_array' => true,
|
||||
'no_whitespace_in_blank_line' => true,
|
||||
'non_printable_character' => true,
|
||||
'normalize_index_brace' => true,
|
||||
'not_operator_with_space' => false,
|
||||
'not_operator_with_successor_space' => false,
|
||||
'object_operator_without_whitespace' => true,
|
||||
'ordered_class_elements' => false, // maybe better for readability, so keep it ...
|
||||
'ordered_imports' => true,
|
||||
'phpdoc_add_missing_param_annotation' => [
|
||||
'only_untyped' => true,
|
||||
],
|
||||
'phpdoc_align' => false, // maybe better for readability for very long names, so keep it ...
|
||||
'phpdoc_annotation_without_dot' => true,
|
||||
'phpdoc_indent' => true,
|
||||
'phpdoc_inline_tag' => true,
|
||||
'phpdoc_no_access' => true,
|
||||
'phpdoc_no_alias_tag' => true,
|
||||
'phpdoc_no_empty_return' => false, // maybe better for readability, so keep it ...
|
||||
'phpdoc_no_package' => true,
|
||||
'phpdoc_no_useless_inheritdoc' => true,
|
||||
'phpdoc_order' => true,
|
||||
'phpdoc_return_self_reference' => true,
|
||||
'phpdoc_scalar' => true,
|
||||
'phpdoc_separation' => true,
|
||||
'phpdoc_single_line_var_spacing' => true,
|
||||
'phpdoc_summary' => false,
|
||||
'phpdoc_to_comment' => false,
|
||||
'phpdoc_to_return_type' => false,
|
||||
'phpdoc_trim' => true,
|
||||
'phpdoc_trim_consecutive_blank_line_separation' => true,
|
||||
'phpdoc_types' => true,
|
||||
'phpdoc_types_order' => [
|
||||
'null_adjustment' => 'always_last',
|
||||
'sort_algorithm' => 'alpha',
|
||||
],
|
||||
'phpdoc_var_without_name' => true,
|
||||
'php_unit_construct' => true,
|
||||
'php_unit_dedicate_assert' => true,
|
||||
'php_unit_expectation' => true,
|
||||
'php_unit_fqcn_annotation' => true,
|
||||
'php_unit_internal_class' => true,
|
||||
'php_unit_method_casing' => true,
|
||||
'php_unit_mock' => true,
|
||||
'php_unit_namespaced' => true,
|
||||
'php_unit_no_expectation_annotation' => true,
|
||||
'php_unit_ordered_covers' => true,
|
||||
'php_unit_set_up_tear_down_visibility' => true,
|
||||
'php_unit_strict' => true,
|
||||
'php_unit_test_annotation' => true,
|
||||
'php_unit_test_case_static_method_calls' => true,
|
||||
'php_unit_test_class_requires_covers' => false,
|
||||
'pow_to_exponentiation' => true,
|
||||
'pre_increment' => false,
|
||||
'protected_to_private' => true,
|
||||
'return_assignment' => true,
|
||||
'return_type_declaration' => true,
|
||||
// 'self_accessor' => true, // PHP >= 5.4
|
||||
'semicolon_after_instruction' => true,
|
||||
'set_type_to_cast' => true,
|
||||
'short_scalar_cast' => true,
|
||||
'silenced_deprecation_error' => false,
|
||||
'simplified_null_return' => false, // maybe better for readability, so keep it ...
|
||||
'single_blank_line_at_eof' => true,
|
||||
'single_class_element_per_statement' => true,
|
||||
'single_import_per_statement' => true,
|
||||
'single_line_after_imports' => true,
|
||||
'single_line_comment_style' => [
|
||||
'comment_types' => ['hash'],
|
||||
],
|
||||
'single_quote' => true,
|
||||
'space_after_semicolon' => true,
|
||||
'standardize_increment' => false, // maybe better for readability, so keep it ...
|
||||
'standardize_not_equals' => true,
|
||||
// 'static_lambda' => true, // PHP >= 5.4
|
||||
'strict_comparison' => true,
|
||||
'strict_param' => true,
|
||||
'string_line_ending' => true,
|
||||
'switch_case_semicolon_to_colon' => true,
|
||||
'switch_case_space' => true,
|
||||
'ternary_operator_spaces' => true,
|
||||
// 'ternary_to_null_coalescing' => true, // PHP >= 7.0
|
||||
'trailing_comma_in_multiline_array' => true,
|
||||
'trim_array_spaces' => true,
|
||||
'unary_operator_spaces' => true,
|
||||
'visibility_required' => true,
|
||||
// 'void_return' => true, // PHP >= 7.1
|
||||
'whitespace_after_comma_in_array' => true,
|
||||
'yoda_style' => [
|
||||
'equal' => false,
|
||||
'identical' => false,
|
||||
'less_and_greater' => false,
|
||||
],
|
||||
]
|
||||
)
|
||||
->setIndent(" ")
|
||||
->setLineEnding("\n")
|
||||
->setFinder(
|
||||
PhpCsFixer\Finder::create()
|
||||
->in(['.', 'builder/', 'lib/', 'tests/', 'min_extras/', 'static/'])
|
||||
->name('*.php')
|
||||
->ignoreDotFiles(true)
|
||||
->ignoreVCS(true)
|
||||
);
|
||||
|
||||
return Symfony\CS\Config\Config::create()
|
||||
->level(Symfony\CS\FixerInterface::PSR2_LEVEL)
|
||||
->setUsingCache(true)
|
||||
->fixers(array(
|
||||
'linefeed',
|
||||
'trailing_spaces',
|
||||
'unused_use',
|
||||
'short_tag',
|
||||
'return',
|
||||
'visibility',
|
||||
'php_closing_tag',
|
||||
'extra_empty_lines',
|
||||
'function_declaration',
|
||||
'include',
|
||||
'controls_spaces',
|
||||
'elseif',
|
||||
'-eof_ending',
|
||||
'-method_argument_space',
|
||||
))
|
||||
->finder($finder)
|
||||
;
|
||||
// vim:ft=php
|
||||
|
41
.travis.yml
41
.travis.yml
@@ -1,21 +1,31 @@
|
||||
language: php
|
||||
sudo: false
|
||||
dist: trusty
|
||||
|
||||
php:
|
||||
- 7.0
|
||||
- 5.6
|
||||
- 5.5
|
||||
- 5.4
|
||||
- hhvm
|
||||
jobs:
|
||||
fast_finish: true
|
||||
allow_failures:
|
||||
- php: "7.4snapshot"
|
||||
- php: "nightly"
|
||||
include:
|
||||
- php: "5.3"
|
||||
dist: precise
|
||||
- php: "5.4"
|
||||
- php: "5.5"
|
||||
- php: "5.6"
|
||||
- php: "7.0"
|
||||
- php: "7.1"
|
||||
- php: "7.2"
|
||||
- php: "7.3"
|
||||
- php: "7.4snapshot"
|
||||
- name: "Php CS Fixer"
|
||||
php: "7.3"
|
||||
env:
|
||||
- PHP_CS_FIXER=1
|
||||
|
||||
env:
|
||||
- CLOSURE_VERSION: 20161024
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
- php: 7.0
|
||||
|
||||
services:
|
||||
- memcached
|
||||
|
||||
@@ -31,7 +41,14 @@ before_script:
|
||||
- tests/dl-closure.sh
|
||||
|
||||
script:
|
||||
- PATH=vendor/bin:$PATH
|
||||
- composer validate
|
||||
- phpunit --verbose
|
||||
- |
|
||||
if [ "$PHP_CS_FIXER" ]; then
|
||||
composer config --unset platform.php
|
||||
composer require --dev friendsofphp/php-cs-fixer:2.16
|
||||
php-cs-fixer fix --verbose --diff --dry-run --ansi
|
||||
fi
|
||||
- vendor/bin/phpunit --verbose
|
||||
|
||||
# vim:ts=2:sw=2:et
|
||||
|
@@ -1,8 +1,36 @@
|
||||
## Version 3.0.1 (2017-06-09)
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||
|
||||
## 3.0.6 - 2019-10-28
|
||||
|
||||
- Bugfix for option sanitizer, #654, #655
|
||||
|
||||
## 3.0.5 - 2019-10-01
|
||||
|
||||
- Fix syntax error in composer.json, #653
|
||||
|
||||
## 3.0.4 - 2019-09-24
|
||||
|
||||
- Fix PHP 7.3 compatibility issues, #648
|
||||
|
||||
## 3.0.3 - 2017-11-03
|
||||
|
||||
* Fix closure-compiler's error "redirection limit reached". #618, #619
|
||||
|
||||
## 3.0.2 - 2017-09-14
|
||||
|
||||
* Fixes syntax error in Groups controller, #613
|
||||
* Better-maintained lessphp fork, #610
|
||||
* No longer corrupts some chars in some environments, #608
|
||||
|
||||
## 3.0.1 - 2017-06-09
|
||||
|
||||
* Update CSSmin to v4, #599, #590
|
||||
|
||||
## Version 3.0.0 (2017-04-03)
|
||||
## 3.0.0 - 2017-04-03
|
||||
|
||||
* Improved CSS minification via Túbal Martín's CSSMin
|
||||
* Easier error identification (just see error_log)
|
||||
* Adds feature to serve static files directly
|
||||
@@ -20,7 +48,8 @@
|
||||
* BREAKING: Removes `$min_libPath` option
|
||||
* BREAKING: The Minify, source, and controller components have changed APIs
|
||||
|
||||
## Version 2.3.0 (2016-03-11)
|
||||
## 2.3.0 - 2016-03-11
|
||||
|
||||
* Adds `$min_concatOnly` option to just concatenate files
|
||||
* Deprecates use of Minify_Loader
|
||||
* Deprecates use of Minify_Logger
|
||||
@@ -28,13 +57,15 @@
|
||||
* Deprecates use of FirePHP
|
||||
* Deprecates use of DooDigestAuth
|
||||
|
||||
## Version 2.2.1 (2014-10-30)
|
||||
## 2.2.1 - 2014-10-30
|
||||
|
||||
* Builder styled with Bootstrap (thanks to help from acidvertigo)
|
||||
* Update CSSmin to v.2.4.8
|
||||
* Added WinCache
|
||||
* URLs with spaces properly rewritten
|
||||
|
||||
## Version 2.2.0 (2014-03-12)
|
||||
## 2.2.0 - 2014-03-12
|
||||
|
||||
* Fix handling of RegEx in certain situations in JSMin
|
||||
* Thanks to Vovan-VE for reporting this
|
||||
* Update composer.json with support info
|
||||
@@ -56,11 +87,13 @@
|
||||
* Allow far-future expiration and file versioning with the "v" querystirng parameter in addition to existing method
|
||||
* Lots of general code tidy ups
|
||||
|
||||
## Version 2.1.7 (2013-07-23)
|
||||
## 2.1.7 - 2013-07-23
|
||||
|
||||
* Fixes arbitrary file inclusion vulnerability on some systems
|
||||
* Thanks to Matt Mecham for reporting this
|
||||
|
||||
## Version 2.1.6 (2013-07-19)
|
||||
## 2.1.6 - 2013-07-19
|
||||
|
||||
* JSMin fixes
|
||||
* Prevents some Closure Compiler API failures
|
||||
* Uses autoloading for all class loading
|
||||
@@ -72,7 +105,8 @@
|
||||
* CLI script more portable
|
||||
* Adds composer.json
|
||||
|
||||
## Version 2.1.5 (2012-03-10)
|
||||
## 2.1.5 - 2012-03-10
|
||||
|
||||
* Removed XSS vulnerability
|
||||
* Disabled builder by default
|
||||
* command line tools to minify and rewrite URIs in CSS
|
||||
@@ -81,7 +115,8 @@
|
||||
* Closure Compiler uses cURL when allow\_url\_fopen is off
|
||||
* Missing file notices when using groups
|
||||
|
||||
## Version 2.1.4b (2010-07-10)
|
||||
## 2.1.4b - 2010-07-10
|
||||
|
||||
* Option to minify JS with Closure Compiler API w/ JSMin failover
|
||||
* Cookie/bookmarklet-based debug mode. No HTML editing!
|
||||
* Allows 1 file to be missing w/o complete failure
|
||||
@@ -97,7 +132,8 @@
|
||||
* Removed annoying maxFiles limit
|
||||
* mbstring.func\_overload usage is safer
|
||||
|
||||
## Version 2.1.3 (2009-06-30)
|
||||
## 2.1.3 - 2009-06-30
|
||||
|
||||
* CSS fixes
|
||||
* A few URI rewriting bugs fixed
|
||||
* comment/whitespace removal no longer breaks some values
|
||||
@@ -112,7 +148,8 @@
|
||||
* API: Can set contentType Minify\_Source objects (fixes an annoying [caveat](http://groups.google.com/group/minify/msg/8446d32ee99a4961))
|
||||
* [Resolved Issue list](http://code.google.com/p/minify/issues/list?can=1&q=label%3ARelease-2.1.2%20status%3AVerified)
|
||||
|
||||
## Version 2.1.2 (2009-03-04)
|
||||
## 2.1.2 - 2009-03-04
|
||||
|
||||
* Javascript fixes
|
||||
* Debug mode no longer confused by `*/*` in strings/RegExps (jQuery)
|
||||
* quote characters inside RegExp literals no longer cause exception
|
||||
@@ -124,14 +161,16 @@
|
||||
* Builder app doesn't fail on systems without gzdeflate()
|
||||
* APC caching class included
|
||||
|
||||
## Version 2.1.1 (2008-10-19)
|
||||
## 2.1.1 - 2008-10-19
|
||||
|
||||
* Bug fix release
|
||||
* Detection and workarounds for zlib.output\_compression and non-PHP encoding modules
|
||||
* Zlib not required (mod\_rewrite, et.al., can still be used for encoding)
|
||||
* HTML : More IE conditional comments preserved
|
||||
* Minify\_groupUri() utility fixed
|
||||
|
||||
## Version 2.1.0 (2008-09-18)
|
||||
## 2.1.0 - 2008-09-18
|
||||
|
||||
* "min" default application for quick deployment
|
||||
* Minify URI Builder app & bookmarklet for quickly creating minify URIs
|
||||
* Relative URIs in CSS file are fixed automatically by default
|
||||
@@ -147,8 +186,8 @@
|
||||
* Minify\_Cache\_File has flock()s (by default)
|
||||
* Workaround for Windows mtime reporting bug
|
||||
|
||||
## 2.0.0 - 2008-05-22
|
||||
|
||||
## Version 2.0.0 (2008-05-22)
|
||||
* Complete code overhaul. Minify is now a PEAR-style class and toolkit for building customized minifying file servers.
|
||||
* Content-Encoding: deflate/gzip/compress, based on request headers
|
||||
* Expanded CSS and HTML minifiers with test cases
|
||||
@@ -157,10 +196,12 @@
|
||||
* Compression & encoding modules lazy-loaded as needed (304 responses use minimal code)
|
||||
* Separate utility classes for HTTP encoding and cache control
|
||||
|
||||
## Version 1.0.1 (2007-05-05)
|
||||
## 1.0.1 - 2007-05-05
|
||||
|
||||
* Fixed various problems resolving pathnames when hosted on an NFS mount.
|
||||
* Fixed 'undefined constant' notice.
|
||||
* Replaced old JSMin library with a much faster custom implementation.
|
||||
|
||||
## Version 1.0.0 (2007-05-02)
|
||||
## 1.0.0 - 2007-05-02
|
||||
|
||||
* First release.
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "mrclay/minify",
|
||||
"type": "library",
|
||||
"description": "Minify is a PHP5 app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers",
|
||||
"description": "Minify is a PHP app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers",
|
||||
"homepage": "https://github.com/mrclay/minify",
|
||||
"license": "BSD-3-Clause",
|
||||
"authors": [
|
||||
@@ -20,28 +20,33 @@
|
||||
"classmap": ["lib/"]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"classmap": ["tests/TestCase.php"]
|
||||
"psr-4": {"Minify\\Test\\": "tests/"}
|
||||
},
|
||||
"config": {
|
||||
"platform": {
|
||||
"php": "5.3.29"
|
||||
},
|
||||
"sort-packages": true
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.3.0 || ^7.0",
|
||||
"ext-pcre": "*",
|
||||
"intervention/httpauth": "~2.0",
|
||||
"monolog/monolog": "~1.1",
|
||||
"marcusschwarz/lesserphp": "~0.5.1",
|
||||
"monolog/monolog": "~1.1|~2.0",
|
||||
"mrclay/jsmin-php": "~2",
|
||||
"mrclay/props-dic": "^2.2",
|
||||
"php": "^5.3.0 || ^7.0",
|
||||
"mrclay/props-dic": "^2.2|^3.0",
|
||||
"tubalmartin/cssmin": "~4"
|
||||
},
|
||||
"require-dev": {
|
||||
"firephp/firephp-core": "~0.4.0",
|
||||
"leafo/lessphp": "~0.4.0",
|
||||
"leafo/scssphp": "~0.6.6",
|
||||
"leafo/scssphp": "^0.3 || ^0.6 || ^0.7",
|
||||
"meenie/javascript-packer": "~1.1",
|
||||
"phpunit/phpunit": "4.8.*",
|
||||
"phpunit/phpunit": "^4.8.36",
|
||||
"tedivm/jshrink": "~1.1.0"
|
||||
},
|
||||
"suggest": {
|
||||
"firephp/firephp-core": "Use FirePHP for Log messages",
|
||||
"leafo/lessphp": "LESS support",
|
||||
"meenie/javascript-packer": "Keep track of the Packer PHP port using Composer"
|
||||
},
|
||||
"scripts": {
|
||||
|
@@ -128,8 +128,8 @@ class HTTP_ConditionalGet
|
||||
$etagAppend = '';
|
||||
if (isset($spec['encoding'])) {
|
||||
$this->_stripEtag = true;
|
||||
$this->_headers['Vary'] = 'Accept-Encoding';
|
||||
if ('' !== $spec['encoding']) {
|
||||
$this->_headers['Vary'] = 'Accept-Encoding';
|
||||
if (0 === strpos($spec['encoding'], 'x-')) {
|
||||
$spec['encoding'] = substr($spec['encoding'], 2);
|
||||
}
|
||||
|
@@ -14,9 +14,6 @@ use Psr\Log\LoggerInterface;
|
||||
* This library was inspired by {@link mailto:flashkot@mail.ru jscsscomp by Maxim Martynyuk}
|
||||
* and by the article {@link http://www.hunlock.com/blogs/Supercharged_Javascript "Supercharged JavaScript" by Patrick Hunlock}.
|
||||
*
|
||||
* Requires PHP 5.1.0.
|
||||
* Tested on PHP 5.1.6.
|
||||
*
|
||||
* @package Minify
|
||||
* @author Ryan Grove <ryan@wonko.com>
|
||||
* @author Stephen Clay <steve@mrclay.org>
|
||||
@@ -48,14 +45,14 @@ class Minify
|
||||
*
|
||||
* @var Minify_CacheInterface
|
||||
*/
|
||||
private $cache = null;
|
||||
private $cache;
|
||||
|
||||
/**
|
||||
* Active controller for current request
|
||||
*
|
||||
* @var Minify_Controller_Base
|
||||
*/
|
||||
protected $controller = null;
|
||||
protected $controller;
|
||||
|
||||
/**
|
||||
* @var Minify_Env
|
||||
@@ -77,12 +74,12 @@ class Minify
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = null;
|
||||
protected $options;
|
||||
|
||||
/**
|
||||
* @var LoggerInterface|null
|
||||
*/
|
||||
protected $logger = null;
|
||||
protected $logger;
|
||||
|
||||
/**
|
||||
* @param Minify_CacheInterface $cache
|
||||
@@ -302,20 +299,20 @@ class Minify
|
||||
$cg->sendHeaders();
|
||||
|
||||
return;
|
||||
} else {
|
||||
return array(
|
||||
'success' => true,
|
||||
'statusCode' => 304,
|
||||
'content' => '',
|
||||
'headers' => $cg->getHeaders(),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// client will need output
|
||||
$headers = $cg->getHeaders();
|
||||
unset($cg);
|
||||
|
||||
return array(
|
||||
'success' => true,
|
||||
'statusCode' => 304,
|
||||
'content' => '',
|
||||
'headers' => $cg->getHeaders(),
|
||||
);
|
||||
}
|
||||
|
||||
// client will need output
|
||||
$headers = $cg->getHeaders();
|
||||
unset($cg);
|
||||
|
||||
if ($this->options['contentType'] === self::TYPE_CSS && $this->options['rewriteCssUris']) {
|
||||
$this->setupUriRewrites();
|
||||
}
|
||||
|
@@ -2,23 +2,34 @@
|
||||
|
||||
namespace Minify;
|
||||
|
||||
use Minify_Cache_File;
|
||||
use Minify_CacheInterface;
|
||||
use Minify_Controller_MinApp;
|
||||
use Minify_ControllerInterface;
|
||||
use Minify_DebugDetector;
|
||||
use Minify_Env;
|
||||
use Minify_Source_Factory;
|
||||
use Props\Container;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use RuntimeException;
|
||||
use Monolog;
|
||||
use Minify;
|
||||
|
||||
/**
|
||||
* @property \Minify_CacheInterface $cache
|
||||
* @property \Minify\Config $config
|
||||
* @property Minify_CacheInterface $cache
|
||||
* @property Config $config
|
||||
* @property string $configPath
|
||||
* @property \Minify_ControllerInterface $controller
|
||||
* @property Minify_ControllerInterface $controller
|
||||
* @property string $dir
|
||||
* @property string $docRoot
|
||||
* @property \Minify_Env $env
|
||||
* @property \Monolog\Handler\ErrorLogHandler $errorLogHandler
|
||||
* @property Minify_Env $env
|
||||
* @property Monolog\Handler\ErrorLogHandler $errorLogHandler
|
||||
* @property array $groupsConfig
|
||||
* @property string $groupsConfigPath
|
||||
* @property \Psr\Log\LoggerInterface $logger
|
||||
* @property LoggerInterface $logger
|
||||
* @property \Minify $minify
|
||||
* @property array $serveOptions
|
||||
* @property \Minify_Source_Factory $sourceFactory
|
||||
* @property Minify_Source_Factory $sourceFactory
|
||||
* @property array $sourceFactoryOptions
|
||||
*/
|
||||
class App extends Container
|
||||
@@ -38,29 +49,29 @@ class App extends Container
|
||||
$this->cache = function (App $app) use ($that) {
|
||||
$config = $app->config;
|
||||
|
||||
if ($config->cachePath instanceof \Minify_CacheInterface) {
|
||||
if ($config->cachePath instanceof Minify_CacheInterface) {
|
||||
return $config->cachePath;
|
||||
}
|
||||
|
||||
if (!$config->cachePath || is_string($config->cachePath)) {
|
||||
return new \Minify_Cache_File($config->cachePath, $config->cacheFileLocking, $app->logger);
|
||||
return new Minify_Cache_File($config->cachePath, $config->cacheFileLocking, $app->logger);
|
||||
}
|
||||
|
||||
$type = $that->typeOf($config->cachePath);
|
||||
throw new \RuntimeException('$min_cachePath must be a path or implement Minify_CacheInterface.'
|
||||
throw new RuntimeException('$min_cachePath must be a path or implement Minify_CacheInterface.'
|
||||
. " Given $type");
|
||||
};
|
||||
|
||||
$this->config = function (App $app) {
|
||||
$config = (require $app->configPath);
|
||||
|
||||
if ($config instanceof \Minify\Config) {
|
||||
if ($config instanceof Minify\Config) {
|
||||
return $config;
|
||||
}
|
||||
|
||||
// copy from vars into properties
|
||||
|
||||
$config = new \Minify\Config();
|
||||
$config = new Minify\Config();
|
||||
|
||||
$propNames = array_keys(get_object_vars($config));
|
||||
|
||||
@@ -69,6 +80,13 @@ class App extends Container
|
||||
};
|
||||
$varNames = array_map($prefixer, $propNames);
|
||||
|
||||
$varDefined = get_defined_vars();
|
||||
|
||||
$varNames = array_filter($varNames, function($name) use($varDefined)
|
||||
{
|
||||
return array_key_exists($name, $varDefined);
|
||||
});
|
||||
|
||||
$vars = compact($varNames);
|
||||
|
||||
foreach ($varNames as $varName) {
|
||||
@@ -94,17 +112,17 @@ class App extends Container
|
||||
$config = $app->config;
|
||||
|
||||
if (empty($config->factories['controller'])) {
|
||||
$ctrl = new \Minify_Controller_MinApp($app->env, $app->sourceFactory, $app->logger);
|
||||
$ctrl = new Minify_Controller_MinApp($app->env, $app->sourceFactory, $app->logger);
|
||||
} else {
|
||||
$ctrl = call_user_func($config->factories['controller'], $app);
|
||||
}
|
||||
|
||||
if ($ctrl instanceof \Minify_ControllerInterface) {
|
||||
if ($ctrl instanceof Minify_ControllerInterface) {
|
||||
return $ctrl;
|
||||
}
|
||||
|
||||
$type = $that->typeOf($ctrl);
|
||||
throw new \RuntimeException('$min_factories["controller"] callable must return an implementation'
|
||||
throw new RuntimeException('$min_factories["controller"] callable must return an implementation'
|
||||
." of Minify_CacheInterface. Returned $type");
|
||||
};
|
||||
|
||||
@@ -118,13 +136,13 @@ class App extends Container
|
||||
};
|
||||
|
||||
$this->env = function (App $app) {
|
||||
return new \Minify_Env($app->config->envArgs);
|
||||
return new Minify_Env($app->config->envArgs);
|
||||
};
|
||||
|
||||
$this->errorLogHandler = function (App $app) {
|
||||
$format = "%channel%.%level_name%: %message% %context% %extra%";
|
||||
$handler = new \Monolog\Handler\ErrorLogHandler();
|
||||
$handler->setFormatter(new \Monolog\Formatter\LineFormatter($format));
|
||||
$handler = new Monolog\Handler\ErrorLogHandler();
|
||||
$handler->setFormatter(new Monolog\Formatter\LineFormatter($format));
|
||||
|
||||
return $handler;
|
||||
};
|
||||
@@ -138,11 +156,11 @@ class App extends Container
|
||||
$this->logger = function (App $app) use ($that) {
|
||||
$value = $app->config->errorLogger;
|
||||
|
||||
if ($value instanceof \Psr\Log\LoggerInterface) {
|
||||
if ($value instanceof LoggerInterface) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
$logger = new \Monolog\Logger('minify');
|
||||
$logger = new Monolog\Logger('minify');
|
||||
|
||||
if (!$value) {
|
||||
return $logger;
|
||||
@@ -150,12 +168,12 @@ class App extends Container
|
||||
|
||||
if ($value === true || $value instanceof \FirePHP) {
|
||||
$logger->pushHandler($app->errorLogHandler);
|
||||
$logger->pushHandler(new \Monolog\Handler\FirePHPHandler());
|
||||
$logger->pushHandler(new Monolog\Handler\FirePHPHandler());
|
||||
|
||||
return $logger;
|
||||
}
|
||||
|
||||
if ($value instanceof \Monolog\Handler\HandlerInterface) {
|
||||
if ($value instanceof Monolog\Handler\HandlerInterface) {
|
||||
$logger->pushHandler($value);
|
||||
|
||||
return $logger;
|
||||
@@ -163,14 +181,14 @@ class App extends Container
|
||||
|
||||
// BC
|
||||
if (is_object($value) && is_callable(array($value, 'log'))) {
|
||||
$handler = new \Minify\Logger\LegacyHandler($value);
|
||||
$handler = new Minify\Logger\LegacyHandler($value);
|
||||
$logger->pushHandler($handler);
|
||||
|
||||
return $logger;
|
||||
}
|
||||
|
||||
$type = $that->typeOf($value);
|
||||
throw new \RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
|
||||
throw new RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
|
||||
." Given $type");
|
||||
};
|
||||
|
||||
@@ -187,7 +205,7 @@ class App extends Container
|
||||
}
|
||||
|
||||
$type = $that->typeOf($minify);
|
||||
throw new \RuntimeException('$min_factories["minify"] callable must return a Minify object.'
|
||||
throw new RuntimeException('$min_factories["minify"] callable must return a Minify object.'
|
||||
." Returned $type");
|
||||
};
|
||||
|
||||
@@ -207,7 +225,7 @@ class App extends Container
|
||||
}
|
||||
|
||||
if ($config->allowDebugFlag) {
|
||||
$ret['debug'] = \Minify_DebugDetector::shouldDebugRequest($env);
|
||||
$ret['debug'] = Minify_DebugDetector::shouldDebugRequest($env);
|
||||
}
|
||||
|
||||
if ($config->concatOnly) {
|
||||
@@ -228,7 +246,7 @@ class App extends Container
|
||||
};
|
||||
|
||||
$this->sourceFactory = function (App $app) {
|
||||
return new \Minify_Source_Factory($app->env, $app->sourceFactoryOptions, $app->cache);
|
||||
return new Minify_Source_Factory($app->env, $app->sourceFactoryOptions, $app->cache);
|
||||
};
|
||||
|
||||
$this->sourceFactoryOptions = function (App $app) {
|
||||
|
@@ -80,7 +80,6 @@ class Minify_Build
|
||||
*
|
||||
* @param array $sources array of Minify_Source objects and/or file paths
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function __construct($sources)
|
||||
{
|
||||
|
@@ -91,8 +91,8 @@ class Minify_CSS
|
||||
$symlinks = $options['symlinks'];
|
||||
|
||||
return Minify_CSS_UriRewriter::rewrite($css, $currentDir, $docRoot, $symlinks);
|
||||
} else {
|
||||
return Minify_CSS_UriRewriter::prepend($css, $options['prependRelativePath']);
|
||||
}
|
||||
|
||||
return Minify_CSS_UriRewriter::prepend($css, $options['prependRelativePath']);
|
||||
}
|
||||
}
|
||||
|
@@ -78,11 +78,11 @@ class Minify_CSSmin
|
||||
,$options['docRoot']
|
||||
,$options['symlinks']
|
||||
);
|
||||
} else {
|
||||
return Minify_CSS_UriRewriter::prepend(
|
||||
$css
|
||||
,$options['prependRelativePath']
|
||||
);
|
||||
}
|
||||
|
||||
return Minify_CSS_UriRewriter::prepend(
|
||||
$css
|
||||
,$options['prependRelativePath']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -38,14 +38,14 @@ class Minify_ClosureCompiler
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $jarFile = null;
|
||||
public static $jarFile;
|
||||
|
||||
/**
|
||||
* Writable temp directory. This must be set before calling minifyJs().
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $tempDir = null;
|
||||
public static $tempDir;
|
||||
|
||||
/**
|
||||
* Filepath of "java" executable (may be needed if not in shell's PATH)
|
||||
@@ -129,7 +129,7 @@ class Minify_ClosureCompiler
|
||||
$this->getOptionsCommandLine($userOptions)
|
||||
);
|
||||
|
||||
return join(' ', $args) . ' ' . escapeshellarg($tmpFile);
|
||||
return implode(' ', $args) . ' ' . escapeshellarg($tmpFile);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -48,7 +48,7 @@ class Minify_Controller_Groups extends Minify_Controller_Files
|
||||
if (isset($server['ORIG_PATH_INFO'])) {
|
||||
$pathInfo = substr($server['ORIG_PATH_INFO'], 1);
|
||||
} elseif (isset($server['PATH_INFO'])) {
|
||||
$pathInfo = substr($server['PATH_INFO'], 1)
|
||||
$pathInfo = substr($server['PATH_INFO'], 1);
|
||||
} else {
|
||||
$pathInfo = false;
|
||||
}
|
||||
|
@@ -102,10 +102,10 @@ class Minify_Env
|
||||
return $path;
|
||||
}
|
||||
|
||||
protected $server = null;
|
||||
protected $get = null;
|
||||
protected $post = null;
|
||||
protected $cookie = null;
|
||||
protected $server;
|
||||
protected $get;
|
||||
protected $post;
|
||||
protected $cookie;
|
||||
|
||||
/**
|
||||
* Compute $_SERVER['DOCUMENT_ROOT'] for IIS using SCRIPT_FILENAME and SCRIPT_NAME.
|
||||
|
@@ -99,52 +99,52 @@ class Minify_HTML
|
||||
|
||||
// replace SCRIPTs (and minify) with placeholders
|
||||
$this->_html = preg_replace_callback(
|
||||
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
|
||||
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/iu'
|
||||
,array($this, '_removeScriptCB')
|
||||
,$this->_html);
|
||||
|
||||
// replace STYLEs (and minify) with placeholders
|
||||
$this->_html = preg_replace_callback(
|
||||
'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/i'
|
||||
'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/iu'
|
||||
,array($this, '_removeStyleCB')
|
||||
,$this->_html);
|
||||
|
||||
// remove HTML comments (not containing IE conditional comments).
|
||||
$this->_html = preg_replace_callback(
|
||||
'/<!--([\\s\\S]*?)-->/'
|
||||
'/<!--([\\s\\S]*?)-->/u'
|
||||
,array($this, '_commentCB')
|
||||
,$this->_html);
|
||||
|
||||
// replace PREs with placeholders
|
||||
$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
|
||||
$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/iu'
|
||||
,array($this, '_removePreCB')
|
||||
,$this->_html);
|
||||
|
||||
// replace TEXTAREAs with placeholders
|
||||
$this->_html = preg_replace_callback(
|
||||
'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
|
||||
'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/iu'
|
||||
,array($this, '_removeTextareaCB')
|
||||
,$this->_html);
|
||||
|
||||
// trim each line.
|
||||
// @todo take into account attribute values that span multiple lines.
|
||||
$this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html);
|
||||
$this->_html = preg_replace('/^\\s+|\\s+$/mu', '', $this->_html);
|
||||
|
||||
// remove ws around block/undisplayed elements
|
||||
$this->_html = preg_replace('/\\s+(<\\/?(?:area|article|aside|base(?:font)?|blockquote|body'
|
||||
.'|canvas|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|figcaption|figure|footer|form'
|
||||
.'|frame(?:set)?|h[1-6]|head|header|hgroup|hr|html|legend|li|link|main|map|menu|meta|nav'
|
||||
.'|ol|opt(?:group|ion)|output|p|param|section|t(?:able|body|head|d|h||r|foot|itle)'
|
||||
.'|ul|video)\\b[^>]*>)/i', '$1', $this->_html);
|
||||
.'|ul|video)\\b[^>]*>)/iu', '$1', $this->_html);
|
||||
|
||||
// remove ws outside of all elements
|
||||
$this->_html = preg_replace(
|
||||
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</'
|
||||
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</u'
|
||||
,'>$1$2$3<'
|
||||
,$this->_html);
|
||||
|
||||
// use newlines before 1st attribute in open tags (to limit line lengths)
|
||||
$this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html);
|
||||
$this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/iu', "$1\n$2", $this->_html);
|
||||
|
||||
// fill placeholders
|
||||
$this->_html = str_replace(
|
||||
@@ -177,11 +177,11 @@ class Minify_HTML
|
||||
return $placeholder;
|
||||
}
|
||||
|
||||
protected $_isXhtml = null;
|
||||
protected $_replacementHash = null;
|
||||
protected $_isXhtml;
|
||||
protected $_replacementHash;
|
||||
protected $_placeholders = array();
|
||||
protected $_cssMinifier = null;
|
||||
protected $_jsMinifier = null;
|
||||
protected $_cssMinifier;
|
||||
protected $_jsMinifier;
|
||||
|
||||
protected function _removePreCB($m)
|
||||
{
|
||||
@@ -198,7 +198,7 @@ class Minify_HTML
|
||||
$openStyle = "<style{$m[1]}";
|
||||
$css = $m[2];
|
||||
// remove HTML comments
|
||||
$css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);
|
||||
$css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/u', '', $css);
|
||||
|
||||
// remove CDATA section markers
|
||||
$css = $this->_removeCdata($css);
|
||||
@@ -226,7 +226,7 @@ class Minify_HTML
|
||||
|
||||
// remove HTML comments (and ending "//" if present)
|
||||
if ($this->_jsCleanComments) {
|
||||
$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
|
||||
$js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/u', '', $js);
|
||||
}
|
||||
|
||||
// remove CDATA section markers
|
||||
@@ -253,6 +253,6 @@ class Minify_HTML
|
||||
|
||||
protected function _needsCdata($str)
|
||||
{
|
||||
return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
|
||||
return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/u', $str));
|
||||
}
|
||||
}
|
||||
|
@@ -32,15 +32,15 @@ class Minify_ImportProcessor
|
||||
}
|
||||
|
||||
// allows callback funcs to know the current directory
|
||||
private $_currentDir = null;
|
||||
private $_currentDir;
|
||||
|
||||
// allows callback funcs to know the directory of the file that inherits this one
|
||||
private $_previewsDir = null;
|
||||
private $_previewsDir;
|
||||
|
||||
// allows _importCB to write the fetched content back to the obj
|
||||
private $_importedContent = '';
|
||||
|
||||
private static $_isCss = null;
|
||||
private static $_isCss;
|
||||
|
||||
/**
|
||||
* @param String $currentDir
|
||||
@@ -182,7 +182,7 @@ class Minify_ImportProcessor
|
||||
private function truepath($path)
|
||||
{
|
||||
// whether $path is unix or not
|
||||
$unipath = (strlen($path) == 0) || ($path{0} != '/');
|
||||
$unipath = ('' === $path) || ($path{0} !== '/');
|
||||
|
||||
// attempts to detect if path is relative in which case, add cwd
|
||||
if (strpos($path, ':') === false && $unipath) {
|
||||
@@ -194,10 +194,10 @@ class Minify_ImportProcessor
|
||||
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
|
||||
$absolutes = array();
|
||||
foreach ($parts as $part) {
|
||||
if ('.' == $part) {
|
||||
if ('.' === $part) {
|
||||
continue;
|
||||
}
|
||||
if ('..' == $part) {
|
||||
if ('..' === $part) {
|
||||
array_pop($absolutes);
|
||||
} else {
|
||||
$absolutes[] = $part;
|
||||
|
@@ -54,7 +54,7 @@ class Minify_JS_ClosureCompiler
|
||||
/**
|
||||
* @var string $url URL of compiler server. defaults to Google's
|
||||
*/
|
||||
protected $serviceUrl = 'http://closure-compiler.appspot.com/compile';
|
||||
protected $serviceUrl = 'https://closure-compiler.appspot.com/compile';
|
||||
|
||||
/**
|
||||
* @var int $maxBytes The maximum JS size that can be sent to the compiler server in bytes
|
||||
@@ -174,6 +174,9 @@ class Minify_JS_ClosureCompiler
|
||||
$contents = file_get_contents($this->serviceUrl, false, stream_context_create(array(
|
||||
'http' => array(
|
||||
'method' => 'POST',
|
||||
'compilation_level' => 'SIMPLE',
|
||||
'output_format' => 'text',
|
||||
'output_info' => 'compiled_code',
|
||||
'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close\r\n",
|
||||
'content' => $postBody,
|
||||
'max_redirects' => 0,
|
||||
|
@@ -49,7 +49,7 @@ class Minify_Lines
|
||||
$newLines = array();
|
||||
|
||||
while (null !== ($line = array_shift($lines))) {
|
||||
if (('' !== $id) && (0 == $i % 50)) {
|
||||
if (('' !== $id) && (0 === $i % 50)) {
|
||||
if ($inComment) {
|
||||
array_push($newLines, '', "/* {$id} *|", '');
|
||||
} else {
|
||||
|
@@ -63,7 +63,7 @@ class Minify_NailgunClosureCompiler extends Minify_ClosureCompiler
|
||||
$server = array(
|
||||
self::$javaExecutable,
|
||||
'-server',
|
||||
'-cp', join(':', $classPath),
|
||||
'-cp', implode(':', $classPath),
|
||||
self::NG_SERVER,
|
||||
);
|
||||
|
||||
@@ -101,9 +101,9 @@ class Minify_NailgunClosureCompiler extends Minify_ClosureCompiler
|
||||
|
||||
private function startServer()
|
||||
{
|
||||
$serverCommand = join(' ', $this->getServerCommandLine());
|
||||
$serverCommand = implode(' ', $this->getServerCommandLine());
|
||||
$psCommand = $this->shell("ps -o cmd= -C " . self::$javaExecutable);
|
||||
if (array_search($serverCommand, $psCommand) !== false) {
|
||||
if (in_array($serverCommand, $psCommand, true)) {
|
||||
// already started!
|
||||
return;
|
||||
}
|
||||
|
@@ -19,12 +19,12 @@ class Minify_Source implements Minify_SourceInterface
|
||||
/**
|
||||
* @var int time of last modification
|
||||
*/
|
||||
protected $lastModified = null;
|
||||
protected $lastModified;
|
||||
|
||||
/**
|
||||
* @var callback minifier function specifically for this source.
|
||||
*/
|
||||
protected $minifier = null;
|
||||
protected $minifier;
|
||||
|
||||
/**
|
||||
* @var array minification options specific to this source.
|
||||
@@ -34,27 +34,27 @@ class Minify_Source implements Minify_SourceInterface
|
||||
/**
|
||||
* @var string full path of file
|
||||
*/
|
||||
protected $filepath = null;
|
||||
protected $filepath;
|
||||
|
||||
/**
|
||||
* @var string HTTP Content Type (Minify requires one of the constants Minify::TYPE_*)
|
||||
*/
|
||||
protected $contentType = null;
|
||||
protected $contentType;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $content = null;
|
||||
protected $content;
|
||||
|
||||
/**
|
||||
* @var callable
|
||||
*/
|
||||
protected $getContentFunc = null;
|
||||
protected $getContentFunc;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $id = null;
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* Create a Minify_Source
|
||||
@@ -137,7 +137,7 @@ class Minify_Source implements Minify_SourceInterface
|
||||
$minifier = 'Minify::nullMinifier';
|
||||
}
|
||||
if ($minifier !== null && !is_callable($minifier, true)) {
|
||||
throw new \InvalidArgumentException('minifier must be null or a valid callable');
|
||||
throw new InvalidArgumentException('minifier must be null or a valid callable');
|
||||
}
|
||||
$this->minifier = $minifier;
|
||||
}
|
||||
@@ -180,8 +180,13 @@ class Minify_Source implements Minify_SourceInterface
|
||||
} else {
|
||||
$content = file_get_contents($this->filepath);
|
||||
}
|
||||
|
||||
// remove UTF-8 BOM if present
|
||||
return ("\xEF\xBB\xBF" === substr($content, 0, 3)) ? substr($content, 3) : $content;
|
||||
if (strpos($content, "\xEF\xBB\xBF") === 0) {
|
||||
return substr($content, 3);
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -38,7 +38,7 @@ class Minify_YUICompressor
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $jarFile = null;
|
||||
public static $jarFile;
|
||||
|
||||
/**
|
||||
* Writable temp directory. This must be set before calling minifyJs()
|
||||
@@ -46,7 +46,7 @@ class Minify_YUICompressor
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $tempDir = null;
|
||||
public static $tempDir;
|
||||
|
||||
/**
|
||||
* Filepath of "java" executable (may be needed if not in shell's PATH)
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use HTTP_ConditionalGet;
|
||||
|
||||
class HTTPConditionalGetTest extends TestCase
|
||||
{
|
||||
public function TestData()
|
||||
|
@@ -1,9 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use HTTP_Encoder;
|
||||
|
||||
class HTTPEncoderTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider testToIe6Data
|
||||
* @dataProvider ToIe6DataProvider
|
||||
* @preserveGlobals
|
||||
*/
|
||||
public function testToIe6($ua, $ae, $exp, $desc)
|
||||
@@ -16,7 +20,7 @@ class HTTPEncoderTest extends TestCase
|
||||
$this->assertSame($exp, $ret, $desc);
|
||||
}
|
||||
|
||||
public function testToIe6Data()
|
||||
public function ToIe6DataProvider()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
@@ -65,7 +69,7 @@ class HTTPEncoderTest extends TestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider testEncodeNonIeData
|
||||
* @dataProvider EncodeNonIeDataProvider
|
||||
*/
|
||||
public function testEncodeNonIe($ua, $ae, $exp, $desc)
|
||||
{
|
||||
@@ -77,7 +81,7 @@ class HTTPEncoderTest extends TestCase
|
||||
$this->assertSame($exp, $ret, $desc);
|
||||
}
|
||||
|
||||
public function testEncodeNonIeData()
|
||||
public function EncodeNonIeDataProvider()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
@@ -104,7 +108,7 @@ class HTTPEncoderTest extends TestCase
|
||||
|
||||
$encodingTests = array(
|
||||
array('method' => 'deflate', 'inv' => 'gzinflate', 'exp' => 32268),
|
||||
array('method' => 'gzip', 'inv' => '_gzdecode', 'exp' => 32286),
|
||||
array('method' => 'gzip', 'inv' => __NAMESPACE__ . '\\_gzdecode', 'exp' => 32286),
|
||||
array('method' => 'compress', 'inv' => 'gzuncompress', 'exp' => 32325),
|
||||
);
|
||||
|
||||
@@ -117,7 +121,7 @@ class HTTPEncoderTest extends TestCase
|
||||
$ret = $this->countBytes($e->getContent());
|
||||
|
||||
// test uncompression
|
||||
$roundTrip = @call_user_func($test['inv'], $e->getContent());
|
||||
$roundTrip = call_user_func($test['inv'], $e->getContent());
|
||||
$desc = "{$test['method']} : uncompress possible";
|
||||
$this->assertSame($variedContent, $roundTrip, $desc);
|
||||
|
||||
|
@@ -1,8 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use JSMin\JSMin;
|
||||
|
||||
class JsMinTest extends TestCase
|
||||
class JSMinTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
{
|
||||
@@ -54,7 +57,8 @@ class JsMinTest extends TestCase
|
||||
* @param string $label
|
||||
* @param string $expClass
|
||||
* @param string $expMessage
|
||||
* @dataProvider testJSMinExceptionData
|
||||
*
|
||||
* @dataProvider JSMinExceptionDataProvider
|
||||
*/
|
||||
public function testJSMinException($js, $label, $expClass, $expMessage)
|
||||
{
|
||||
@@ -68,7 +72,7 @@ class JsMinTest extends TestCase
|
||||
$this->assertTrue($eClass === $expClass && $eMsg === $expMessage, 'Throw on ' . $label);
|
||||
}
|
||||
|
||||
public function testJSMinExceptionData()
|
||||
public function JSMinExceptionDataProvider()
|
||||
{
|
||||
// $js, $label, $expClass, $expMessage
|
||||
return array(
|
||||
|
@@ -1,6 +1,11 @@
|
||||
<?php
|
||||
|
||||
class JsClosureCompilerTest extends PHPUnit_Framework_TestCase
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_JS_ClosureCompiler;
|
||||
use Minify_JS_ClosureCompiler_Exception;
|
||||
|
||||
class JsClosureCompilerTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
{
|
||||
@@ -27,7 +32,8 @@ class JsClosureCompilerTest extends PHPUnit_Framework_TestCase
|
||||
$this->compile($src);
|
||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||
}
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e, 'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
}
|
||||
|
||||
// Test maximum byte size check (default)
|
||||
@@ -40,7 +46,8 @@ class JsClosureCompilerTest extends PHPUnit_Framework_TestCase
|
||||
$this->compile($src);
|
||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||
}
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e, 'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
|
||||
$expected = 'POST content larger than ' . Minify_JS_ClosureCompiler::DEFAULT_MAX_BYTES . ' bytes';
|
||||
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
|
||||
@@ -69,7 +76,8 @@ class JsClosureCompilerTest extends PHPUnit_Framework_TestCase
|
||||
));
|
||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||
}
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e, 'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
|
||||
$expected = 'POST content larger than ' . $allowedBytes . ' bytes';
|
||||
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
|
||||
@@ -88,7 +96,8 @@ class JsClosureCompilerTest extends PHPUnit_Framework_TestCase
|
||||
));
|
||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||
}
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e, 'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
||||
}
|
||||
|
||||
public function test7()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML_Helper;
|
||||
|
||||
class LessSourceTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Build;
|
||||
use Minify_Source;
|
||||
|
||||
class MinifyBuildTest extends TestCase
|
||||
{
|
||||
public function test()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_CSS_UriRewriter;
|
||||
|
||||
class MinifyCSSUriRewriterTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_APC;
|
||||
|
||||
class MinifyCacheAPCTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_File;
|
||||
|
||||
class MinifyCacheFileTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Memcache;
|
||||
use Minify_Cache_Memcache;
|
||||
|
||||
class MinifyCacheMemcacheTest extends TestCase
|
||||
{
|
||||
/** @var Memcache */
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_WinCache;
|
||||
|
||||
class MinifyCacheWinCacheTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_Cache_ZendPlatform;
|
||||
|
||||
class MinifyCacheZendPlatformTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use Minify_ClosureCompiler;
|
||||
|
||||
class MinifyClosureCompilerTest extends TestCase
|
||||
{
|
||||
public static function setupBeforeClass()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_CommentPreserver;
|
||||
|
||||
class MinifyCommentPreserverTest extends TestCase
|
||||
{
|
||||
public function test()
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML_Helper;
|
||||
use Minify_Source;
|
||||
|
||||
class MinifyHTMLHelperTest extends TestCase
|
||||
{
|
||||
private $realDocRoot;
|
||||
@@ -40,8 +45,10 @@ class MinifyHTMLHelperTest extends TestCase
|
||||
$expected = "/myApp/min/?g=css&{$maxTime}";
|
||||
$actual = Minify_HTML_Helper::getUri('css', array(
|
||||
'rewriteWorks' => false
|
||||
, 'minAppUri' => '/myApp/min/'
|
||||
, 'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
|
||||
,
|
||||
'minAppUri' => '/myApp/min/'
|
||||
,
|
||||
'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
|
||||
));
|
||||
$this->assertEquals($expected, $actual, 'existing group');
|
||||
|
||||
@@ -67,7 +74,8 @@ class MinifyHTMLHelperTest extends TestCase
|
||||
));
|
||||
$output = Minify_mtime(array(
|
||||
$obj
|
||||
, 'css'
|
||||
,
|
||||
'css'
|
||||
), self::$test_files . '/htmlHelper_groupsConfig.php');
|
||||
$this->assertEquals($maxTime, $output, 'utils.php : Minify_mtime w/ obj & group');
|
||||
}
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML;
|
||||
|
||||
class MinifyHTMLTest extends TestCase
|
||||
{
|
||||
public function test1()
|
||||
|
@@ -1,5 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_ImportProcessor;
|
||||
|
||||
class MinifyImportProcessorTest extends TestCase
|
||||
{
|
||||
public function test()
|
||||
@@ -19,6 +23,7 @@ class MinifyImportProcessorTest extends TestCase
|
||||
realpath($linDir . '/lib/css/example.css'),
|
||||
);
|
||||
|
||||
$this->assertEquals($expectedIncludes, Minify_ImportProcessor::$filesIncluded, 'included right files in right order');
|
||||
$this->assertEquals($expectedIncludes, Minify_ImportProcessor::$filesIncluded,
|
||||
'included right files in right order');
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify;
|
||||
use Minify_Cache_Null;
|
||||
use Minify_Controller_Files;
|
||||
use Minify_Env;
|
||||
use Minify_Source_Factory;
|
||||
|
||||
class MinifyLinesTest extends TestCase
|
||||
{
|
||||
public function test_lines()
|
||||
|
@@ -1,5 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use Minify_ClosureCompiler;
|
||||
use Minify_NailgunClosureCompiler;
|
||||
|
||||
class MinifyNailgunClosureCompilerTest extends TestCase
|
||||
{
|
||||
public static function setupBeforeClass()
|
||||
|
@@ -1,5 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify;
|
||||
use Minify_Cache_Null;
|
||||
use Minify_Controller_Files;
|
||||
use Minify_Env;
|
||||
use Minify_Source_Factory;
|
||||
|
||||
class MinifyTest extends TestCase
|
||||
{
|
||||
public function test_Minify()
|
||||
@@ -37,7 +45,6 @@ class MinifyTest extends TestCase
|
||||
'content' => '',
|
||||
'headers' => array(
|
||||
'Expires' => gmdate('D, d M Y H:i:s \G\M\T', $_SERVER['REQUEST_TIME'] + 1800),
|
||||
'Vary' => 'Accept-Encoding',
|
||||
'Last-Modified' => gmdate('D, d M Y H:i:s \G\M\T', $lastModified),
|
||||
'ETag' => "\"pub{$lastModified}\"",
|
||||
'Cache-Control' => 'max-age=1800',
|
||||
@@ -146,7 +153,8 @@ class MinifyTest extends TestCase
|
||||
));
|
||||
$output = $output['content'];
|
||||
|
||||
$this->assertFalse(strpos($output, $defaultOptions['importWarning']), 'Issue 89 : don\'t warn about valid imports');
|
||||
$this->assertFalse(strpos($output, $defaultOptions['importWarning']),
|
||||
'Issue 89 : don\'t warn about valid imports');
|
||||
|
||||
// Test Issue 132
|
||||
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
|
||||
@@ -156,7 +164,8 @@ class MinifyTest extends TestCase
|
||||
'encodeOutput' => false,
|
||||
));
|
||||
|
||||
$this->assertEquals(77, $output['headers']['Content-Length'], 'Issue 132 : mbstring.func_overload shouldn\'t cause incorrect Content-Length');
|
||||
$this->assertEquals(77, $output['headers']['Content-Length'],
|
||||
'Issue 132 : mbstring.func_overload shouldn\'t cause incorrect Content-Length');
|
||||
}
|
||||
|
||||
// Test minifying CSS and responding with Etag/Last-Modified
|
||||
|
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Exception;
|
||||
use Minify_YUICompressor;
|
||||
|
||||
class MinifyYuiCSSTest extends TestCase
|
||||
{
|
||||
public static function setupBeforeClass()
|
||||
@@ -13,7 +18,8 @@ class MinifyYuiCSSTest extends TestCase
|
||||
Minify_YUICompressor::$tempDir = sys_get_temp_dir();
|
||||
}
|
||||
|
||||
public function setUp() {
|
||||
public function setUp()
|
||||
{
|
||||
$this->assertHasJar();
|
||||
}
|
||||
|
||||
@@ -49,7 +55,7 @@ class MinifyYuiCSSTest extends TestCase
|
||||
{
|
||||
$this->assertNotEmpty(Minify_YUICompressor::$jarFile);
|
||||
try {
|
||||
$this->assertFileExists(Minify_YUICompressor::$jarFile , "Have YUI yuicompressor.jar");
|
||||
$this->assertFileExists(Minify_YUICompressor::$jarFile, "Have YUI yuicompressor.jar");
|
||||
} catch (Exception $e) {
|
||||
$this->markTestSkipped($e->getMessage());
|
||||
}
|
||||
|
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_HTML_Helper;
|
||||
|
||||
class ScssSourceTest extends TestCase
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
|
||||
$this->markTestSkipped('scssphp is not compatible with this PHP version.');
|
||||
}
|
||||
|
||||
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
||||
}
|
||||
|
@@ -1,6 +1,10 @@
|
||||
<?php
|
||||
|
||||
class TestCase extends PHPUnit_Framework_TestCase
|
||||
namespace Minify\Test;
|
||||
|
||||
use Minify_CacheInterface;
|
||||
|
||||
abstract class TestCase extends \PHPUnit\Framework\TestCase
|
||||
{
|
||||
/** @var string */
|
||||
protected static $document_root;
|
||||
|
Reference in New Issue
Block a user