import test from "ava";
import fs from "fs-extra";
import pretty from "pretty";
import TemplateData from "../src/TemplateData";
import Template from "../src/Template";
import EleventyErrorUtil from "../src/EleventyErrorUtil";
import TemplateContentPrematureUseError from "../src/Errors/TemplateContentPrematureUseError";
import templateConfig from "../src/Config";
import normalizeNewLines from "./Util/normalizeNewLines";
const config = templateConfig.getConfig();
function cleanHtml(str) {
return pretty(str, { ocd: true });
}
test("getTemplateSubFolder", t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./dist"
);
t.is(tmpl.getTemplateSubfolder(), "");
});
test("getTemplateSubFolder, output is a subdir of input", t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./test/stubs/_site"
);
t.is(tmpl.getTemplateSubfolder(), "");
});
test("output path maps to an html file", async t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./dist"
);
t.is(tmpl.parsed.dir, "./test/stubs");
t.is(tmpl.inputDir, "./test/stubs");
t.is(tmpl.outputDir, "./dist");
t.is(tmpl.getTemplateSubfolder(), "");
t.is(await tmpl.getOutputPath(), "./dist/template/index.html");
});
test("subfolder outputs to a subfolder", async t => {
let tmpl = new Template(
"./test/stubs/subfolder/subfolder.ejs",
"./test/stubs/",
"./dist"
);
t.is(tmpl.parsed.dir, "./test/stubs/subfolder");
t.is(tmpl.getTemplateSubfolder(), "subfolder");
t.is(await tmpl.getOutputPath(), "./dist/subfolder/index.html");
});
test("subfolder outputs to double subfolder", async t => {
let tmpl = new Template(
"./test/stubs/subfolder/subfolder/subfolder.ejs",
"./test/stubs/",
"./dist"
);
t.is(tmpl.parsed.dir, "./test/stubs/subfolder/subfolder");
t.is(tmpl.getTemplateSubfolder(), "subfolder/subfolder");
t.is(await tmpl.getOutputPath(), "./dist/subfolder/subfolder/index.html");
});
test("HTML files output to the same as the input directory have a file suffix added (only if index, this is not index).", async t => {
let tmpl = new Template(
"./test/stubs/testing.html",
"./test/stubs",
"./test/stubs"
);
t.is(await tmpl.getOutputPath(), "./test/stubs/testing/index.html");
});
test("HTML files output to the same as the input directory have a file suffix added (only if index, this _is_ index).", async t => {
let tmpl = new Template(
"./test/stubs/index.html",
"./test/stubs",
"./test/stubs"
);
t.is(await tmpl.getOutputPath(), "./test/stubs/index-o.html");
});
test("HTML files output to the same as the input directory have a file suffix added (only if index, this _is_ index, subfolder).", async t => {
let tmpl = new Template(
"./test/stubs/subfolder/index.html",
"./test/stubs",
"./test/stubs"
);
t.is(await tmpl.getOutputPath(), "./test/stubs/subfolder/index-o.html");
});
test("Test raw front matter from template (yaml)", async t => {
// https://github.com/jonschlinkert/gray-matter/blob/master/examples/yaml.js
let tmpl = new Template(
"./test/stubs/templateFrontMatter.ejs",
"./test/stubs/",
"./dist"
);
t.truthy(await tmpl.getInputContent(), "template exists and can be opened.");
t.is((await tmpl.getFrontMatter()).data.key1, "value1");
t.is((await tmpl.getFrontMatter()).data.key3, "value3");
let data = await tmpl.getData();
t.is(data.key1, "value1");
t.is(data.key3, "value3");
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), "c:value1:value2:value3");
});
test("Test raw front matter from template (json)", async t => {
// https://github.com/jonschlinkert/gray-matter/blob/master/examples/json.js
let tmpl = new Template(
"./test/stubs/templateFrontMatterJson.ejs",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.getFrontMatter()).data.key1, "value1");
t.is((await tmpl.getFrontMatter()).data.key3, "value3");
let data = await tmpl.getData();
t.is(data.key1, "value1");
t.is(data.key3, "value3");
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), "c:value1:value2:value3");
});
test("Test raw front matter from template (js)", async t => {
// https://github.com/jonschlinkert/gray-matter/blob/master/examples/javascript.js
let tmpl = new Template(
"./test/stubs/templateFrontMatterJs.ejs",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.getFrontMatter()).data.key1, "value1");
t.is((await tmpl.getFrontMatter()).data.key3, "value3");
let data = await tmpl.getData();
t.is(data.key1, "value1");
t.is(data.key3, "value3");
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), "c:value1:VALUE2:value3");
});
test("Test that getData() works", async t => {
let tmpl = new Template(
"./test/stubs/templateFrontMatter.ejs",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
t.is(data.key1, "value1");
t.is(data.key3, "value3");
});
test("One Layout (using new content var)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/templateWithLayout.ejs",
"./test/stubs/",
"dist",
dataObj
);
t.is((await tmpl.getFrontMatter()).data[config.keys.layout], "defaultLayout");
let data = await tmpl.getData();
t.is(data[config.keys.layout], "defaultLayout");
t.is(
normalizeNewLines(cleanHtml(await tmpl.renderLayout(tmpl, data))),
`
`
);
t.is(data.keymain, "valuemain");
t.is(data.keylayout, "valuelayout");
});
test("One Layout (using layoutContent)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/templateWithLayoutContent.ejs",
"./test/stubs/",
"dist",
dataObj
);
t.is(
(await tmpl.getFrontMatter()).data[config.keys.layout],
"defaultLayoutLayoutContent"
);
let data = await tmpl.getData();
t.is(data[config.keys.layout], "defaultLayoutLayoutContent");
t.is(
normalizeNewLines(cleanHtml(await tmpl.renderLayout(tmpl, data))),
``
);
t.is(data.keymain, "valuemain");
t.is(data.keylayout, "valuelayout");
});
test("One Layout (layouts disabled)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/templateWithLayoutContent.ejs",
"./test/stubs/",
"dist",
dataObj
);
tmpl.setWrapWithLayouts(false);
t.is(
(await tmpl.getFrontMatter()).data[config.keys.layout],
"defaultLayoutLayoutContent"
);
let data = await tmpl.getData();
t.is(data[config.keys.layout], "defaultLayoutLayoutContent");
t.is(cleanHtml(await tmpl.render(data)), "Hello.
");
t.is(data.keymain, "valuemain");
t.is(data.keylayout, "valuelayout");
});
test("One Layout (_layoutContent deprecated but supported)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/templateWithLayoutBackCompat.ejs",
"./test/stubs/",
"dist",
dataObj
);
t.is(
(await tmpl.getFrontMatter()).data[config.keys.layout],
"defaultLayout_layoutContent"
);
let data = await tmpl.getData();
t.is(data[config.keys.layout], "defaultLayout_layoutContent");
t.is(
normalizeNewLines(cleanHtml(await tmpl.renderLayout(tmpl, data))),
``
);
t.is(data.keymain, "valuemain");
t.is(data.keylayout, "valuelayout");
});
test("One Layout (liquid test)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/templateWithLayout.liquid",
"./test/stubs/",
"dist",
dataObj
);
t.is(
(await tmpl.getFrontMatter()).data[config.keys.layout],
"layoutLiquid.liquid"
);
let data = await tmpl.getData();
t.is(data[config.keys.layout], "layoutLiquid.liquid");
t.is(
normalizeNewLines(cleanHtml(await tmpl.renderLayout(tmpl, data))),
``
);
t.is(data.keymain, "valuemain");
t.is(data.keylayout, "valuelayout");
});
test("Two Layouts", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/templateTwoLayouts.ejs",
"./test/stubs/",
"dist",
dataObj
);
t.is((await tmpl.getFrontMatter()).data[config.keys.layout], "layout-a");
let data = await tmpl.getData();
t.is(data[config.keys.layout], "layout-a");
t.is(data.key1, "value1");
t.is(
normalizeNewLines(cleanHtml(await tmpl.renderLayout(tmpl, data))),
``
);
t.is(data.daysPosted, 152);
});
test("Liquid template", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/formatTest.liquid",
"./test/stubs/",
"dist",
dataObj
);
t.is(await tmpl.render(), `Zach
`);
});
test("Liquid template with include", async t => {
let tmpl = new Template(
"./test/stubs/includer.liquid",
"./test/stubs/",
"dist"
);
t.is((await tmpl.render()).trim(), "This is an include.
");
});
test("ES6 Template Literal (No Backticks)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/formatTest.jstl",
"./test/stubs/",
"dist",
dataObj
);
t.is((await tmpl.render()).trim(), `ZACH
`);
});
test("ES6 Template Literal (with Backticks)", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/formatTestBackticks.jstl",
"./test/stubs/",
"dist",
dataObj
);
t.is((await tmpl.render()).trim(), `ZACH
`);
});
test("Permalink output directory", async t => {
let tmpl = new Template(
"./test/stubs/permalinked.ejs",
"./test/stubs/",
"./dist"
);
t.is(await tmpl.getOutputPath(), "./dist/permalinksubfolder/index.html");
});
test("Permalink output directory from layout", async t => {
let tmpl = new Template(
"./test/stubs/permalink-in-layout.ejs",
"./test/stubs/",
"./dist"
);
t.is(await tmpl.getOutputPath(), "./dist/hello/index.html");
});
test("Permalink output directory from layout (fileslug)", async t => {
let tmpl = new Template(
"./test/stubs/permalink-in-layout-fileslug.ejs",
"./test/stubs/",
"./dist"
);
t.is(
await tmpl.getOutputPath(),
"./dist/test/permalink-in-layout-fileslug/index.html"
);
});
test("Layout from template-data-file that has a permalink (fileslug) Issue #121", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/permalink-data-layout/test.njk",
"./test/stubs/",
"./dist",
dataObj
);
let data = await tmpl.getData();
let renderedTmpl = (await tmpl.getRenderedTemplates(data))[0];
t.is(renderedTmpl.templateContent, "Wrapper:Test 1:test");
t.is(await tmpl.getOutputPath(), "./dist/test/index.html");
});
test("Fileslug in an 11ty.js template Issue #588", async t => {
let tmpl = new Template(
"./test/stubs/fileslug.11ty.js",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
let renderedTmpl = (await tmpl.getRenderedTemplates(data))[0];
t.is(renderedTmpl.templateContent, "fileslug
");
});
test("Local template data file import (without a global data json)", async t => {
let dataObj = new TemplateData("./test/stubs/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/component/component.njk",
"./test/stubs/",
"./dist",
dataObj
);
let data = await tmpl.getData();
t.deepEqual(await dataObj.getLocalDataPaths(tmpl.getInputPath()), [
"./test/stubs/component/component.json",
"./test/stubs/component/component.11tydata.json",
"./test/stubs/component/component.11tydata.js"
]);
t.is(data.localdatakey1, "localdatavalue1");
t.is(await tmpl.render(), "localdatavalue1");
});
test("Local template data file import (two subdirectories deep)", async t => {
let dataObj = new TemplateData("./test/stubs/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/firstdir/seconddir/component.njk",
"./test/stubs/",
"./dist",
dataObj
);
t.deepEqual(await dataObj.getLocalDataPaths(tmpl.getInputPath()), [
"./test/stubs/firstdir/firstdir.json",
"./test/stubs/firstdir/firstdir.11tydata.json",
"./test/stubs/firstdir/firstdir.11tydata.js",
"./test/stubs/firstdir/seconddir/seconddir.json",
"./test/stubs/firstdir/seconddir/seconddir.11tydata.json",
"./test/stubs/firstdir/seconddir/seconddir.11tydata.js",
"./test/stubs/firstdir/seconddir/component.json",
"./test/stubs/firstdir/seconddir/component.11tydata.json",
"./test/stubs/firstdir/seconddir/component.11tydata.js"
]);
});
test("Posts inherits local JSON, layouts", async t => {
let dataObj = new TemplateData("./test/stubs/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/posts/post1.njk",
"./test/stubs/",
"./dist",
dataObj
);
let localDataPaths = await dataObj.getLocalDataPaths(tmpl.getInputPath());
t.deepEqual(localDataPaths, [
"./test/stubs/posts/posts.json",
"./test/stubs/posts/posts.11tydata.json",
"./test/stubs/posts/posts.11tydata.js",
"./test/stubs/posts/post1.json",
"./test/stubs/posts/post1.11tydata.json",
"./test/stubs/posts/post1.11tydata.js"
]);
let localData = await dataObj.getLocalData(tmpl.getInputPath());
t.is(localData.layout, "mylocallayout.njk");
t.truthy(localData.pkg);
let data = await tmpl.getData();
t.is(localData.layout, "mylocallayout.njk");
t.is(
normalizeNewLines((await tmpl.render(data)).trim()),
`Post1
`
);
});
test("Template and folder name are the same, make sure data imports work ok", async t => {
let dataObj = new TemplateData("./test/stubs/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/posts/posts.njk",
"./test/stubs/",
"./dist",
dataObj
);
let localDataPaths = await dataObj.getLocalDataPaths(tmpl.getInputPath());
t.deepEqual(localDataPaths, [
"./test/stubs/posts/posts.json",
"./test/stubs/posts/posts.11tydata.json",
"./test/stubs/posts/posts.11tydata.js"
]);
let localData = await dataObj.getLocalData(tmpl.getInputPath());
t.is(localData.layout, "mylocallayout.njk");
t.truthy(localData.pkg);
let data = await tmpl.getData();
t.is(localData.layout, "mylocallayout.njk");
t.is(
normalizeNewLines((await tmpl.render(data)).trim()),
`Posts
`
);
});
test("Clone the template", async t => {
let tmpl = new Template(
"./test/stubs/default.ejs",
"./test/stubs/",
"./dist"
);
let cloned = tmpl.clone();
t.is(await tmpl.getOutputPath(), "./dist/default/index.html");
t.is(await cloned.getOutputPath(), "./dist/default/index.html");
});
test("Permalink with variables!", async t => {
let tmpl = new Template(
"./test/stubs/permalinkdata.njk",
"./test/stubs/",
"./dist"
);
t.is(await tmpl.getOutputPath(), "./dist/subdir/slug-candidate/index.html");
});
test("Permalink with dates!", async t => {
let tmpl = new Template(
"./test/stubs/permalinkdate.liquid",
"./test/stubs/",
"./dist"
);
t.is(await tmpl.getOutputPath(), "./dist/2016/01/01/index.html");
});
test("Permalink with dates on file name regex!", async t => {
let tmpl = new Template(
"./test/stubs/2016-02-01-permalinkdate.liquid",
"./test/stubs/",
"./dist"
);
t.is(await tmpl.getOutputPath(), "./dist/2016/02/01/index.html");
});
test("Reuse permalink in directory specific data file", async t => {
let dataObj = new TemplateData("./test/stubs/");
let tmpl = new Template(
"./test/stubs/reuse-permalink/test1.liquid",
"./test/stubs/",
"./dist",
dataObj
);
t.is(await tmpl.getOutputPath(), "./dist/2016/01/01/index.html");
});
test("mapDataAsRenderedTemplates", async t => {
let tmpl = new Template(
"./test/stubs/default.ejs",
"./test/stubs/",
"./dist"
);
t.deepEqual(
await tmpl.mapDataAsRenderedTemplates(
{
key1: "value1",
key2: "value2",
key3: "value3"
},
{ parsedKey: "parsedValue" }
),
{
key1: "value1",
key2: "value2",
key3: "value3"
}
);
t.deepEqual(
await tmpl.mapDataAsRenderedTemplates(
{
key1: "value1",
key2: "<%= parsedKey %>"
},
{ parsedKey: "parsedValue" }
),
{
key1: "value1",
key2: "parsedValue"
}
);
t.deepEqual(
await tmpl.mapDataAsRenderedTemplates(
{
key1: "value1",
key2: ["<%= parsedKey %>", 2]
},
{ parsedKey: "parsedValue" }
),
{
key1: "value1",
key2: ["parsedValue", 2]
}
);
});
test("renderData", async t => {
let tmpl = new Template(
"./test/stubs/renderData/renderData.njk",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "hi:value2-value1.css");
});
test("renderData markdown (issue #40)", async t => {
let tmpl = new Template(
"./test/stubs/renderData/renderData.md",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "value2-value1.css");
});
test("getMappedDate (empty, assume created)", async t => {
let tmpl = new Template(
"./test/stubs/dates/file1.md",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
let date = await tmpl.getMappedDate(data);
t.true(date instanceof Date);
t.truthy(date.getTime());
});
test("getMappedDate (explicit date, yaml String)", async t => {
let tmpl = new Template(
"./test/stubs/dates/file2.md",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
let date = await tmpl.getMappedDate(data);
t.true(date instanceof Date);
t.truthy(date.getTime());
});
test("getMappedDate (explicit date, yaml Date)", async t => {
let tmpl = new Template(
"./test/stubs/dates/file2b.md",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
let date = await tmpl.getMappedDate(data);
t.true(date instanceof Date);
t.truthy(date.getTime());
});
test("getMappedDate (explicit date, yaml Date and string should be the same)", async t => {
let tmplA = new Template(
"./test/stubs/dates/file2.md",
"./test/stubs/",
"./dist"
);
let dataA = await tmplA.getRenderedData();
let stringDate = await tmplA.getMappedDate(dataA);
let tmplB = new Template(
"./test/stubs/dates/file2b.md",
"./test/stubs/",
"./dist"
);
let dataB = await tmplB.getRenderedData();
let yamlDate = await tmplB.getMappedDate(dataB);
t.truthy(stringDate);
t.truthy(yamlDate);
t.deepEqual(stringDate, yamlDate);
});
test("getMappedDate (modified date)", async t => {
let tmpl = new Template(
"./test/stubs/dates/file3.md",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
let date = await tmpl.getMappedDate(data);
t.true(date instanceof Date);
t.truthy(date.getTime());
});
test("getMappedDate (created date)", async t => {
let tmpl = new Template(
"./test/stubs/dates/file4.md",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
let date = await tmpl.getMappedDate(data);
t.true(date instanceof Date);
t.truthy(date.getTime());
});
test("getMappedDate (falls back to filename date)", async t => {
let tmpl = new Template(
"./test/stubs/dates/2018-01-01-file5.md",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
let date = await tmpl.getMappedDate(data);
t.true(date instanceof Date);
t.truthy(date.getTime());
});
test("getRenderedData() has all the page variables", async t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
t.truthy(data.page.url);
t.is(data.page.url, "/template/");
t.is(data.page.fileSlug, "template");
t.is(data.page.filePathStem, "/template");
t.truthy(data.page.date.getTime());
t.is(data.page.inputPath, "./test/stubs/template.ejs");
t.is(data.page.outputPath, "./dist/template/index.html");
});
test("Issue #603: page.date Liquid", async t => {
let tmpl = new Template(
"./test/stubs/pagedate.liquid",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
t.truthy(data.page.date);
t.truthy(data.page.date.toUTCString());
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), data.page.date.toString());
});
test("Issue #603: page.date Nunjucks", async t => {
let tmpl = new Template(
"./test/stubs/pagedate.njk",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
t.truthy(data.page.date);
t.truthy(data.page.date.toUTCString());
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), data.page.date.toString());
});
test("Issue #603: page.date.toUTCString() Nunjucks", async t => {
// Note this is not supported in Liquid
let tmpl = new Template(
"./test/stubs/pagedateutc.njk",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
t.truthy(data.page.date);
t.truthy(data.page.date.toUTCString());
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), data.page.date.toUTCString());
});
test("getTemplates() data has all the root variables", async t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
let templates = await tmpl.getTemplates(data);
t.is(templates[0].url, "/template/");
t.is(templates[0].fileSlug, "template");
t.is(templates[0].filePathStem, "/template");
t.truthy(templates[0].date.getTime());
t.is(templates[0].inputPath, "./test/stubs/template.ejs");
t.is(templates[0].outputPath, "./dist/template/index.html");
});
test("getTemplates() data has all the page variables", async t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
let templates = await tmpl.getTemplates(data);
t.is(templates[0].data.page.url, "/template/");
t.is(templates[0].data.page.fileSlug, "template");
t.is(templates[0].filePathStem, "/template");
t.truthy(templates[0].data.page.date.getTime());
t.is(templates[0].data.page.inputPath, "./test/stubs/template.ejs");
t.is(templates[0].data.page.outputPath, "./dist/template/index.html");
});
test("getRenderedTemplates() data has all the page variables", async t => {
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
let templates = await tmpl.getRenderedTemplates(data);
t.is(templates[0].data.page.url, "/template/");
t.is(templates[0].data.page.fileSlug, "template");
t.is(templates[0].filePathStem, "/template");
t.truthy(templates[0].data.page.date.getTime());
t.is(templates[0].data.page.inputPath, "./test/stubs/template.ejs");
t.is(templates[0].data.page.outputPath, "./dist/template/index.html");
});
test("getRenderedData() has good slug (empty, index)", async t => {
let tmpl = new Template("./test/stubs/index.ejs", "./test/stubs/", "./dist");
let data = await tmpl.getRenderedData();
t.is(data.page.fileSlug, "");
t.is(data.page.filePathStem, "/index");
});
test("getRenderedData() has good slug", async t => {
let tmpl = new Template(
"./test/stubs/includer.liquid",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getRenderedData();
t.is(data.page.fileSlug, "includer");
t.is(data.page.filePathStem, "/includer");
});
test("Override base templating engine from .liquid to ejs", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-ejs.liquid",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "My Title");
});
test("Override base templating engine from markdown to 11ty.js, then markdown", async t => {
let tmpl = new Template(
"./test/stubs/test-override-js-markdown.11ty.js",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "This is markdown
");
});
test("Override base templating engine from .liquid to md", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-md.liquid",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "My Title
");
});
test("Override base templating engine from .liquid to ejs,md", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-multiple.md",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "My Title
");
});
test("Override base templating engine from .njk to ejs,md", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-multiple2.njk",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "My Title
");
});
test("Override base templating engine from .html to ejs", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test.html",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "My Title
");
});
test("Override base templating engine from .html to (nothing)", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-empty.html",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "<%= title %>
");
});
test("Override base templating engine should error with bad string", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-error.njk",
"./test/stubs/",
"./dist"
);
await t.throwsAsync(async () => {
await tmpl.render();
});
});
test("Override base templating engine (bypasses markdown)", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-bypass.md",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "# My Title");
});
test("Override base templating engine to (nothing)", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test-empty.md",
"./test/stubs/",
"./dist"
);
// not parsed
t.is((await tmpl.render()).trim(), "# <%= title %>");
});
test("Override base templating engine from .ejs to njk", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test.ejs",
"./test/stubs/",
"./dist"
);
t.is((await tmpl.render()).trim(), "My Title");
});
test("Override base templating engine from .njk to ejs (with a layout that uses njk)", async t => {
let tmpl = new Template(
"./test/stubs/overrides/layout.njk",
"./test/stubs/",
"./dist"
);
t.is(
(await tmpl.render()).trim(),
'My Title
'
);
});
test("Override base templating engine from .njk to nothing (with a layout that uses njk)", async t => {
let tmpl = new Template(
"./test/stubs/overrides/layoutfalse.njk",
"./test/stubs/",
"./dist"
);
t.is(
(await tmpl.render()).trim(),
`<%= title %>
`
);
});
test("Using a markdown source file (with a layout that uses njk), markdown shouldn’t render in layout file", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test.md",
"./test/stubs/",
"./dist"
);
t.is(
normalizeNewLines((await tmpl.render()).trim()),
`# Layout header
My Title
`
);
});
test("Override base templating engine from .md to ejs,md (with a layout that uses njk), markdown shouldn’t render in layout file", async t => {
let tmpl = new Template(
"./test/stubs/overrides/test2.md",
"./test/stubs/",
"./dist"
);
t.is(
normalizeNewLines((await tmpl.render()).trim()),
`# Layout header
My Title
`
);
});
test("renderContent on a markdown file, permalink should not render markdown", async t => {
let tmpl = new Template(
"./test/stubs/permalink-markdown.md",
"./test/stubs/",
"./dist"
);
t.is(
await tmpl.renderContent("/news/my-test-file/index.html", {}, true),
"/news/my-test-file/index.html"
);
t.is(await tmpl.getOutputLink(), "/news/my-test-file/index.html");
});
test("renderContent on a markdown file, permalink should not render markdown (with variable)", async t => {
let tmpl = new Template(
"./test/stubs/permalink-markdown-var.md",
"./test/stubs/",
"./dist"
);
t.is(
await tmpl.renderContent(
"/news/{{ slug }}/index.html",
{ slug: "my-title" },
true
),
"/news/my-title/index.html"
);
t.is(await tmpl.getOutputLink(), "/news/my-title/index.html");
});
test("renderContent on a markdown file, permalink should not render markdown (has override)", async t => {
let tmpl = new Template(
"./test/stubs/permalink-markdown-override.md",
"./test/stubs/",
"./dist"
);
t.is(
await tmpl.renderContent("/news/my-test-file/index.html", {}, true),
"/news/my-test-file/index.html"
);
t.is(await tmpl.getOutputLink(), "/news/my-test-file/index.html");
});
/* Transforms */
test("Test a transform", async t => {
t.plan(2);
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./test/stubs/_site"
);
tmpl.addTransform(function(content, outputPath) {
t.true(outputPath.endsWith(".html"));
return "OVERRIDE BY A TRANSFORM";
});
let renders = await tmpl._testCompleteRender();
t.is(renders[0], "OVERRIDE BY A TRANSFORM");
});
test("Test a transform with pages", async t => {
t.plan(5);
let tmpl = new Template(
"./test/stubs/transform-pages/template.njk",
"./test/stubs/",
"./test/stubs/_site"
);
tmpl.addTransform(function(content, outputPath) {
// should run twice, one for each page
t.true(content.length > 0);
t.true(outputPath.endsWith(".html"));
return "OVERRIDE BY A TRANSFORM";
});
let renders = await tmpl._testCompleteRender();
t.is(renders[0], "OVERRIDE BY A TRANSFORM");
});
test("Test a transform with a layout", async t => {
t.plan(3);
let tmpl = new Template(
"./test/stubs-475/transform-layout/transform-layout.njk",
"./test/stubs-475/",
"./test/stubs-475/_site"
);
tmpl.addTransform(function(content, outputPath) {
t.is(content, "This is content.");
t.true(outputPath.endsWith(".html"));
return "OVERRIDE BY A TRANSFORM";
});
let renders = await tmpl._testCompleteRender();
t.is(renders[0], "OVERRIDE BY A TRANSFORM");
});
test("Test a single asynchronous transform", async t => {
t.plan(2);
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./test/stubs/_site"
);
tmpl.addTransform(async function(content, outputPath) {
t.true(outputPath.endsWith("template/index.html"));
return new Promise((resolve, reject) => {
setTimeout(function(str, outputPath) {
resolve("OVERRIDE BY A TRANSFORM");
}, 50);
});
});
let renders = await tmpl._testCompleteRender();
t.is(renders[0], "OVERRIDE BY A TRANSFORM");
});
test("Test multiple asynchronous transforms", async t => {
t.plan(3);
let tmpl = new Template(
"./test/stubs/template.ejs",
"./test/stubs/",
"./test/stubs/_site"
);
tmpl.addTransform(async function(content, outputPath) {
t.true(outputPath.endsWith("template/index.html"));
return new Promise((resolve, reject) => {
setTimeout(function(str, outputPath) {
resolve("lowercase transform");
}, 50);
});
});
// uppercase
tmpl.addTransform(async function(str, outputPath) {
t.true(outputPath.endsWith("template/index.html"));
return new Promise((resolve, reject) => {
setTimeout(function() {
resolve(str.toUpperCase());
}, 50);
});
});
let renders = await tmpl._testCompleteRender();
t.is(renders[0], "LOWERCASE TRANSFORM");
});
test("Test a linter", async t => {
t.plan(4);
let tmpl = new Template(
"./test/stubs/transform-pages/template.njk",
"./test/stubs/",
"./test/stubs/_site"
);
tmpl.addLinter(function(str, inputPath, outputPath) {
t.true(inputPath.endsWith("template.njk"));
t.true(outputPath.endsWith("index.html"));
});
await tmpl._testCompleteRender();
});
test("permalink: false", async t => {
let tmpl = new Template(
"./test/stubs/permalink-false/test.md",
"./test/stubs/",
"./test/stubs/_site"
);
t.is(await tmpl.getOutputLink(), false);
t.is(await tmpl.getOutputHref(), false);
let data = await tmpl.getData();
await tmpl.write(false, data);
// Input file exists (sanity check for paths)
t.is(fs.existsSync("./test/stubs/permalink-false/"), true);
t.is(fs.existsSync("./test/stubs/permalink-false/test.md"), true);
// Output does not exist
t.is(fs.existsSync("./test/stubs/_site/permalink-false/"), false);
t.is(fs.existsSync("./test/stubs/_site/permalink-false/test/"), false);
t.is(
fs.existsSync("./test/stubs/_site/permalink-false/test/index.html"),
false
);
});
test("Disable dynamic permalinks", async t => {
let tmpl = new Template(
"./test/stubs/dynamic-permalink/test.njk",
"./test/stubs/",
"./test/stubs/_site"
);
t.is(await tmpl.getOutputLink(), "/{{justastring}}/index.html");
t.is(await tmpl.getOutputHref(), "/{{justastring}}/");
});
test("Front Matter Tags (Single)", async t => {
let tmpl = new Template(
"./test/stubs/templatetest-frontmatter/single.njk",
"./test/stubs/",
"dist"
);
let frontmatter = await tmpl.getFrontMatterData();
t.deepEqual(frontmatter.tags, ["single-tag"]);
let fulldata = await tmpl.getData();
t.deepEqual(fulldata.tags, ["single-tag"]);
let pages = await tmpl.getRenderedTemplates(fulldata);
t.is(pages[0].templateContent.trim(), "Has single-tag");
});
test("Front Matter Tags (Multiple)", async t => {
let tmpl = new Template(
"./test/stubs/templatetest-frontmatter/multiple.njk",
"./test/stubs/",
"dist"
);
let frontmatter = await tmpl.getFrontMatterData();
t.deepEqual(frontmatter.tags, ["multi-tag", "multi-tag-2"]);
let fulldata = await tmpl.getData();
t.deepEqual(fulldata.tags, ["multi-tag", "multi-tag-2"]);
let pages = await tmpl.getRenderedTemplates(fulldata);
t.is(pages[0].templateContent.trim(), "Has multi-tag-2");
});
test("Front matter date with quotes (liquid), issue #258", async t => {
let tmpl = new Template(
"./test/stubs/frontmatter-date/test.liquid",
"./test/stubs/",
"dist"
);
let data = await tmpl.getData();
t.is(data.mydate.toISOString(), "2009-04-15T11:34:34.000Z");
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), "2009-04-15");
});
test("Front matter date with quotes (njk), issue #258", async t => {
let tmpl = new Template(
"./test/stubs/frontmatter-date/test.njk",
"./test/stubs/",
"dist"
);
let data = await tmpl.getData();
t.is(data.mydate.toISOString(), "2009-04-15T00:34:34.000Z");
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), "2009-04-15T00:34:34.000Z");
});
test("Data Cascade (Deep merge)", async t => {
let newConfig = Object.assign({}, config);
newConfig.dataDeepMerge = true;
let dataObj = new TemplateData("./test/");
dataObj._setConfig(newConfig);
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/data-cascade/template.njk",
"./test/stubs/",
"./dist",
dataObj
);
tmpl.config = newConfig;
let data = await tmpl.getData();
t.deepEqual(Object.keys(data).sort(), [
"datafile",
"frontmatter",
"page",
"parent",
"pkg",
"tags"
]);
t.deepEqual(Object.keys(data.parent).sort(), [
"child",
"datafile",
"frontmatter"
]);
t.is(data.parent.child, -2);
});
test("Data Cascade (Shallow merge)", async t => {
let dataObj = new TemplateData("./test/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/data-cascade/template.njk",
"./test/stubs/",
"./dist",
dataObj
);
let data = await tmpl.getData();
t.deepEqual(Object.keys(data).sort(), [
"datafile",
"frontmatter",
"page",
"parent",
"pkg",
"tags"
]);
t.deepEqual(Object.keys(data.parent).sort(), ["child", "frontmatter"]);
t.is(data.parent.child, -2);
});
test("Data Cascade Tag Merge (Deep merge)", async t => {
let newConfig = Object.assign({}, config);
newConfig.dataDeepMerge = true;
let dataObj = new TemplateData("./test/stubs/");
dataObj._setConfig(newConfig);
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/data-cascade/template.njk",
"./test/stubs/",
"./dist",
dataObj
);
tmpl.config = newConfig;
let data = await tmpl.getData();
t.deepEqual(data.tags.sort(), ["tagA", "tagB", "tagC", "tagD"]);
});
test("Data Cascade Tag Merge (Shallow merge)", async t => {
let dataObj = new TemplateData("./test/stubs/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/data-cascade/template.njk",
"./test/stubs/",
"./dist",
dataObj
);
let data = await tmpl.getData();
t.deepEqual(data.tags.sort(), ["tagA", "tagB"]);
});
test('Local data inherits tags string ([tags] vs "tags") Shallow Merge', async t => {
let dataObj = new TemplateData("./test/stubs/");
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/local-data-tags/component.njk",
"./test/stubs/",
"./dist",
dataObj
);
let data = await tmpl.getData();
t.deepEqual(data.tags.sort(), ["tag1", "tag2"]);
});
test('Local data inherits tags string ([tags] vs "tags") Deep Merge', async t => {
let newConfig = Object.assign({}, config);
newConfig.dataDeepMerge = true;
let dataObj = new TemplateData("./test/stubs/");
dataObj._setConfig(newConfig);
await dataObj.cacheData();
let tmpl = new Template(
"./test/stubs/local-data-tags/component.njk",
"./test/stubs/",
"./dist",
dataObj
);
tmpl.config = newConfig;
let data = await tmpl.getData();
t.deepEqual(data.tags.sort(), ["tag1", "tag2", "tag3"]);
});
test("Throws a Premature Template Content Error (njk)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.njk",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error from rendering (njk)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.njk",
"./test/stubs/",
"./test/stubs/_site"
);
let mapEntries = await tmpl.getTemplateMapEntries();
let pageEntries = await tmpl.getTemplates({
page: {},
sample: {
get templateContent() {
throw new TemplateContentPrematureUseError(
"Tried to use templateContent too early (test.njk)"
);
}
}
});
let error = await t.throwsAsync(async () => {
await tmpl.renderPageEntry(mapEntries[0], pageEntries[0]);
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (liquid)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.liquid",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (11ty.js)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.11ty.js",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (pug)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.pug",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error from rendering (pug)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.pug",
"./test/stubs/",
"./test/stubs/_site"
);
let mapEntries = await tmpl.getTemplateMapEntries();
let pageEntries = await tmpl.getTemplates({
page: {},
sample: {
get templateContent() {
throw new TemplateContentPrematureUseError(
"Tried to use templateContent too early (test.pug)"
);
}
}
});
let error = await t.throwsAsync(async () => {
await tmpl.renderPageEntry(mapEntries[0], pageEntries[0]);
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (md)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.md",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error from rendering (md)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.md",
"./test/stubs/",
"./test/stubs/_site"
);
let mapEntries = await tmpl.getTemplateMapEntries();
let pageEntries = await tmpl.getTemplates({
page: {},
sample: {
get templateContent() {
throw new TemplateContentPrematureUseError(
"Tried to use templateContent too early (test.md)"
);
}
}
});
let error = await t.throwsAsync(async () => {
await tmpl.renderPageEntry(mapEntries[0], pageEntries[0]);
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (hbs)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.hbs",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error from rendering (hbs)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.hbs",
"./test/stubs/",
"./test/stubs/_site"
);
let mapEntries = await tmpl.getTemplateMapEntries();
let pageEntries = await tmpl.getTemplates({
page: {},
sample: {
get templateContent() {
throw new TemplateContentPrematureUseError(
"Tried to use templateContent too early (test.hbs)"
);
}
}
});
let error = await t.throwsAsync(async () => {
await tmpl.renderPageEntry(mapEntries[0], pageEntries[0]);
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (mustache)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.mustache",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (ejs)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.ejs",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test("Throws a Premature Template Content Error (haml)", async t => {
let tmpl = new Template(
"./test/stubs/prematureTemplateContent/test.haml",
"./test/stubs/",
"./test/stubs/_site"
);
let data = await tmpl.getData();
let mapEntries = await tmpl.getTemplates(data);
let error = t.throws(() => {
mapEntries[0].templateContent;
});
t.is(EleventyErrorUtil.isPrematureTemplateContentError(error), true);
});
test.skip("Issue 413 weird date format", async t => {
let tmpl = new Template(
"./test/stubs-413/date-frontmatter.md",
"./test/stubs-413/",
"./dist"
);
let data = await tmpl.getData();
t.is(data.page.date, "");
});
test("Custom Front Matter Parsing Options", async t => {
let newConfig = Object.assign({}, config);
newConfig.frontMatterParsingOptions = {
excerpt: true
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.is(frontmatter.data.front, "hello");
t.is(frontmatter.data.page.excerpt.trim(), "This is an excerpt.");
t.is(frontmatter.excerpt.trim(), "This is an excerpt.");
t.is(
normalizeNewLines(frontmatter.content.trim()),
`This is an excerpt.
This is content.`
);
let fulldata = await tmpl.getData();
t.is(fulldata.page.excerpt.trim(), "This is an excerpt.");
});
test("Custom Front Matter Parsing Options (using alias)", async t => {
let newConfig = Object.assign({}, config);
newConfig.frontMatterParsingOptions = {
excerpt: true,
excerpt_alias: "my_excerpt"
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.is(frontmatter.data.front, "hello");
t.is(frontmatter.data.my_excerpt.trim(), "This is an excerpt.");
t.is(
normalizeNewLines(frontmatter.content.trim()),
`This is an excerpt.
This is content.`
);
let fulldata = await tmpl.getData();
t.is(fulldata.my_excerpt.trim(), "This is an excerpt.");
});
test("Custom Front Matter Parsing Options (no newline before excerpt separator)", async t => {
let newConfig = Object.assign({}, config);
newConfig.frontMatterParsingOptions = {
excerpt: true
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template-newline1.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.is(frontmatter.data.front, "hello");
t.is(frontmatter.data.page.excerpt.trim(), "This is an excerpt.");
t.is(frontmatter.excerpt.trim(), "This is an excerpt.");
t.is(
normalizeNewLines(frontmatter.content.trim()),
`This is an excerpt.
This is content.`
);
let fulldata = await tmpl.getData();
t.is(fulldata.page.excerpt.trim(), "This is an excerpt.");
});
test("Custom Front Matter Parsing Options (no newline after excerpt separator)", async t => {
let newConfig = Object.assign({}, config);
newConfig.frontMatterParsingOptions = {
excerpt: true
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template-newline3.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.is(
normalizeNewLines(frontmatter.content.trim()),
`This is an excerpt.
This is content.`
);
});
test("Custom Front Matter Parsing Options (no newlines before or after excerpt separator)", async t => {
let newConfig = Object.assign({}, config);
newConfig.frontMatterParsingOptions = {
excerpt: true
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template-newline2.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.is(frontmatter.content.trim(), "This is an excerpt.This is content.");
});
test("Custom Front Matter Parsing Options (html comment separator)", async t => {
let newConfig = Object.assign({}, config);
newConfig.frontMatterParsingOptions = {
excerpt: true,
excerpt_separator: ""
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template-excerpt-comment.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.is(frontmatter.data.front, "hello");
t.is(frontmatter.data.page.excerpt.trim(), "This is an excerpt.");
t.is(frontmatter.excerpt.trim(), "This is an excerpt.");
t.is(
normalizeNewLines(frontmatter.content.trim()),
`This is an excerpt.
This is content.`
);
});
test.skip("Custom Front Matter Parsing Options (using TOML)", async t => {
// Depends on https://github.com/jonschlinkert/gray-matter/issues/92 for Windows
let newConfig = Object.assign({}, config);
let toml = require("toml");
newConfig.frontMatterParsingOptions = {
engines: {
toml: toml.parse.bind(toml)
}
};
let tmpl = new Template(
"./test/stubs/custom-frontmatter/template-toml.njk",
"./test/stubs/",
"./dist"
);
tmpl.config = newConfig;
let frontmatter = await tmpl.getFrontMatter();
t.deepEqual(frontmatter.data, {
front: "hello"
});
t.is(frontmatter.content.trim(), "This is content.");
let fulldata = await tmpl.getData();
t.is(fulldata.front, "hello");
});
test("global variable with dashes Issue #567 (liquid)", async t => {
let tmpl = new Template(
"./test/stubs/global-dash-variable.liquid",
"./test/stubs/",
"./dist"
);
let data = await tmpl.getData();
t.is(data["is-it-tasty"], "Yes");
let pages = await tmpl.getRenderedTemplates(data);
t.is(pages[0].templateContent.trim(), "Yes");
});
// test("Issue #446: Layout has a permalink with a different template language than content", async t => {
// let tmpl = new Template(
// "./test/stubs/layout-permalink-difflang/test.md",
// "./test/stubs/layout-permalink-difflang/",
// "dist"
// );
// let data = await tmpl.getData();
// let pages = await tmpl.getRenderedTemplates(data);
// t.is(data.permalink, "/{{ page.fileSlug }}/");
// t.is(data.page.url, "/test/");
// });