Skip to content

Commit 47bb0fe

Browse files
committed
Source maps for css
1 parent dcff7d7 commit 47bb0fe

File tree

7 files changed

+51
-7
lines changed

7 files changed

+51
-7
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"php": ">=7.1",
1313
"packaged/helpers": "^1.0||^2.0",
1414
"packaged/http": "~1.1",
15+
"packaged/config": "~1.4",
1516
"tedivm/jshrink": "~1.3"
1617
},
1718
"suggest": {

src/Dispatch.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
namespace Packaged\Dispatch;
33

44
use Composer\Autoload\ClassLoader;
5+
use Packaged\Config\Provider\ConfigProvider;
56
use Packaged\Dispatch\Resources\AbstractDispatchableResource;
67
use Packaged\Dispatch\Resources\AbstractResource;
78
use Packaged\Dispatch\Resources\DispatchableResource;
@@ -13,6 +14,7 @@
1314

1415
class Dispatch
1516
{
17+
1618
/**
1719
* @var Dispatch
1820
*/
@@ -25,6 +27,10 @@ class Dispatch
2527

2628
protected $_baseUri;
2729
protected $_requireFileHash = false;
30+
/**
31+
* @var ConfigProvider
32+
*/
33+
protected $_config;
2834

2935
const RESOURCES_DIR = 'resources';
3036
const VENDOR_DIR = 'vendor';
@@ -58,6 +64,7 @@ public static function destroy()
5864
public function __construct($projectRoot, $baseUri = null, ClassLoader $loader = null)
5965
{
6066
$this->_projectRoot = $projectRoot;
67+
$this->_config = new ConfigProvider();
6168
$this->_resourceStore = new ResourceStore();
6269
$this->_baseUri = $baseUri;
6370
$this->_classLoader = $loader;
@@ -223,7 +230,8 @@ public function handleRequest(Request $request): Response
223230
return Response::create("File Not Found", 404);
224231
}
225232

226-
$resource = ResourceFactory::getExtensionResource(pathinfo($fullPath, PATHINFO_EXTENSION));
233+
$ext = pathinfo($fullPath, PATHINFO_EXTENSION);
234+
$resource = ResourceFactory::getExtensionResource($ext);
227235
if($resource instanceof DispatchableResource)
228236
{
229237
$resource->setManager($manager);
@@ -236,6 +244,11 @@ public function handleRequest(Request $request): Response
236244
{
237245
$resource->setFilePath($fullPath);
238246
$resource->setContent(file_get_contents($fullPath));
247+
248+
if($this->config()->has('ext.' . $ext))
249+
{
250+
$resource->setOptions($this->config()->getSection('ext.' . $ext)->getItems());
251+
}
239252
}
240253
return ResourceFactory::create($resource);
241254
}
@@ -276,6 +289,11 @@ public function store()
276289
return $this->_resourceStore;
277290
}
278291

292+
public function config()
293+
{
294+
return $this->_config;
295+
}
296+
279297
public function calculateRelativePath($filePath)
280298
{
281299
return ltrim(str_replace($this->_projectRoot, '', $filePath), '/\\');

src/Resources/CssResource.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
class CssResource extends AbstractDispatchableResource
77
{
88
protected $_options = [
9-
'minify' => true,
10-
'dispatch' => true,
9+
'minify' => true,
10+
'dispatch' => true,
11+
'sourcemap' => false,
1112
];
1213

1314
public function getExtension()
@@ -64,4 +65,20 @@ protected function _minify()
6465
$this->_content = preg_replace('@#([a-f0-9])\1([a-f0-9])\2([a-f0-9])\3@i', '#\1\2\3', $this->_content);
6566
$this->_content = trim($this->_content);
6667
}
68+
69+
protected function _processContent()
70+
{
71+
parent::_processContent();
72+
if($this->getOption('sourcemap', false))
73+
{
74+
$map = $this->_filePath . '.map';
75+
if(file_exists($map))
76+
{
77+
$this->_content .= '/*# //@ sourceMappingURL=data:application/json;charset=utf-8;base64,'
78+
. base64_encode(file_get_contents($map))
79+
. ' /*';
80+
}
81+
}
82+
}
83+
6784
}

tests/ComponentTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function testComponent()
6565
$request = Request::create('/' . $uri);
6666
$response = $dispatch->handleRequest($request);
6767
$this->assertEquals(200, $response->getStatusCode());
68-
$this->assertEquals(
68+
$this->assertStringStartsWith(
6969
'@import "c/2/_/AbstractComponent/942e325b3dcc/dependency.css";body{color:blue;background:url("c/2/_/AbstractComponent/395d1a0e845f/img/x.jpg")}',
7070
$response->getContent()
7171
);

tests/DispatchTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@ public function testHandle()
7171
$response = $dispatch->handleRequest($request);
7272
$this->assertContains('body{background:orange}', $response->getContent());
7373

74+
Dispatch::instance()->config()->addItem('ext.css', 'sourcemap', true);
75+
$uri = ResourceManager::vendor('packaged', 'dispatch')->getResourceUri('css/vendor.css');
76+
$request = Request::create($uri);
77+
$response = $dispatch->handleRequest($request);
78+
$this->assertContains('sourceMappingURL', $response->getContent());
79+
$this->assertContains('Q1NTLU1BUAo', $response->getContent());
80+
7481
Dispatch::destroy();
7582
}
7683

tests/Resources/CssResourceTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ public function testMinify()
2222
$resource = new CssResource();
2323

2424
$resource->setContent($original);
25-
$this->assertEquals('body{background:red}', $resource->getContent());
25+
$this->assertStringStartsWith('body{background:red}', $resource->getContent());
2626

2727
$resource->setContent($nominify);
28-
$this->assertEquals($nominify, $resource->getContent());
28+
$this->assertStringStartsWith($nominify, $resource->getContent());
2929

3030
$resource->setContent($original);
3131
$resource->setOptions(['minify' => 'false']);
32-
$this->assertEquals($original, $resource->getContent());
32+
$this->assertStringStartsWith($original, $resource->getContent());
3333
}
3434

3535
public function testResource()

tests/_root/vendor/packaged/dispatch/css/vendor.css.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)