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

598 lines
16 KiB
JavaScript
Raw Normal View History

2019-12-02 12:22:45 +00:00
import test from "ava";
import fastglob from "fast-glob";
import EleventyFiles from "../src/EleventyFiles";
import TemplatePath from "../src/TemplatePath";
import EleventyExtensionMap from "../src/EleventyExtensionMap";
import TemplateRender from "../src/TemplateRender";
import TemplatePassthroughManager from "../src/TemplatePassthroughManager";
test("getFiles", async t => {
let evf = new EleventyFiles(
"./test/stubs/writeTest",
"./test/stubs/_writeTestSite",
["ejs", "md"]
);
evf.init();
t.deepEqual(await evf.getFiles(), ["./test/stubs/writeTest/test.md"]);
});
test("getFiles (without 11ty.js)", async t => {
let evf = new EleventyFiles(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite",
["ejs", "md"]
);
evf.init();
t.deepEqual(await evf.getFiles(), []);
});
test("getFiles (with 11ty.js)", async t => {
let evf = new EleventyFiles(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite",
["ejs", "md", "11ty.js"]
);
evf.init();
t.deepEqual(await evf.getFiles(), ["./test/stubs/writeTestJS/test.11ty.js"]);
});
test("getFiles (with js, treated as passthrough copy)", async t => {
let evf = new EleventyFiles(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite",
["ejs", "md", "js"]
);
evf.init();
const files = await evf.getFiles();
t.deepEqual(
files.sort(),
[
"./test/stubs/writeTestJS/sample.js",
"./test/stubs/writeTestJS/test.11ty.js"
].sort()
);
t.false(TemplateRender.hasEngine("./test/stubs/writeTestJS/sample.js"));
t.true(TemplateRender.hasEngine("./test/stubs/writeTestJS/test.11ty.js"));
});
test("getFiles (with case insensitivity)", async t => {
let evf = new EleventyFiles(
"./test/stubs/writeTestJS",
"./test/stubs/_writeTestJSSite",
["JS"]
);
evf.init();
t.deepEqual(
(await evf.getFiles()).sort(),
[
"./test/stubs/writeTestJS/sample.js",
"./test/stubs/writeTestJS/test.11ty.js"
].sort()
);
t.false(TemplateRender.hasEngine("./test/stubs/writeTestJS/sample.js"));
t.true(TemplateRender.hasEngine("./test/stubs/writeTestJS/test.11ty.js"));
});
test("Mutually exclusive Input and Output dirs", async t => {
let evf = new EleventyFiles(
"./test/stubs/writeTest",
"./test/stubs/_writeTestSite",
["ejs", "md"]
);
evf.init();
let files = await fastglob(evf.getFileGlobs());
t.is(evf.getRawFiles().length, 2);
t.true(files.length > 0);
t.is(files[0], "./test/stubs/writeTest/test.md");
});
test("Single File Input (deep path)", async t => {
let evf = new EleventyFiles("./test/stubs/index.html", "./test/stubs/_site", [
"ejs",
"md"
]);
evf.init();
let files = await fastglob(evf.getFileGlobs());
t.is(evf.getRawFiles().length, 1);
t.is(files.length, 1);
t.is(files[0], "./test/stubs/index.html");
});
test("Single File Input (shallow path)", async t => {
let evf = new EleventyFiles("README.md", "./test/stubs/_site", ["md"]);
evf.init();
let globs = evf.getFileGlobs().filter(path => path !== "!./README.md");
let files = await fastglob(globs);
t.is(evf.getRawFiles().length, 1);
t.is(files.length, 1);
t.is(files[0], "./README.md");
});
test("Glob Input", async t => {
let evf = new EleventyFiles(
"./test/stubs/glob-pages/!(contact.md)",
"./test/stubs/_site",
["md"]
);
evf.init();
let globs = evf.getFileGlobs();
let files = await fastglob(globs);
t.is(files.length, 2);
t.is(files[0], "./test/stubs/glob-pages/about.md");
t.is(files[1], "./test/stubs/glob-pages/home.md");
});
test(".eleventyignore parsing", t => {
let ignores = EleventyFiles.getFileIgnores("./test/stubs/.eleventyignore");
t.is(ignores.length, 2);
t.is(ignores[0], "!./test/stubs/ignoredFolder/**");
t.is(ignores[1], "!./test/stubs/ignoredFolder/ignored.md");
});
test("Parse multiple .eleventyignores", t => {
let ignores = EleventyFiles.getFileIgnores([
"./test/stubs/multiple-ignores/.eleventyignore",
"./test/stubs/multiple-ignores/subfolder/.eleventyignore"
]);
t.is(ignores.length, 4);
// Note these folders must exist!
t.is(ignores[0], "!./test/stubs/multiple-ignores/ignoredFolder/**");
t.is(ignores[1], "!./test/stubs/multiple-ignores/ignoredFolder/ignored.md");
t.is(
ignores[2],
"!./test/stubs/multiple-ignores/subfolder/ignoredFolder2/**"
);
t.is(
ignores[3],
"!./test/stubs/multiple-ignores/subfolder/ignoredFolder2/ignored2.md"
);
});
test("defaults if passed file name does not exist", t => {
let ignores = EleventyFiles.getFileIgnores(
".thisfiledoesnotexist",
"node_modules/**"
);
t.truthy(ignores.length);
t.is(ignores[0], "!./node_modules/**");
});
test(".eleventyignore files", async t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", ["ejs", "md"]);
evf.init();
let ignoredFiles = await fastglob("test/stubs/ignoredFolder/*.md");
t.is(ignoredFiles.length, 1);
let files = await fastglob(evf.getFileGlobs());
t.true(files.length > 0);
t.is(
files.filter(file => {
return file.indexOf("./test/stubs/ignoredFolder") > -1;
}).length,
0
);
});
/* .eleventyignore and .gitignore combos */
test("Get ignores (no .eleventyignore no .gitignore)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore1",
"test/stubs/ignore1/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./node_modules/**",
"!./test/stubs/ignorelocalroot/node_modules/**",
"!./test/stubs/ignore1/node_modules/**",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore1/_site/**"
]);
});
test("Get ignores (no .eleventyignore)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore2",
"test/stubs/ignore2/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./test/stubs/ignore2/thisshouldnotexist12345",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore2/_site/**"
]);
});
test("Get ignores (no .eleventyignore, using setUseGitIgnore(false))", t => {
let evf = new EleventyFiles(
"test/stubs/ignore2",
"test/stubs/ignore2/_site",
[]
);
evf.init();
evf._setConfig({
useGitIgnore: false,
dir: {
includes: "_includes"
}
});
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore2/_site/**"
]);
});
test("Get ignores (no .gitignore)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore3",
"test/stubs/ignore3/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./node_modules/**",
"!./test/stubs/ignorelocalroot/node_modules/**",
"!./test/stubs/ignore3/node_modules/**",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore3/ignoredFolder/**",
"!./test/stubs/ignore3/ignoredFolder/ignored.md",
"!./test/stubs/ignore3/_site/**"
]);
});
test("Get ignores (both .eleventyignore and .gitignore)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore4",
"test/stubs/ignore4/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./test/stubs/ignore4/thisshouldnotexist12345",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore4/ignoredFolder/**",
"!./test/stubs/ignore4/ignoredFolder/ignored.md",
"!./test/stubs/ignore4/_site/**"
]);
});
test("Get ignores (both .eleventyignore and .gitignore, using setUseGitIgnore(false))", t => {
let evf = new EleventyFiles(
"test/stubs/ignore4",
"test/stubs/ignore4/_site",
[]
);
evf.init();
evf._setConfig({
useGitIgnore: false,
dir: {
includes: "_includes"
}
});
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore4/ignoredFolder/**",
"!./test/stubs/ignore4/ignoredFolder/ignored.md",
"!./test/stubs/ignore4/_site/**"
]);
});
test("Get ignores (no .eleventyignore .gitignore exists but empty)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore5",
"test/stubs/ignore5/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./node_modules/**",
"!./test/stubs/ignorelocalroot/node_modules/**",
"!./test/stubs/ignore5/node_modules/**",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore5/_site/**"
]);
});
test("Get ignores (both .eleventyignore and .gitignore exists, but .gitignore is empty)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore6",
"test/stubs/ignore6/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./node_modules/**",
"!./test/stubs/ignorelocalroot/node_modules/**",
"!./test/stubs/ignore6/node_modules/**",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore6/ignoredFolder/**",
"!./test/stubs/ignore6/ignoredFolder/ignored.md",
"!./test/stubs/ignore6/_site/**"
]);
});
test("Get ignores (no .eleventyignore .gitignore exists but has spaces inside)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore7",
"test/stubs/ignore7/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./node_modules/**",
"!./test/stubs/ignorelocalroot/node_modules/**",
"!./test/stubs/ignore7/node_modules/**",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore7/_site/**"
]);
});
test("Get ignores (both .eleventyignore and .gitignore exists, but .gitignore has spaces inside)", t => {
let evf = new EleventyFiles(
"test/stubs/ignore8",
"test/stubs/ignore8/_site",
[]
);
evf.init();
evf._setLocalPathRoot("./test/stubs/ignorelocalroot");
t.deepEqual(evf.getIgnores(), [
"!./node_modules/**",
"!./test/stubs/ignorelocalroot/node_modules/**",
"!./test/stubs/ignore8/node_modules/**",
"!./test/stubs/ignorelocalroot/test.md",
"!./test/stubs/ignore8/ignoredFolder/**",
"!./test/stubs/ignore8/ignoredFolder/ignored.md",
"!./test/stubs/ignore8/_site/**"
]);
});
/* End .eleventyignore and .gitignore combos */
test("getDataDir", t => {
let evf = new EleventyFiles(".", "_site", []);
evf.init();
t.is(evf.getDataDir(), "_data");
});
test("getDataDir subdir", t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", []);
evf.init();
t.is(evf.getDataDir(), "test/stubs/_data");
});
test("Include and Data Dirs", t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", []);
evf.init();
t.deepEqual(evf.getIncludesAndDataDirs(), [
"./test/stubs/_includes/**",
"./test/stubs/_data/**"
]);
});
test("Ignore Include and Data Dirs", t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", []);
evf.init();
t.deepEqual(evf.getTemplateIgnores(), [
"!./test/stubs/_includes/**",
"!./test/stubs/_data/**"
]);
});
test("Input to 'src' and empty includes dir (issue #403)", t => {
let evf = new EleventyFiles("src", "src/_site", ["md", "liquid", "html"]);
evf._setConfig({
useGitIgnore: false,
eleventyignoreOverride: "!./src/_includes/**",
dir: {
input: ".",
output: "_site",
includes: "",
data: "_data"
}
});
evf.init();
t.deepEqual(evf.getFileGlobs(), [
"./src/**/*.md",
"./src/**/*.liquid",
"./src/**/*.html",
"!./src/_includes/**",
"!./src/_site/**",
"!./src/_data/**"
]);
});
test("Bad expected output, this indicates a bug upstream in a dependency. Input to 'src' and empty includes dir (issue #403, full paths in eleventyignore)", async t => {
let evf = new EleventyFiles("test/stubs-403", "test/stubs-403/_site", [
"liquid"
]);
evf._setConfig({
useGitIgnore: false,
eleventyignoreOverride:
"!" + TemplatePath.absolutePath("test/stubs-403/_includes") + "/**",
dir: {
input: "test/stubs-403",
output: "_site",
includes: "",
data: false
}
});
evf.init();
t.deepEqual(await evf.getFiles(), [
"./test/stubs-403/template.liquid",
// This is bad, because it uses an absolutePath above. it should be excluded
"./test/stubs-403/_includes/include.liquid"
]);
});
test("Workaround for Bad expected output, this indicates a bug upstream in a dependency. Input to 'src' and empty includes dir (issue #403, full paths in eleventyignore)", async t => {
let evf = new EleventyFiles("test/stubs-403", "test/stubs-403/_site", [
"liquid"
]);
evf._setConfig({
useGitIgnore: false,
eleventyignoreOverride: "!./test/stubs-403/_includes/**",
dir: {
input: "test/stubs-403",
output: "_site",
includes: "",
data: false
}
});
evf.init();
t.deepEqual(await evf.getFiles(), ["./test/stubs-403/template.liquid"]);
});
test("Issue #403: all .eleventyignores should be relative paths not absolute paths", async t => {
let evf = new EleventyFiles("test/stubs-403", "test/stubs-403/_site", [
"liquid"
]);
evf._setConfig({
useGitIgnore: false,
dir: {
input: "test/stubs-403",
output: "_site",
includes: "",
data: false
}
});
evf.init();
let globs = await evf.getFileGlobs();
t.is(
globs.filter(glob => {
return glob.indexOf(TemplatePath.absolutePath()) > -1;
}).length,
0
);
});
test("Glob Watcher Files", async t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", ["njk"]);
evf.init();
t.deepEqual(evf.getGlobWatcherFiles(), [
"./test/stubs/**/*.njk",
"./test/stubs/_includes/**",
"./test/stubs/_data/**"
]);
});
test("Glob Watcher Files with File Extension Passthroughs", async t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", ["njk", "png"]);
evf.init();
t.deepEqual(evf.getGlobWatcherFiles(), [
"./test/stubs/**/*.njk",
"./test/stubs/**/*.png",
"./test/stubs/_includes/**",
"./test/stubs/_data/**"
]);
});
test("Glob Watcher Files with Config Passthroughs (one template format)", async t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", ["njk"]);
evf.init();
let mgr = new TemplatePassthroughManager();
mgr.setInputDir("test/stubs");
mgr.setOutputDir("test/stubs/_site");
mgr.setConfig({
passthroughFileCopy: true,
passthroughCopies: {
"test/stubs/img/": true
}
});
evf.setPassthroughManager(mgr);
t.deepEqual(evf.getGlobWatcherFiles(), [
"./test/stubs/**/*.njk",
"./test/stubs/_includes/**",
"./test/stubs/_data/**",
"./test/stubs/img/**"
]);
});
test("Glob Watcher Files with Config Passthroughs (no template formats)", async t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", []);
evf.init();
t.deepEqual(await evf.getGlobWatcherTemplateDataFiles(), [
"./test/stubs/**/*.json",
"./test/stubs/**/*.11tydata.js"
]);
});
test("Glob Watcher Files with passthroughAll", async t => {
let evf = new EleventyFiles("test/stubs", "test/stubs/_site", [], true);
evf.init();
t.is((await evf.getFileGlobs())[0], "./test/stubs/**");
});
test("File extension aliasing", 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();
const files = await evf.getFiles();
t.deepEqual(
files.sort(),
[
"./test/stubs/writeTestMarkdown/sample.md",
"./test/stubs/writeTestMarkdown/sample2.markdown"
].sort()
);
});