Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/chocolateboy/parcel-plugin-nunjucks
Parcel support for nunjucks templates
https://github.com/chocolateboy/parcel-plugin-nunjucks
nunjucks parcel parcel-bundler parcel-plugin plugin template templates
Last synced: 2 months ago
JSON representation
Parcel support for nunjucks templates
- Host: GitHub
- URL: https://github.com/chocolateboy/parcel-plugin-nunjucks
- Owner: chocolateboy
- License: mit
- Created: 2017-12-19T04:57:10.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-01-06T02:01:57.000Z (almost 2 years ago)
- Last Synced: 2024-09-26T20:45:55.812Z (3 months ago)
- Topics: nunjucks, parcel, parcel-bundler, parcel-plugin, plugin, template, templates
- Language: JavaScript
- Homepage:
- Size: 2.25 MB
- Stars: 50
- Watchers: 3
- Forks: 8
- Open Issues: 14
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-parcel - Nunjucks - Plugin to compile Nunjucks templates. (Plugins / Templates)
README
# parcel-plugin-nunjucks
[![Build Status](https://github.com/chocolateboy/parcel-plugin-nunjucks/workflows/test/badge.svg)](https://github.com/chocolateboy/parcel-plugin-nunjucks/actions?query=workflow%3Atest)
[![NPM Version](https://img.shields.io/npm/v/parcel-plugin-nunjucks.svg)](https://www.npmjs.org/package/parcel-plugin-nunjucks)- [NAME](#name)
- [INSTALLATION](#installation)
- [SYNOPSIS](#synopsis)
- [DESCRIPTION](#description)
- [CONFIGURATION](#configuration)
- [Type](#type)
- [Path parameter](#path-parameter)
- [Options](#options)
- [assetType](#assettype)
- [Raw assets](#raw-assets)
- [data](#data)
- [env](#env)
- [filters](#filters)
- [options](#options-1)
- [root](#root)
- [DEVELOPMENT](#development)
- [COMPATIBILITY](#compatibility)
- [SEE ALSO](#see-also)
- [VERSION](#version)
- [AUTHORS](#authors)
- [COPYRIGHT AND LICENSE](#copyright-and-license)# NAME
parcel-plugin-nunjucks - [Parcel](https://parceljs.org/) support for [nunjucks](https://mozilla.github.io/nunjucks/) templates
# INSTALLATION
$ npm install nunjucks # peer dependency
$ npm install parcel-plugin-nunjucks# SYNOPSIS
```
$ cat src/html/index.njk
``````jinja
{% extends 'layout.njk' %}{% block body %}
Hello, {{ name }}!
{% endblock %}
``````
$ cat nunjucks.config.js
``````javascript
module.exports = {
root: './src/html',
data: { name: process.env.USER },
}
``````
$ parcel build src/html/index.njk
```# DESCRIPTION
This is a Parcel plugin which uses nunjucks to translate templates with an
`.njk` extension into Parcel assets.As with other asset types, nunjucks templates can be top-level
[entries](#root), or dependencies referenced from other documents or templates.# CONFIGURATION
An [environment](https://mozilla.github.io/nunjucks/api.html#environment) for
any (or every) nunjucks template known to Parcel can be configured by creating
a `nunjucks` entry in the project's `package.json` file, or by exporting
(CommonJS) or defining (JSON) a configuration object in one of the following
files:- `.nunjucksrc` (JSON)
- `.nunjucks.js`
- `nunjucks.config.js`## Type
The configuration object has the following type:
```typescript
interface AssetType {
value?: false | string;
raw?: boolean;
}interface NunjucksConfiguration {
assetType?: false | string | AssetType | ((path: Path) => (false | string | AssetType));
data?: object | ((path: Path) => (object | PromiseLike));
env?: Nunjucks.Environment | ((path: Path) => Nunjucks.Environment);
filters?: { [name: string]: Function };
options?: Nunjucks.ConfigureOptions;
root?: string | string[];
}
```## Path parameter
Options that are defined as functions ([`assetType`](#assettype),
[`data`](#data), and [`env`](#env)) are passed an object containing the parsed
components of the template's absolute path (including the path itself) as a
parameter, e.g. if the path is `/foo/bar/baz.html.njk`, the parameter would
contain the following fields:```javascript
{
baseExt: '.html',
basePath: '/foo/bar/baz.html',
dir: '/foo/bar',
dirname: 'bar',
dirs: ['', 'foo', 'bar'],
ext: '.njk',
filename: 'baz.html.njk',
name: 'baz.html',
path: '/foo/bar/baz.html.njk',
root: '/',
}
```## Options
The following options can be defined.
### assetType
Override a template's type within Parcel. This allows the rendered template to
be processed as a file of the specified type, e.g. a HTML template will be
scanned for links to scripts, stylesheets etc., and a templated JavaScript file
will be scanned for `require`s and `import`s etc.Defined as a falsey value (the default), a string, or an object, or can be
defined as a function, in which case it is called with an object containing the
path of the template being processed (see [Path parameter](#path-parameter)),
and its return value is used as the asset type.By default, each template's type is determined by the extension before the
`.njk` suffix, defaulting to HTML if there isn't one or if the extension isn't
recognized, e.g.:| filename | type |
|------------------|------------|
| `index.html.njk` | HTML |
| `index.js.njk` | JavaScript |
| `index.css.njk` | CSS |
| `index.njk` | HTML |
| `page-1.0.njk` | HTML |This behavior can be overridden by setting the `assetType` option. The default
value is falsey, which enables the filename-matching behavior. Setting it to a
string makes the value the type for all `.njk` files, e.g. setting it to `html`
makes all files HTML regardless of the filename (which was the default in
parcel-plugin-nunjucks v1):```javascript
module.exports = {
data: { ... },
assetType: 'html',
}
```The supported types are the extensions registered with Parcel, including those
registered by plugins, and they typically correspond to the standard extensions
for the respective filetypes, e.g.:| extension | type |
| ---------- | ---------- |
| css | CSS |
| htm/html | HTML |
| js | JavaScript |
| ts | TypeScript |The type can be written with or without the leading dot, e.g. `html` and `.html`
are equivalent.As an example, the following configuration assigns the default type(s) to most
files, but overrides the type for files in `src/js` and `src/css`. This allows
the latter to be output as e.g. `foo.html`, `bar.js`, `baz.css` etc. rather
than `foo.html.html`, `bar.js.js`, `baz.css.css` etc.```javascript
// if there's no base extension, infer the asset type from the name of the
// containing directory, e.g.:
//
// - foo.html.njk → html
// - bar.js.njk → js
// - baz.css.njk → css
// - src/js/foo.njk → js
// - src/css/bar.njk → css
//
module.exports = {
assetType ({ baseExt, dirname }) {
return baseExt || dirname
}
}
```#### Raw assets
By default, nunjucks assets are processed as the specified or inferred
asset-type i.e. they're scanned and transformed in the same way as regular
JavaScript/HTML etc. files. In some cases, it may be preferable to specify a
rendered template's target type/extension (e.g. HTML) without processing it as
that type (e.g. with PostHTML). This can be done by supplying the `assetType`
option as an [object](#type) rather than a string, and setting
its `raw` property to true, e.g.:```javascript
module.exports = {
data: { ... },
assetType: { value: 'html', raw: true },
}
```If not supplied, the `raw` property defaults to false. As with the non-object
shorthand, the `value` property can be falsey (infer the type from the
filename) or a type name (string), e.g. `html` or `.js`.### data
Data to expose as the "context" in nunjucks
[assets](https://parceljs.org/assets.html). Can be defined as a function, in
which case it is called with an object containing the path of the template
being processed (see [Path parameter](#path-parameter)), and its return value
(which can be a promise if the data is loaded asynchronously) is used as the
data.```javascript
module.exports = {
data: { name: process.env.USER }
}// or
async function getData ({ filename }) {
const data = await http.getData()
return { filename, ...data }
}module.exports = { data: getData }
```### env
The [Environment](https://mozilla.github.io/nunjucks/api.html#environment)
instance to use. Can be defined as a function, in which case it is called with
an object containing the path of the template being processed (see
[Path parameter](#path-parameter)), and its return value is used as the
environment.```javascript
const Nunjucks = require('nunjucks')
const env = Nunjucks.configure('./src/html')env.addFilter('uc', value => value.toUpperCase())
module.exports = { env }
```### filters
A map (object) of name/function pairs to add as filters to the environment.
Ignored if the `env` option is supplied.```javascript
module.exports = {
filters: {
uc: value => value.toUpperCase(),
lc: value => value.toLowerCase(),
}
}
```### options
Options to pass to the
[`nunjucks#configure`](https://mozilla.github.io/nunjucks/api.html#configure)
method, which is used to construct the Environment instance. Ignored if the
`env` option is supplied.```javascript
module.exports = {
options: { autoescape: false }
}
```### root
The base template directory or directories. Can be a single path (string) or
multiple paths (array of strings). If not supplied, it defaults to the current
directory (`.`). Ignored if the `env` option is supplied.Relative paths are resolved against the directory of the configuration file in
which the paths are defined (or the `package.json` if defined there), falling
back to the current working directory if a configuration file isn't found.```javascript
module.exports = { root: './src/html' }
```Note that nunjucks only resolves files in the specified/default template
directories, and dies with a misleading error about the file not existing if an
attempt is made to access a template outside these directories. This applies to
nested template dependencies, but also to top-level entry files i.e. this won't
work:```javascript
module.exports = {
root: './src/html',
}
``````
$ parcel ./index.html.njk
# error: ./index.html.njk: template not found: ./index.html.njk
```The solution is to add the parent directories of entry files that are nunjucks
templates to the list of template directories, e.g.:```javascript
module.exports = {
root: ['./src/html', '.'],
}
``````
$ parcel ./index.html.njk
# OK
```# DEVELOPMENT
## NPM Scripts
The following NPM scripts are available:
- build - compile the code and save it to the `dist` directory
- build:doc - generate the README's TOC (table of contents)
- clean - remove the `dist` directory and other build artifacts
- rebuild - clean the build artifacts and recompile the code
- test - clean and rebuild and run the test suite
- test:run - run the test suite# COMPATIBILITY
* [Maintained Node.js versions](https://github.com/nodejs/Release#readme)
# SEE ALSO
* [nunjucks](https://www.npmjs.com/package/nunjucks) - a Jinja2-inspired templating engine with support for template inheritance
* [posthtml-extend](https://www.npmjs.com/package/posthtml-extend) - a PostHTML plugin which supports Jade-like template inheritance
* [posthtml-include](https://www.npmjs.com/package/posthtml-include) - a PostHTML plugin which supports HTML transclusion# VERSION
2.2.2
# AUTHORS
- [chocolateboy](mailto:[email protected])
- [Matthew McCune](mailto:[email protected]) (original version)# COPYRIGHT AND LICENSE
Copyright © 2017-2020 by Matthew McCune.
This is free software; you can redistribute it and/or modify it under the
terms of the [MIT license](https://opensource.org/licenses/MIT).