Skip to content

Commit c32a45c

Browse files
hadlJosefBredereckmfranzke
authored
feat(engine-twig): add custom twing extensions (#1435)
* feat(engine-twig): add custom twing extensions Closes: #1230 * docs(engine-twig): adding custom twing extensions documentation Refs: #1230 Co-authored-by: Josef Bredreck <13408112+JosefBredereck@users.noreply.github.com> Co-authored-by: Maximilian Franzke <787658+mfranzke@users.noreply.github.com>
1 parent 36a9dff commit c32a45c

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

packages/docs/src/docs/advanced-config-options.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,3 +399,17 @@ Important details:
399399
}
400400
]
401401
```
402+
403+
## Pattern Engine-Twig
404+
### loadExtensionFile
405+
Adding custom TwingExtensions to `engine-twig` via setting a filename in
406+
407+
```javascript
408+
"engine": {
409+
"twig": {
410+
"loadExtensionFile": ""
411+
}
412+
}
413+
```
414+
415+
- `loadExtensionFile`: filename in Patternlab root directory. Details: [engine-twig readme](https://github.com/pattern-lab/patternlab-node/blob/dev/packages/engine-twig/README.md)

packages/engine-twig/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,42 @@ Now that this engine uses a better Twig Javascript library, the following issues
1616
* [Verify maturity of Twig engine](https://github.com/pattern-lab/patternlab-node/issues/285)
1717

1818
See https://github.com/pattern-lab/the-spec/issues/37 for more info.
19+
20+
## Adding Custom Extensions
21+
22+
Create a JS file in Pattern Lab root directory (e.g. `twingExtensions.js`) and set
23+
```javascript
24+
"engine": {
25+
"twig": {
26+
"loadExtensionFile": "twingExtensions.js"
27+
}
28+
}
29+
```
30+
in `patternlab-config.json`. See [Editing the Configuration Options](https://patternlab.io/docs/editing-the-configuration-options/#heading-loadextensionfile) for more info.
31+
32+
- this JS file must export a Map for `TwingEnvironment.addExtensions(extensions: Map<string, TwingExtensionInterface>)`
33+
- Map will be added to the TwingEnvironment on startup
34+
35+
### Example
36+
37+
```javascript
38+
// twingExtensions.js
39+
const { TwingExtension, TwingFunction } = require('twing');
40+
41+
const extensionsMap = new Map();
42+
43+
class TestTwingExtension extends TwingExtension {
44+
getFunctions() {
45+
return [
46+
new TwingFunction('foobar', function (foo) {
47+
return Promise.resolve(`function foobar called with param "${foo}"`);
48+
}),
49+
];
50+
}
51+
}
52+
extensionsMap.set('TestTwingExtension', new TestTwingExtension());
53+
54+
module.exports = extensionsMap;
55+
```
56+
57+
See https://nightlycommit.github.io/twing/advanced.html#creating-an-extension for more details on how to create extensions

packages/engine-twig/lib/engine_twig.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,26 @@ var engine_twig = {
229229
fileSystemLoader.addPath(namespaces[key], key);
230230
});
231231
}
232+
233+
// add twing extensions
234+
if (
235+
config['engines'] &&
236+
config['engines']['twig'] &&
237+
config['engines']['twig']['loadExtensionsFile']
238+
) {
239+
const extensionsFile = path.resolve(
240+
'./',
241+
config['engines']['twig']['loadExtensionsFile']
242+
);
243+
if (fs.pathExistsSync(extensionsFile)) {
244+
try {
245+
const extensionsMap = require(extensionsFile);
246+
twing.addExtensions(extensionsMap);
247+
} catch (e) {
248+
console.error(e);
249+
}
250+
}
251+
}
232252
},
233253
};
234254

0 commit comments

Comments
 (0)