Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jasonetco/nunjucks-pre-lexer
🤓 A tool for identifying and fetching the data that a Nunjucks template expects
https://github.com/jasonetco/nunjucks-pre-lexer
lexer nodejs nunjucks
Last synced: 14 days ago
JSON representation
🤓 A tool for identifying and fetching the data that a Nunjucks template expects
- Host: GitHub
- URL: https://github.com/jasonetco/nunjucks-pre-lexer
- Owner: JasonEtco
- License: mit
- Created: 2018-12-25T16:18:02.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2018-12-29T00:20:40.000Z (about 6 years ago)
- Last Synced: 2024-12-25T10:06:32.401Z (16 days ago)
- Topics: lexer, nodejs, nunjucks
- Language: TypeScript
- Homepage:
- Size: 167 KB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Contributing: .github/CONTRIBUTING.md
- License: LICENSE
- Code of conduct: .github/CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
Nunjucks Pre-Lexer
A tool for identifying and fetching the data that a Nunjucks template expects.
## Usage
### Installation
```sh
$ npm install nunjucks-pre-lexer
``````js
const { lexer } = require('nunjucks-pre-lexer')const templateStr = '{{ myObject.property }}'
// The schema is an object that tells the lexer
// how to get the data the template is asking for
const schema = { myObject: { property: true } }const data = lexer(schema, templateStr)
// -> { myObject: { property: true } }
```This is a pretty mundane example because the value of `myObject.property` is hardcoded; now let's see what it looks like to fetch some data from our database in the same way:
```js
const templateStr = '{{ getPosts() }}'
const schema = {
async getPosts() {
// Some asynchronous operation that queries the database.
// This can be anything at all!
return db.Post.findAll()
}
}const data = lexer(schema, templateStr)
// -> { getPosts: () => ([{ title: 'A post' }]) }
```Now, when we go to render that template (using `nunjucks.render` as normal), we've prepared the return value of the `getPosts` function - so its evaluates immediately.
## Why
Two main reasons: performance, and ease of writing templates.
### Performance
With this method of understanding the requirements of a template, we can really aggressively cache the template itself, while still ensuring that we're getting the freshest data when we need it.
Additionally, this lets us get the data the the template is using - and nothing more. We're letting the template define the data it needs, and then getting it.
### Ease of writing templates
Asynchronous templating is a challenge - Nunjucks has shaky support, and a good, consistent usage of it requires some funky filters. This avoids any need for "intentional" asynchronicity by pre-fetching any data that the template needs.
---
Question? Comments? [Open an issue](https://github.com/JasonEtco/nunjucks-pre-lexer/issues/new), happy to talk through it!