diff --git a/src/Console/CriticalCssMake.php b/src/Console/CriticalCssMake.php index 6eb5941..70a33c7 100644 --- a/src/Console/CriticalCssMake.php +++ b/src/Console/CriticalCssMake.php @@ -26,10 +26,17 @@ public function handle() $cssGenerator = $this->laravel->make('criticalcss.cssgenerator'); - foreach ($this->getUris() as $key => $uri) { - $this->info(sprintf('Processing URI [%s]', $uri)); - - $cssGenerator->generate($uri, $this->getUriAlias($key)); + foreach ($this->getUris() as $key => $obj) { + if(is_array($obj)) { + $uri = array_values($obj)[0]; + $key = array_keys($obj)[0]; + $routeCss = isset(array_values($obj)[1]) ? public_path(array_values($obj)[1]) : ''; + $this->info(sprintf('Processing URI [%s]', $uri)); + $cssGenerator->generate($uri, $this->getUriAlias($key), $routeCss); + } else { + $this->info(sprintf('Processing URI [%s]', $obj)); + $cssGenerator->generate($obj, $this->getUriAlias($key)); + } } $this->clearViews(); diff --git a/src/CssGenerators/CriticalGenerator.php b/src/CssGenerators/CriticalGenerator.php index 947933c..e33991b 100644 --- a/src/CssGenerators/CriticalGenerator.php +++ b/src/CssGenerators/CriticalGenerator.php @@ -82,7 +82,7 @@ public function setOptions($width = 900, $height = 1300, array $ignore = [], $ti /** * {@inheritdoc} */ - public function generate($uri, $alias = null) + public function generate($uri, $alias = null, $routeCss = '') { $html = $this->htmlFetcher->fetch($uri); @@ -103,8 +103,12 @@ public function generate($uri, $alias = null) $builder->add('--timeout='.$this->timeout); } - foreach ($this->css as $css) { - $builder->add('--css='.$css); + if ($routeCss === '') { + foreach ($this->css as $css) { + $builder->add('--css=' . $css); + } + } else { + $builder->add('--css=' . $routeCss); } foreach ($this->ignore as $ignore) { diff --git a/src/config/criticalcss.php b/src/config/criticalcss.php index 27320f4..e1aab0c 100644 --- a/src/config/criticalcss.php +++ b/src/config/criticalcss.php @@ -28,11 +28,25 @@ | Blade. The _value_ is the URI to request HTML from (the route with the | parameters filled out.) Make sure the request won't 404. | + | To use route specific css define the field as an array of route and css + | like ['/route', 'css/file.css']. This way it insures that the css is + | used accurately from the exact css file needed instead of entire css array. + | + | NOTE: if route specific css are not defined as an array, + | CSS Files(s) array will be used. + | */ 'routes' => [ // 'static/route', // In Blade: `@criticalCss('static/route')` // 'users/profile' => 'users/1', // In Blade: `@criticalCss('users/profile')` + + // route specific css + // ['/route', 'css/file.css'], // In Blade: `@criticalCss('/route')` + // [ + // 'users/profile' => 'users/1', + // 'css' => 'css/file.css' + // ], // In Blade: `@criticalCss('users/profile')` ], /* diff --git a/tests/CssGenerators/CriticalGeneratorTest.php b/tests/CssGenerators/CriticalGeneratorTest.php index 8ad94fb..d9a7f99 100644 --- a/tests/CssGenerators/CriticalGeneratorTest.php +++ b/tests/CssGenerators/CriticalGeneratorTest.php @@ -119,4 +119,31 @@ public function testGenerateWithUriAlias() $this->assertTrue($g->generate($uri, $alias)); } + + public function testGenerateWithRouteCss() + { + $uri = 'users/10'; + $alias = 'users/profile'; + $routeCss = $this->css[0]; + + $fetcher = m::mock(HtmlFetcherInterface::class); + $fetcher->shouldReceive('fetch')->once() + ->with($uri) + ->andReturn(file_get_contents($this->html)); + + $storage = m::mock(StorageInterface::class); + $storage->shouldReceive('writeCss')->once() + ->with($alias, 'html{font-size:16px}body{background-image:url(/some-image.jpg)}.class{color:lightred}.other-class{color:#90ee90}') + ->andReturn(true); + + $g = new CriticalGenerator($this->css, $fetcher, $storage); + + $g->setCriticalBin( + realpath(__DIR__.'/../../node_modules/.bin/critical') + ); + + $g->setOptions(); + + $this->assertTrue($g->generate($uri, $alias, $routeCss)); + } }