Skip to content

Commit 1583a68

Browse files
committed
minor fixes + README
1 parent 89f2ffc commit 1583a68

13 files changed

+140
-108
lines changed

README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ webpack:
8080

8181
You might want to include the Webpack's asset hash in its file name for assets caching (and automatic cache busting in new releases) in the user agent. But how do you reference the asset files in your code if their names are dynamic?
8282

83-
WebpackNetteAdapter comes to the rescue. You can employ the [webpack-manifest-plugin](https://www.npmjs.com/package/webpack-manifest-plugin) or some similar plugin to produce a manifest file, and then configure the adapter to use it:
83+
WebpackNetteAdapter comes to the rescue. You can employ the [`webpack-manifest-plugin`](https://www.npmjs.com/package/webpack-manifest-plugin) or some similar plugin (see below) to produce a manifest file, and then configure the adapter to use it:
8484

8585
```yaml
8686
webpack:
@@ -93,6 +93,20 @@ This way, you can keep using the original asset names, and they get expanded aut
9393
WebpackNetteAdapter automatically optimizes this in production environment by loading the manifest file in compile time.
9494

9595

96+
#### Manifest mappers
97+
98+
By default, WebpackNetteAdapter supports the aforementioned `webpack-manifest-plugin`. If you use a different plugin that produces the manifest in a different format, you can implement and configure a mapper for it. WebpackNetteAdapter comes bundled with a mapper for the [`assets-webpack-plugin`](https://www.npmjs.com/package/assets-webpack-plugin):
99+
100+
```yaml
101+
webpack:
102+
manifest:
103+
name: manifest.json
104+
mapper: Oops\WebpackNetteAdapter\Manifest\Mapper\AssetsWebpackPluginMapper
105+
```
106+
107+
You can also implement your own mapper, simply extend `Oops\WebpackNetteAdapter\Manifest\ManifestMapper` and implement its `map()` method. It takes the parsed JSON content of the manifest file and is expected to return a flat array mapping asset names to file names.
108+
109+
96110
### Debugger
97111

98112
In development environment, WebpackNetteAdapter registers its own debug bar panel into Tracy, giving you the overview of

src/DI/WebpackExtension.php

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use Oops\WebpackNetteAdapter\BuildDirectoryProvider;
1919
use Oops\WebpackNetteAdapter\Debugging\WebpackPanel;
2020
use Oops\WebpackNetteAdapter\DevServer;
21-
use Oops\WebpackNetteAdapter\Manifest\IdentityMapper;
21+
use Oops\WebpackNetteAdapter\Manifest\Mapper\WebpackManifestPluginMapper;
2222
use Oops\WebpackNetteAdapter\Manifest\ManifestLoader;
2323
use Oops\WebpackNetteAdapter\PublicPathProvider;
2424
use Tracy;
@@ -50,7 +50,7 @@ class WebpackExtension extends CompilerExtension
5050
'manifest' => [
5151
'name' => NULL,
5252
'optimize' => NULL,
53-
'mapper' => NULL,
53+
'mapper' => WebpackManifestPluginMapper::class,
5454
]
5555
];
5656

@@ -164,13 +164,11 @@ private function setupAssetResolver(array $config): ServiceDefinition
164164
if ($config['manifest']['name'] !== NULL) {
165165
if ( ! $config['manifest']['optimize']) {
166166
$loader = $builder->addDefinition($this->prefix('manifestLoader'))
167-
->setFactory(ManifestLoader::class)
167+
->setFactory(ManifestLoader::class, [
168+
1 => new Statement($config['manifest']['mapper']),
169+
])
168170
->setAutowired(FALSE);
169171

170-
if ($config['manifest']['mapper'] !== NULL) {
171-
$loader->getFactory()->arguments[1] = new Statement($config['manifest']['mapper']);
172-
}
173-
174172
$assetResolver->setFactory(AssetNameResolver\ManifestAssetNameResolver::class, [
175173
$config['manifest']['name'],
176174
$loader
@@ -181,13 +179,11 @@ private function setupAssetResolver(array $config): ServiceDefinition
181179
$config['devServer']['enabled'],
182180
$config['devServer']['url'] ?? '',
183181
$config['devServer']['publicUrl'] ?? '',
184-
$config['devServer']['timeout'] ?? 0.1,
182+
$config['devServer']['timeout'],
185183
new Client()
186184
);
187185

188-
$mapperInstance = ($config['manifest']['mapper'] === NULL)
189-
? NULL
190-
: new $config['manifest']['mapper']();
186+
$mapperInstance = new $config['manifest']['mapper']();
191187

192188
$directoryProviderInstance = new BuildDirectoryProvider($config['build']['directory'], $devServerInstance);
193189
$loaderInstance = new ManifestLoader($directoryProviderInstance, $mapperInstance);

src/Manifest/IdentityMapper.php

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/Manifest/ManifestLoader.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ class ManifestLoader
2525
private $manifestMapper;
2626

2727

28-
public function __construct(BuildDirectoryProvider $directoryProvider, ?ManifestMapper $manifestMapper = null)
28+
public function __construct(BuildDirectoryProvider $directoryProvider, ManifestMapper $manifestMapper)
2929
{
3030
$this->directoryProvider = $directoryProvider;
31-
$this->manifestMapper = $manifestMapper ?? new IdentityMapper();
31+
$this->manifestMapper = $manifestMapper;
3232
}
3333

3434

src/Manifest/ManifestMapper.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44

55
namespace Oops\WebpackNetteAdapter\Manifest;
66

7-
interface ManifestMapper
7+
abstract class ManifestMapper
88
{
9-
public function __construct();
9+
final public function __construct()
10+
{
11+
}
1012

1113
/**
1214
* Modifies manifest contents
1315
* @param array<mixed> $manifest
1416
* @return array<string, string>
1517
*/
16-
public function map(array $manifest) : array;
17-
}
18+
abstract public function map(array $manifest) : array;
19+
}

src/Manifest/AssetsWebpackPluginMapper.php renamed to src/Manifest/Mapper/AssetsWebpackPluginMapper.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
declare(strict_types=1);
44

5-
namespace Oops\WebpackNetteAdapter\Manifest;
5+
namespace Oops\WebpackNetteAdapter\Manifest\Mapper;
6+
7+
use Oops\WebpackNetteAdapter\Manifest\ManifestMapper;
8+
69

710
/**
811
* Maps from https://github.com/ztoben/assets-webpack-plugin format to flat files
@@ -20,12 +23,8 @@
2023
* }
2124
*
2225
*/
23-
class AssetsWebpackPluginMapper implements ManifestMapper
26+
class AssetsWebpackPluginMapper extends ManifestMapper
2427
{
25-
public function __construct()
26-
{
27-
}
28-
2928
/**
3029
* @inheritDoc
3130
*/
@@ -39,4 +38,4 @@ public function map(array $manifest): array
3938
}
4039
return $result;
4140
}
42-
}
41+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Oops\WebpackNetteAdapter\Manifest\Mapper;
6+
7+
use Oops\WebpackNetteAdapter\Manifest\ManifestMapper;
8+
9+
/**
10+
* Default identity mapper compatible with webpack-manifest-mapper's flat structure.
11+
*/
12+
class WebpackManifestPluginMapper extends ManifestMapper
13+
{
14+
public function map(array $manifest): array
15+
{
16+
return $manifest;
17+
}
18+
}

tests/WebpackNetteAdapter/DI/config/manifestWithMapper.neon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ webpack:
1010
manifest:
1111
name: manifest.json
1212
optimize: false
13-
mapper: Oops\WebpackNetteAdapter\Manifest\AssetsWebpackPluginMapper
13+
mapper: Oops\WebpackNetteAdapter\Manifest\Mapper\AssetsWebpackPluginMapper

tests/WebpackNetteAdapter/Manifest/ManifestLoaderTest.phpt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace OopsTests\WebpackNetteAdapter\Manifest;
77
use Oops\WebpackNetteAdapter\BuildDirectoryProvider;
88
use Oops\WebpackNetteAdapter\Manifest\CannotLoadManifestException;
99
use Oops\WebpackNetteAdapter\Manifest\ManifestLoader;
10+
use Oops\WebpackNetteAdapter\Manifest\ManifestMapper;
1011
use Tester\Assert;
1112
use Tester\TestCase;
1213

@@ -24,10 +25,16 @@ class ManifestLoaderTest extends TestCase
2425
{
2526
$buildDirProvider = \Mockery::mock(BuildDirectoryProvider::class);
2627
$buildDirProvider->shouldReceive('getBuildDirectory')->andReturn(__DIR__);
27-
$manifestLoader = new ManifestLoader($buildDirProvider);
28+
29+
$manifestMapper = \Mockery::mock(ManifestMapper::class);
30+
$manifestMapper->shouldReceive('map')
31+
->with(['asset.js' => 'resolved.asset.js'])
32+
->andReturn(['asset.js' => 'mapped.asset.js']);
33+
34+
$manifestLoader = new ManifestLoader($buildDirProvider, $manifestMapper);
2835

2936
Assert::same(__DIR__ . '/manifest.json', $manifestLoader->getManifestPath('manifest.json'));
30-
Assert::same(['asset.js' => 'resolved.asset.js'], $manifestLoader->loadManifest('manifest.json'));
37+
Assert::same(['asset.js' => 'mapped.asset.js'], $manifestLoader->loadManifest('manifest.json'));
3138

3239
Assert::throws(function () use ($manifestLoader) {
3340
$manifestLoader->loadManifest('unknown.js');

tests/WebpackNetteAdapter/Manifest/ManifestMapperTest.phpt

Lines changed: 0 additions & 55 deletions
This file was deleted.

0 commit comments

Comments
 (0)