Skip to content

Commit 5bc9319

Browse files
authored
support Latte 3 (#39)
* composer: add allow-plugins config * support Latte 3
1 parent 23fc8f1 commit 5bc9319

File tree

9 files changed

+150
-12
lines changed

9 files changed

+150
-12
lines changed

.github/workflows/main.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ jobs:
1616
strategy:
1717
matrix:
1818
php: [ '7.4', '8.0', '8.1' ]
19+
latte: [ '', '--prefer-lowest' ]
1920
fail-fast: false
2021
steps:
2122
- uses: actions/checkout@v2
@@ -24,7 +25,8 @@ jobs:
2425
php-version: ${{ matrix.php }}
2526
extensions: curl, iconv, json, mbstring, tokenizer
2627
coverage: none
27-
- run: composer install --ignore-platform-reqs --no-interaction
28+
- run: composer install --no-interaction
29+
- run: composer update latte/latte ${{ matrix.latte }} --no-interaction
2830
- run: make tests
2931

3032
coverage:

composer.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"nette/di": "^3.0"
2626
},
2727
"require-dev": {
28-
"latte/latte": "^2.4",
28+
"latte/latte": "^2.4 || ^3.0",
2929
"nette/application": "^3.0",
3030
"nette/bootstrap": "^3.0",
3131
"nette/tester": "^2.0",
@@ -44,7 +44,10 @@
4444
},
4545
"prefer-stable": true,
4646
"config": {
47-
"sort-packages": true
47+
"sort-packages": true,
48+
"allow-plugins": {
49+
"dealerdirect/phpcodesniffer-composer-installer": true
50+
}
4851
},
4952
"extra": {
5053
"branch-alias": {

phpstan.neon

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
parameters:
2+
excludePaths:
3+
- src/Latte/WebpackMacros.php # latte 2 compatibility

src/DI/WebpackExtension.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
use Contributte\Webpack\Manifest\ManifestLoader;
1616
use Contributte\Webpack\Manifest\Mapper\WebpackManifestPluginMapper;
1717
use Contributte\Webpack\PublicPathProvider;
18-
use Nette\Bridges\ApplicationLatte\ILatteFactory;
18+
use Latte\Engine;
19+
use Nette\Bridges\ApplicationLatte\LatteFactory;
1920
use Nette\DI\CompilerExtension;
2021
use Nette\DI\Definitions\FactoryDefinition;
2122
use Nette\DI\Definitions\ServiceDefinition;
@@ -44,7 +45,7 @@ public function getConfigSchema(): Schema
4445
{
4546
return Expect::structure([
4647
'debugger' => Expect::bool($this->debugMode),
47-
'macros' => Expect::bool(\interface_exists(ILatteFactory::class)),
48+
'macros' => Expect::bool(\interface_exists(LatteFactory::class)),
4849
'devServer' => Expect::structure([
4950
'enabled' => Expect::bool($this->debugMode),
5051
'url' => Expect::string()->nullable()->dynamic(),
@@ -109,15 +110,20 @@ public function loadConfiguration(): void
109110
// latte macro
110111
if ($this->config['macros']) {
111112
try {
112-
$latteFactory = $builder->getDefinitionByType(ILatteFactory::class);
113+
$latteFactory = $builder->getDefinitionByType(LatteFactory::class);
113114
\assert($latteFactory instanceof FactoryDefinition);
114115

115116
$definition = $latteFactory->getResultDefinition();
116117
\assert($definition instanceof ServiceDefinition);
117118

118-
$definition
119-
->addSetup('?->addProvider(?, ?)', ['@self', 'webpackAssetLocator', $assetLocator])
120-
->addSetup('?->onCompile[] = function ($engine) { Contributte\Webpack\Latte\WebpackMacros::install($engine->getCompiler()); }', ['@self']);
119+
$definition->addSetup('?->addProvider(?, ?)', ['@self', 'webpackAssetLocator', $assetLocator]);
120+
121+
// @phpstan-ignore-next-line latte 2 compatibility
122+
if (\version_compare(Engine::VERSION, '3', '<')) {
123+
$definition->addSetup('?->onCompile[] = function ($engine) { Contributte\Webpack\Latte\WebpackMacros::install($engine->getCompiler()); }', ['@self']);
124+
} else {
125+
$definition->addSetup('addExtension', [new Statement(\Contributte\Webpack\Latte\WebpackExtension::class)]);
126+
}
121127
} catch (MissingServiceException $e) {
122128
// ignore
123129
}

src/Latte/WebpackExtension.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Contributte\Webpack\Latte;
6+
7+
use Latte\Extension;
8+
9+
final class WebpackExtension extends Extension
10+
{
11+
public function getTags(): array
12+
{
13+
return [
14+
'webpack' => [WebpackNode::class, 'create'],
15+
];
16+
}
17+
}

src/Latte/WebpackNode.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Contributte\Webpack\Latte;
6+
7+
use Latte\Compiler\Node;
8+
use Latte\Compiler\Nodes\Php\ExpressionNode;
9+
use Latte\Compiler\Nodes\Php\ModifierNode;
10+
use Latte\Compiler\Nodes\StatementNode;
11+
use Latte\Compiler\PrintContext;
12+
use Latte\Compiler\Tag;
13+
14+
/**
15+
* {webpack asset.name.js}
16+
*/
17+
final class WebpackNode extends StatementNode
18+
{
19+
public ExpressionNode $expression;
20+
21+
public ModifierNode $modifier;
22+
23+
public static function create(Tag $tag): self
24+
{
25+
$tag->outputMode = $tag::OutputKeepIndentation;
26+
$tag->expectArguments();
27+
28+
$node = new self();
29+
$node->expression = $tag->parser->parseUnquotedStringOrExpression();
30+
$node->modifier = $tag->parser->parseModifier();
31+
$node->modifier->escape = true;
32+
return $node;
33+
}
34+
35+
public function print(PrintContext $context): string
36+
{
37+
return $context->format(
38+
"echo %modify(\$this->global->webpackAssetLocator->locateInPublicPath(%node)) %line;\n",
39+
$this->modifier,
40+
$this->expression,
41+
$this->position,
42+
);
43+
}
44+
45+
/**
46+
* @return \Generator<Node>
47+
*/
48+
public function &getIterator(): \Generator
49+
{
50+
yield $this->expression;
51+
yield $this->modifier;
52+
}
53+
}

tests/DI/WebpackExtensionTest.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use Contributte\Webpack\Debugging\WebpackPanel;
1414
use Contributte\Webpack\DevServer\DevServer;
1515
use Contributte\Webpack\PublicPathProvider;
1616
use Latte\Loaders\StringLoader;
17-
use Nette\Bridges\ApplicationLatte\ILatteFactory;
17+
use Nette\Bridges\ApplicationLatte\LatteFactory;
1818
use Nette\Configurator;
1919
use Nette\DI\Container;
2020
use Nette\DI\InvalidConfigurationException;
@@ -125,8 +125,8 @@ final class WebpackExtensionTest extends TestCase
125125
{
126126
$container = $this->createContainer('noDebug');
127127

128-
/** @var ILatteFactory $latteFactory */
129-
$latteFactory = $container->getByType(ILatteFactory::class);
128+
/** @var LatteFactory $latteFactory */
129+
$latteFactory = $container->getByType(LatteFactory::class);
130130
$latte = $latteFactory->create();
131131

132132
$providers = $latte->getProviders();
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Contributte\Webpack\Tests\Latte;
6+
7+
use Contributte\Webpack\AssetLocator;
8+
use Contributte\Webpack\Latte\WebpackExtension;
9+
use Latte\Engine;
10+
use Latte\Loaders\StringLoader;
11+
use Tester\Assert;
12+
use Tester\Environment;
13+
use Tester\TestCase;
14+
use function Contributte\Webpack\Tests\createAssetNameResolver;
15+
use function Contributte\Webpack\Tests\createBuildDirectoryProvider;
16+
use function Contributte\Webpack\Tests\createDisabledDevServer;
17+
use function Contributte\Webpack\Tests\createPublicPathProvider;
18+
19+
require_once __DIR__ . '/../bootstrap.php';
20+
21+
/**
22+
* @testCase
23+
*/
24+
final class WebpackExtensionTest extends TestCase
25+
{
26+
public function testExtension(): void
27+
{
28+
if (\version_compare(Engine::VERSION, '3', '<')) {
29+
Environment::skip('Requires Latte 3.');
30+
}
31+
32+
$assetLocator = new AssetLocator(
33+
createBuildDirectoryProvider('/home/user'),
34+
createPublicPathProvider('/dist'),
35+
createAssetNameResolver(['asset.js' => 'asset.js']),
36+
createDisabledDevServer(),
37+
[],
38+
);
39+
40+
$latte = new Engine();
41+
$latte->addProvider('webpackAssetLocator', $assetLocator);
42+
$latte->addExtension(new WebpackExtension());
43+
44+
$latte->setLoader(new StringLoader());
45+
Assert::same('/dist/asset.js', $latte->renderToString('{webpack asset.js}'));
46+
}
47+
}
48+
49+
(new WebpackExtensionTest())->run();

tests/Latte/WebpackMacrosTest.phpt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use Contributte\Webpack\Latte\WebpackMacros;
99
use Latte\Engine;
1010
use Latte\Loaders\StringLoader;
1111
use Tester\Assert;
12+
use Tester\Environment;
1213
use Tester\TestCase;
1314
use function Contributte\Webpack\Tests\createAssetNameResolver;
1415
use function Contributte\Webpack\Tests\createBuildDirectoryProvider;
@@ -24,6 +25,10 @@ final class WebpackMacrosTest extends TestCase
2425
{
2526
public function testMacros(): void
2627
{
28+
if (\version_compare(Engine::VERSION, '3', '>')) {
29+
Environment::skip('Requires Latte 2.');
30+
}
31+
2732
$assetLocator = new AssetLocator(
2833
createBuildDirectoryProvider('/home/user'),
2934
createPublicPathProvider('/dist'),

0 commit comments

Comments
 (0)