diff --git a/README.md b/README.md index 7dfcb02..89dc630 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ yarn add -D @advdominion/babel-plugin-nunjucks ## Использование -Код для преобразования должен находиться в переменных, имена которых указываются в массиве `varNames`, и быть [шаблонным литералом](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/template_strings). Пример: +Используются [Tagged templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) с тегом `njk`: ```js -const nunjucksTemplate = ` +njk` {% from "./item.njk" import item as item %}
@@ -52,7 +52,6 @@ const nunjucksTemplate = ` '@advdominion/babel-plugin-nunjucks', { templatesFolder: 'src/templates/', - varNames: ['nunjucksTemplate'], }, ], ], @@ -65,8 +64,7 @@ const nunjucksTemplate = ` ## Опции -- `templatesFolder` - обязательный параметр, путь до папки с файлами шаблонов +- `templatesFolder` - строка, обязательный параметр. Путь до папки с файлами шаблонов - `globals` - массив, необязательный параметр. Глобальные переменные для Nunjucks (например, `[{name: "message", value: "Hello, world!"}]`) -- `varNames` - массив, обязательный параметр. Имена переменных для преобразования кода шаблонизатора **Важно:** Параметр `cacheDirectory` в опциях babel-loader должен быть отключён. diff --git a/index.js b/index.js index e22fd9d..2212de2 100644 --- a/index.js +++ b/index.js @@ -2,25 +2,20 @@ import nunjucks from 'nunjucks'; export default ({types: t}) => { return { + pre(state) { + const options = state.opts.plugins[0].options; + this.njkenv = new nunjucks.Environment(new nunjucks.FileSystemLoader(options.templatesFolder)); + if (options.globals) { + options.globals.forEach(({name, value}) => { + this.njkenv.addGlobal(name, value); + }); + } + }, visitor: { - Identifier(path, state) { - for (let i = 0; i < state.opts.varNames.length; i += 1) { - if ( - path.parentPath.type === 'VariableDeclarator' && - path.isIdentifier({name: state.opts.varNames[i]}) - ) { - const templatesFolder = state.opts.templatesFolder; - const value = path.parentPath.get('init').node.quasis[0].value.raw; - const env = new nunjucks.Environment(new nunjucks.FileSystemLoader(templatesFolder)); - if (state.opts.globals) { - state.opts.globals.forEach(({name, value}) => { - env.addGlobal(name, value); - }); - } - const render = env.renderString(value); - path.parentPath.get('init').node.quasis = [t.templateElement({cooked: render, raw: render})]; - break; - } + TaggedTemplateExpression(path) { + if (path.get('tag').isIdentifier({name: 'njk'})) { + const render = this.njkenv.renderString(path.node.quasi.quasis[0].value.raw); + path.replaceWith(t.stringLiteral(render)); } }, }, diff --git a/package.json b/package.json index 3b6e223..5059990 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@advdominion/babel-plugin-nunjucks", - "version": "2.1.0", + "version": "3.0.0", "type": "module", "engines": { "node": "^16.0.0"