Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
.phpunit.result.cache
phpunit.xml
phpcs.xml
phpstan.neon
19 changes: 12 additions & 7 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,19 @@
}
],
"require-dev": {
"wp-coding-standards/wpcs": "^3.2",
"phpcompatibility/php-compatibility": "dev-develop as 9.99.99",
"phpcompatibility/phpcompatibility-wp": "^2.1",
"phpstan/phpstan": "^2.1",
"phpunit/phpunit": "^9",
"roots/wordpress": "^6.8",
"wp-coding-standards/wpcs": "^3.2",
"wp-phpunit/wp-phpunit": "^6.8",
"yoast/phpunit-polyfills": "^4.0",
"phpunit/phpunit": "^9",
"wpackagist-theme/twentytwentyfive": "^1.3",
"wpackagist-plugin/query-monitor": "^3.20",
"phpcompatibility/phpcompatibility-wp": "^2.1",
"phpcompatibility/php-compatibility": "dev-develop as 9.99.99"
"wpackagist-theme/twentytwentyfive": "^1.3",
"yoast/phpunit-polyfills": "^4.0"
},
"config": {
"sort-packages": true,
"platform": {
"php": "7.4"
},
Expand All @@ -60,8 +62,11 @@
}
},
"scripts": {
"lint:phpcs": "phpcs",
"lint:phpstan": "phpstan --memory-limit=1G analyse",
"lint": [
"phpcs"
"@composer lint:phpcs",
"@composer lint:phpstan"
],
"format": [
"phpcbf"
Expand Down
55 changes: 54 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion minit.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
* GitHub Plugin URI: https://github.com/kasparsd/minit
* Update URI: https://updates.wpelevator.com/wp-json/update-pilot/v1/plugins
* Description: Combine JS and CSS files and serve them from the uploads folder.
* Version: 3.1.0
* Version: 3.1.1
* Author: Kaspars Dambis
* Author URI: https://kaspars.net
* Require PHP: 7.4
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
"test": "npm run cli -- composer test",
"composer": "npm run cli -- composer",
"lint": "run-p lint:*",
"lint:php": "npm run cli -- composer lint"
"lint:php": "npm run cli -- composer lint",
"format": "run-p format:*",
"format:php": "npm run cli -- composer format"
}
}
10 changes: 10 additions & 0 deletions phpstan.neon.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
parameters:
level: 5
paths:
- src
- tests
scanDirectories:
- wordpress
- vendor
excludePaths:
- node_modules (?)
2 changes: 1 addition & 1 deletion src/minit-asset-cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public function purge() {
public function files() {
$files = glob( $this->dir() . '/*', GLOB_NOSORT );

if ( ! empty( $files ) && is_array( $files ) ) {
if ( ! empty( $files ) ) {
return $files;
}

Expand Down
2 changes: 1 addition & 1 deletion src/minit-assets.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ abstract class Minit_Assets {
/**
* Instance of either WP scripts or styles.
*
* @var WP_Dependencies
* @var WP_Styles|WP_Scripts
*/
public $handler;

Expand Down
17 changes: 9 additions & 8 deletions src/minit-css.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,13 @@ protected function resolve_urls( $content, $handle, $src ) {
}

// Make all local asset URLs absolute
$content = preg_replace(
'/url\(["\' ]?+(?!data:|https?:|\/\/)(.*?)["\' ]?\)/i',
sprintf( "url('%s/$1')", $this->handler->base_url . dirname( $src ) ),
$content = preg_replace_callback(
'/url\(\s*(?!["\'\s]*(?:data:|https?:|\/\/))(.*?)\s*\)/i',
fn ( $matches ) => sprintf(
"url('%s/%s')",
$this->handler->base_url . dirname( $src ),
trim( $matches[1], '\'" ' )
),
$content
);

Expand All @@ -120,11 +124,8 @@ protected function exclude_with_media_query( $content, $handle, $src ) {
return $content;
}

// Ignore these media queries.
$allowlist = array( null, '', 'all', 'screen' );

// Exclude from Minit if media query specified.
if ( ! in_array( $this->handler->registered[ $handle ]->args, $allowlist, true ) ) {
// Exclude from Minit if non-screen media query specified.
if ( ! empty( $this->handler->registered[ $handle ]->args ) && ! in_array( $this->handler->registered[ $handle ]->args, array( 'all', 'screen' ), true ) ) {
return false;
}

Expand Down
14 changes: 5 additions & 9 deletions src/minit-plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,22 @@ protected function __construct() {
*
* @return string
*/
public function basename() {
public function basename(): string {
return plugin_basename( $this->plugin_file );
}

/**
* Bump the cache version to bust the cache.
*
* @return boolean
*/
public function cache_bump() {
return $this->minit_cache->bump();
public function cache_bump(): void {
$this->minit_cache->bump();
}

/**
* Delete all the cache files.
*
* @return boolean
*/
public function cache_purge() {
return $this->minit_cache->purge();
public function cache_purge(): void {
$this->minit_cache->purge();
}

public function init() {
Expand Down
95 changes: 95 additions & 0 deletions tests/phpunit/class-minit-css-test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

class Minit_CSS_Test extends WP_UnitTestCase {
public function test_media_query_excluded() {
$minit_css = new Minit_Css(
Minit_Plugin::instance(),
new Minit_Asset_Cache( '/cache/to/minit-test', 'version' )
);

wp_enqueue_style( 'minit-css-media-default', 'https://example.com/default.css' );
wp_enqueue_style( 'minit-css-media-screen', 'https://example.com/screen.css', array(), null, 'screen' );
wp_enqueue_style( 'minit-css-media-print', 'https://example.com/print.css', array(), null, 'print' );

$this->assertEquals(
'body {}',
$minit_css->minit_item( 'body {}', 'minit-css-media-default', '/path/to/default.css' ),
'stylesheets with no media query (default) are included in minit'
);

$this->assertEquals(
'body {}',
$minit_css->minit_item( 'body {}', 'minit-css-media-screen', '/path/to/screen.css' ),
'stylesheets with screen media query are included in minit'
);

$this->assertFalse(
$minit_css->minit_item( 'body {}', 'minit-css-media-print', '/path/to/print.css' ),
'stylesheets with non-screen media queries are excluded from minit'
);
}

private function url_to( string $pattern ): string {
return sprintf( $pattern, home_url() );
}

public function test_resolve_urls() {
$minit_css = new Minit_Css(
Minit_Plugin::instance(),
new Minit_Asset_Cache( '/resolve/urls/minit-test', 'version' )
);

wp_enqueue_style( 'minit-css-url-paths', 'https://example.com/default.css' );

$this->assertEquals(
$this->url_to( 'body { background-image: url(\'%s/path/to/path/to/image.png\'); }' ),
$minit_css->minit_item( 'body { background-image: url( "path/to/image.png" ); }', 'minit-css', '/path/to/css.css' ),
'relative paths wrapped in quotes'
);

$this->assertEquals(
$this->url_to( 'body { background-image: url(\'%s/path/to/direct/image.png\'); }' ),
$minit_css->minit_item( 'body { background-image: url(direct/image.png); }', 'minit-css', '/path/to/css.css' ),
'relative paths without quotes'
);

$this->assertEquals(
$this->url_to( 'body { background-image: url(\'%s/path/to/some/image.jpeg\'); }' ),
$minit_css->minit_item( 'body { background-image: url( "some/image.jpeg\' ); }', 'minit-css', '/path/to/css.css' ),
'mixed quotes and spaces'
);

$this->assertEquals(
'body { background-image: url( data:image/gif;base64,R0lGODlhEAAQAMQAAO ); }',
$minit_css->minit_item( 'body { background-image: url( data:image/gif;base64,R0lGODlhEAAQAMQAAO ); }', 'minit-css', '/path/to/css.css' ),
'data uris are kept intact'
);

$this->assertEquals(
'body { background-image: url( "http://example.jpeg" ); }',
$minit_css->minit_item( 'body { background-image: url( "http://example.jpeg" ); }', 'minit-css', '/path/to/css.css' ),
'absolute urls are kept intact'
);
}

public function test_resolve_imports() {
$minit_css = new Minit_Css(
Minit_Plugin::instance(),
new Minit_Asset_Cache( '/resolve/imports/minit-test', 'version' )
);

wp_enqueue_style( 'minit-css-imports', 'https://example.com/imports.css' );

$this->assertEquals(
$this->url_to( '@import url(\'%s/path/to/my-imported-styles.css\');' ),
$minit_css->minit_item( '@import "my-imported-styles.css";', 'minit-css', '/path/to/my-imported-styles.css' ),
'relative imports are made absolute'
);

$this->assertEquals(
$this->url_to( '@import url(\'%s/path/relative/relative/path.css\');' ),
$minit_css->minit_item( '@import url("relative/path.css");', 'minit-css', '/path/relative/path.css' ),
'relative url() imports are made absolute'
);
}
}