work.suroh.tk/node_modules/@11ty/eleventy/test/TemplateWriterTest.js

667 lines
20 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import test from "ava";
import fs from "fs-extra";
import rimraf from "rimraf";
import fastglob from "fast-glob";
import parsePath from "parse-filepath";
import EleventyFiles from "../src/EleventyFiles";
import EleventyExtensionMap from "../src/EleventyExtensionMap";
import TemplateWriter from "../src/TemplateWriter";
// Not sure why but this import up `ava` and _createTemplate 👀
// import Template from "../src/Template";
import eleventyConfig from "../src/EleventyConfig";
import normalizeNewLines from "./Util/normalizeNewLines";
// TODO make sure if output is a subdir of input dir that they dont conflict.
test("Output is a subdir of input", async t => {
let tw = new TemplateWriter(
"./test/stubs/writeTest",
"./test/stubs/writeTest/_writeTestSite"
);
let evf = new EleventyFiles(
"./test/stubs/writeTest",
"./test/stubs/writeTest/_writeTestSite",
["ejs", "md"]
);
evf.init();
let files = await fastglob(evf.getFileGlobs());
t.is(evf.getRawFiles().length, 2);
t.true(files.length > 0);
let tmpl = tw._createTemplate(files[0]);
t.is(tmpl.inputDir, "./test/stubs/writeTest");
t.is(
await tmpl.getOutputPath(),
"./test/stubs/writeTest/_writeTestSite/test/index.html"
);
});
test("_createTemplateMap", async t => {
let tw = new TemplateWriter(
"./test/stubs/writeTest",
"./test/stubs/_writeTestSite",
["ejs", "md"]
);
let paths = await tw._getAllPaths();
t.true(paths.length > 0);
t.is(paths[0], "./test/stubs/writeTest/test.md");
let templateMap = await tw._createTemplateMap(paths);
let map = templateMap.getMap();
t.true(map.length > 0);
t.truthy(map[0].template);
t.truthy(map[0].data);
});
test("_createTemplateMap (no leading dot slash)", async t => {
let tw = new TemplateWriter(
"test/stubs/writeTest",
"test/stubs/_writeTestSite",
["ejs", "md"]
);
let paths = await tw._getAllPaths();
t.true(paths.length > 0);
t.is(paths[0], "./test/stubs/writeTest/test.md");
});
test("getCollectionsData", async t => {
let tw = new TemplateWriter("./test/stubs/collection", "./test/stubs/_site", [
"md"
]);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.post.length, 2);
t.is(collectionsData.cat.length, 2);
t.is(collectionsData.dog.length, 1);
});
// TODO remove this (used by other test things)
test("_testGetAllTags", async t => {
let tw = new TemplateWriter("./test/stubs/collection", "./test/stubs/_site", [
"md"
]);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let tags = templateMap._testGetAllTags();
t.deepEqual(tags.sort(), ["cat", "dog", "post"].sort());
});
test("Collection of files sorted by date", async t => {
let tw = new TemplateWriter("./test/stubs/dates", "./test/stubs/_site", [
"md"
]);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.dateTestTag.length, 6);
});
test("_getCollectionsData with custom collection (ascending)", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection2",
"./test/stubs/_site",
["md"]
);
/* Careful here, eleventyConfig is a global */
eleventyConfig.addCollection("customPostsAsc", function(collection) {
return collection.getFilteredByTag("post").sort(function(a, b) {
return a.date - b.date;
});
});
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.customPostsAsc.length, 2);
t.is(parsePath(collectionsData.customPostsAsc[0].inputPath).base, "test1.md");
t.is(parsePath(collectionsData.customPostsAsc[1].inputPath).base, "test2.md");
});
test("_getCollectionsData with custom collection (descending)", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection2",
"./test/stubs/_site",
["md"]
);
/* Careful here, eleventyConfig is a global */
eleventyConfig.addCollection("customPosts", function(collection) {
return collection.getFilteredByTag("post").sort(function(a, b) {
return b.date - a.date;
});
});
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.customPosts.length, 2);
t.is(parsePath(collectionsData.customPosts[0].inputPath).base, "test2.md");
t.is(parsePath(collectionsData.customPosts[1].inputPath).base, "test1.md");
});
test("_getCollectionsData with custom collection (filter only to markdown input)", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection2",
"./test/stubs/_site",
["md"]
);
/* Careful here, eleventyConfig is a global */
eleventyConfig.addCollection("onlyMarkdown", function(collection) {
return collection.getAllSorted().filter(function(item) {
let extension = item.inputPath.split(".").pop();
return extension === "md";
});
});
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.onlyMarkdown.length, 2);
t.is(parsePath(collectionsData.onlyMarkdown[0].inputPath).base, "test1.md");
t.is(parsePath(collectionsData.onlyMarkdown[1].inputPath).base, "test2.md");
});
test("Pagination with a Collection", async t => {
let tw = new TemplateWriter(
"./test/stubs/paged/collection",
"./test/stubs/_site",
["njk"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.tag1.length, 3);
t.is(collectionsData.pagingtag.length, 1);
let mapEntry = templateMap.getMapEntryForInputPath(
"./test/stubs/paged/collection/main.njk"
);
t.truthy(mapEntry);
t.is(mapEntry.inputPath, "./test/stubs/paged/collection/main.njk");
t.is(mapEntry._pages.length, 2);
t.is(mapEntry._pages[0].outputPath, "./test/stubs/_site/main/index.html");
t.is(mapEntry._pages[1].outputPath, "./test/stubs/_site/main/1/index.html");
t.is(
mapEntry._pages[0].templateContent.trim(),
"<ol><li>/test1/</li><li>/test2/</li></ol>"
);
t.is(mapEntry._pages[1].templateContent.trim(), "<ol><li>/test3/</li></ol>");
});
test("Pagination with a Collection from another Paged Template", async t => {
let tw = new TemplateWriter(
"./test/stubs/paged/cfg-collection-tag-cfg-collection",
"./test/stubs/_site",
["njk"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.tag1.length, 3);
t.is(collectionsData.pagingtag.length, 2);
let map1 = templateMap.getMapEntryForInputPath(
"./test/stubs/paged/cfg-collection-tag-cfg-collection/paged-main.njk"
);
t.is(
map1._pages[0].templateContent.trim(),
"<ol><li>/test1/</li><li>/test2/</li></ol>"
);
t.is(map1._pages[1].templateContent.trim(), "<ol><li>/test3/</li></ol>");
let map2 = templateMap.getMapEntryForInputPath(
"./test/stubs/paged/cfg-collection-tag-cfg-collection/paged-downstream.njk"
);
t.is(map2._pages[0].templateContent.trim(), "<ol><li>/paged-main/</li></ol>");
t.is(
map2._pages[1].templateContent.trim(),
"<ol><li>/paged-main/1/</li></ol>"
);
});
test("Pagination with a Collection (apply all pages to collections)", async t => {
let tw = new TemplateWriter(
"./test/stubs/paged/collection-apply-to-all",
"./test/stubs/_site",
["njk"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.tag1.length, 3);
t.is(collectionsData.pagingtag.length, 2);
let mapEntry = templateMap.getMapEntryForInputPath(
"./test/stubs/paged/collection-apply-to-all/main.njk"
);
t.truthy(mapEntry);
t.is(
mapEntry.inputPath,
"./test/stubs/paged/collection-apply-to-all/main.njk"
);
let mainTmpl = tw._createTemplate(
"./test/stubs/paged/collection-apply-to-all/main.njk"
);
let outputPath = await mainTmpl.getOutputPath();
t.is(outputPath, "./test/stubs/_site/main/index.html");
t.is(mapEntry.outputPath, "./test/stubs/_site/main/index.html");
let templates = await mapEntry.template.getRenderedTemplates(mapEntry.data);
t.is(templates.length, 2);
t.is(
await templates[0].template.getOutputPath(),
"./test/stubs/_site/main/index.html"
);
t.is(templates[0].outputPath, "./test/stubs/_site/main/index.html");
t.is(
await templates[1].template.getOutputPath(),
"./test/stubs/_site/main/1/index.html"
);
t.is(templates[1].outputPath, "./test/stubs/_site/main/1/index.html");
// test content
t.is(
templates[0].templateContent.trim(),
"<ol><li>/test1/</li><li>/test2/</li></ol>"
);
t.is(templates[1].templateContent.trim(), "<ol><li>/test3/</li></ol>");
});
test("Use a collection inside of a template", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection-template",
"./test/stubs/collection-template/_site",
["ejs"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.dog.length, 1);
let mapEntry = templateMap.getMapEntryForInputPath(
"./test/stubs/collection-template/template.ejs"
);
t.truthy(mapEntry);
t.is(mapEntry.inputPath, "./test/stubs/collection-template/template.ejs");
let mainTmpl = tw._createTemplate(
"./test/stubs/collection-template/template.ejs"
);
let outputPath = await mainTmpl.getOutputPath();
t.is(
outputPath,
"./test/stubs/collection-template/_site/template/index.html"
);
let templates = await mapEntry.template.getRenderedTemplates(mapEntry.data);
// test content
t.is(
normalizeNewLines(templates[0].templateContent.trim()),
`Layout
Template
All 2 templates
Template 1 dog`
);
});
test("Use a collection inside of a layout", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection-layout",
"./test/stubs/collection-layout/_site",
["ejs"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.dog.length, 1);
let mapEntry = templateMap.getMapEntryForInputPath(
"./test/stubs/collection-layout/template.ejs"
);
t.truthy(mapEntry);
t.is(mapEntry.inputPath, "./test/stubs/collection-layout/template.ejs");
let mainTmpl = tw._createTemplate(
"./test/stubs/collection-layout/template.ejs"
);
let outputPath = await mainTmpl.getOutputPath();
t.is(outputPath, "./test/stubs/collection-layout/_site/template/index.html");
let templates = await mapEntry.template.getRenderedTemplates(mapEntry.data);
// test content
t.is(
normalizeNewLines(templates[0].templateContent.trim()),
`Layout
Template
All 2 templates
Layout 1 dog`
);
});
test("Glob Watcher Files with Passthroughs", t => {
let tw = new TemplateWriter("test/stubs", "test/stubs/_site", ["njk", "png"]);
t.deepEqual(tw.getFileManager().getPassthroughPaths(), []);
});
test("Pagination and TemplateContent", async t => {
let tw = new TemplateWriter(
"./test/stubs/pagination-templatecontent",
"./test/stubs/pagination-templatecontent/_site",
["njk", "md"]
);
tw.setVerboseOutput(false);
await tw.write();
let content = fs.readFileSync(
"./test/stubs/pagination-templatecontent/_site/index.html",
"utf-8"
);
t.is(
content.trim(),
`<h1>Post 1</h1>
<h1>Post 2</h1>`
);
rimraf.sync("./test/stubs/pagination-templatecontent/_site/");
});
test("Custom collection returns array", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection2",
"./test/stubs/_site",
["md"]
);
/* Careful here, eleventyConfig is a global */
eleventyConfig.addCollection("returnAllInputPaths", function(collection) {
return collection.getAllSorted().map(function(item) {
return item.inputPath;
});
});
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.returnAllInputPaths.length, 2);
t.is(parsePath(collectionsData.returnAllInputPaths[0]).base, "test1.md");
t.is(parsePath(collectionsData.returnAllInputPaths[1]).base, "test2.md");
});
test("Custom collection returns a string", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection2",
"./test/stubs/_site",
["md"]
);
/* Careful here, eleventyConfig is a global */
eleventyConfig.addCollection("returnATestString", function(collection) {
return "test";
});
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.returnATestString, "test");
});
test("Custom collection returns an object", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection2",
"./test/stubs/_site",
["md"]
);
/* Careful here, eleventyConfig is a global */
eleventyConfig.addCollection("returnATestObject", function() {
return { test: "value" };
});
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.deepEqual(collectionsData.returnATestObject, { test: "value" });
});
test("fileSlug should exist in a collection", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection-slug",
"./test/stubs/collection-slug/_site",
["njk"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.dog.length, 1);
let mapEntry = templateMap.getMapEntryForInputPath(
"./test/stubs/collection-slug/template.njk"
);
t.truthy(mapEntry);
t.is(mapEntry.inputPath, "./test/stubs/collection-slug/template.njk");
let templates = await mapEntry.template.getRenderedTemplates(mapEntry.data);
t.is(templates[0].templateContent.trim(), "fileSlug:/dog1/:dog1");
});
// TODO
test.skip("renderData should exist and be resolved in a collection (Issue #289)", async t => {
let tw = new TemplateWriter(
"./test/stubs/collection-renderdata",
"./test/stubs/collection-renderdata/_site",
["njk"]
);
let paths = await tw._getAllPaths();
let templateMap = await tw._createTemplateMap(paths);
let collectionsData = await templateMap.getCollectionsData();
t.is(collectionsData.dog.length, 1);
let mapEntry = templateMap.getMapEntryForInputPath(
"./test/stubs/collection-renderdata/template.njk"
);
t.truthy(mapEntry);
t.is(mapEntry.inputPath, "./test/stubs/collection-renderdata/template.njk");
let templates = await mapEntry.template.getRenderedTemplates(mapEntry.data);
t.is(templates[0].templateContent.trim(), "Test Title");
});
test("Write Test 11ty.js", async t => {
let tw = new TemplateWriter(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite"
);
let evf = new EleventyFiles(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite",
["11ty.js"]
);
evf.init();
let files = await fastglob(evf.getFileGlobs());
t.deepEqual(evf.getRawFiles(), ["./test/stubs/writeTestJS/**/*.11ty.js"]);
t.deepEqual(files, ["./test/stubs/writeTestJS/test.11ty.js"]);
let tmpl = tw._createTemplate(files[0]);
t.is(
await tmpl.getOutputPath(),
"./test/stubs/_writeTestJSSite/test/index.html"
);
});
test.skip("Markdown with alias", async t => {
let map = new EleventyExtensionMap(["md"]);
map.config = {
templateExtensionAliases: {
markdown: "md"
}
};
let evf = new EleventyFiles(
"./test/stubs/writeTestMarkdown",
"./test/stubs/_writeTestMarkdownSite",
["md"]
);
evf._setExtensionMap(map);
evf.init();
let files = await fastglob(evf.getFileGlobs());
t.deepEqual(evf.getRawFiles(), [
"./test/stubs/writeTestMarkdown/**/*.md",
"./test/stubs/writeTestMarkdown/**/*.markdown"
]);
t.true(files.indexOf("./test/stubs/writeTestMarkdown/sample.md") > -1);
t.true(files.indexOf("./test/stubs/writeTestMarkdown/sample2.markdown") > -1);
let tw = new TemplateWriter(
"./test/stubs/writeTestMarkdown",
"./test/stubs/_writeTestMarkdownSite"
);
tw.setEleventyFiles(evf);
let tmpl = tw._createTemplate(files[0]);
tmpl._setExtensionMap(map);
t.is(
await tmpl.getOutputPath(),
"./test/stubs/_writeTestMarkdownSite/sample/index.html"
);
let tmpl2 = tw._createTemplate(files[1]);
tmpl2._setExtensionMap(map);
t.is(
await tmpl2.getOutputPath(),
"./test/stubs/_writeTestMarkdownSite/sample2/index.html"
);
});
test.skip("JavaScript with alias", async t => {
let map = new EleventyExtensionMap(["11ty.js"]);
map.config = {
templateExtensionAliases: {
js: "11ty.js"
}
};
let evf = new EleventyFiles(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite",
["11ty.js"]
);
evf._setExtensionMap(map);
evf.init();
let files = await fastglob(evf.getFileGlobs());
t.deepEqual(
evf.getRawFiles().sort(),
[
"./test/stubs/writeTestJS/**/*.11ty.js",
"./test/stubs/writeTestJS/**/*.js"
].sort()
);
t.deepEqual(
files.sort(),
[
"./test/stubs/writeTestJS/sample.js",
"./test/stubs/writeTestJS/test.11ty.js"
].sort()
);
let tw = new TemplateWriter(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite"
);
tw.setEleventyFiles(evf);
let tmpl = tw._createTemplate(files[0]);
tmpl._setExtensionMap(map);
t.is(
await tmpl.getOutputPath(),
"./test/stubs/_writeTestJSSite/sample/index.html"
);
let tmpl2 = tw._createTemplate(files[1]);
tmpl2._setExtensionMap(map);
t.is(
await tmpl2.getOutputPath(),
"./test/stubs/_writeTestJSSite/test/index.html"
);
});
test("Passthrough file output", async t => {
let tw = new TemplateWriter(
"./test/stubs/template-passthrough/",
"./test/stubs/template-passthrough/_site",
["njk", "md"]
);
const mgr = tw.getFileManager().getPassthroughManager();
mgr.setConfig({
passthroughFileCopy: true,
passthroughCopies: {
"./test/stubs/template-passthrough/static": true,
"./test/stubs/template-passthrough/static/": "./",
"./test/stubs/template-passthrough/static/**/*": "./all/",
"./test/stubs/template-passthrough/static/**/*.js": "./js/"
}
});
await tw.write();
const output = [
"./test/stubs/template-passthrough/_site/static/nested/test-nested.css",
"./test/stubs/template-passthrough/_site/all/test.js",
"./test/stubs/template-passthrough/_site/all/test.css",
"./test/stubs/template-passthrough/_site/all/test-nested.css",
"./test/stubs/template-passthrough/_site/js/",
"./test/stubs/template-passthrough/_site/js/test.js",
"./test/stubs/template-passthrough/_site/nested/",
"./test/stubs/template-passthrough/_site/nested/test-nested.css",
"./test/stubs/template-passthrough/_site/test.css",
"./test/stubs/template-passthrough/_site/test.js"
];
let results = await Promise.all(
output.map(function(path) {
return fs.exists(path);
})
);
for (let result of results) {
t.true(result);
}
rimraf.sync("./test/stubs/template-passthrough/_site/");
});