Repository: 11ty/eleventy
Pull request #3680 (2025-03-08 12:52:14)

Replace glob packages with lighter alternatives – `fast-glob` + `is-glob` -> `tinyglobby`, `micromatch` -> `picomatch`
Related to the lately ongoing e18e efforts (https://github.com/e18e/ecosystem-issues/issues/164). `package-lock` doesn't change much, but the heavier dependencies become dev-only.


Patch:
diff --git a/package-lock.json b/package-lock.json
index a1eaacb2..115b5f90 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,26 +24,25 @@
 				"debug": "^4.4.0",
 				"dependency-graph": "^1.0.0",
 				"entities": "^6.0.0",
-				"fast-glob": "^3.3.3",
 				"filesize": "^10.1.6",
 				"gray-matter": "^4.0.3",
-				"is-glob": "^4.0.3",
 				"iso-639-1": "^3.1.5",
 				"js-yaml": "^4.1.0",
 				"kleur": "^4.1.5",
 				"liquidjs": "^10.21.0",
 				"luxon": "^3.6.1",
 				"markdown-it": "^14.1.0",
-				"micromatch": "^4.0.8",
 				"minimist": "^1.2.8",
 				"moo": "^0.5.2",
 				"node-retrieve-globals": "^6.0.0",
 				"nunjucks": "^3.2.4",
+				"picomatch": "^4.0.2",
 				"please-upgrade-node": "^3.2.0",
 				"posthtml": "^0.16.6",
 				"posthtml-match-helper": "^2.0.3",
 				"semver": "^7.7.1",
-				"slugify": "^1.6.6"
+				"slugify": "^1.6.6",
+				"tinyglobby": "^0.2.12"
 			},
 			"bin": {
 				"eleventy": "cmd.cjs"
@@ -1592,6 +1591,7 @@
 			"version": "2.1.5",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 			"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@nodelib/fs.stat": "2.0.5",
@@ -1605,6 +1605,7 @@
 			"version": "2.0.5",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
 			"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">= 8"
@@ -1614,6 +1615,7 @@
 			"version": "1.2.8",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
 			"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@nodelib/fs.scandir": "2.1.5",
@@ -4167,6 +4169,7 @@
 			"version": "3.3.3",
 			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
 			"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@nodelib/fs.stat": "^2.0.2",
@@ -4197,11 +4200,25 @@
 			"version": "1.18.0",
 			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
 			"integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+			"dev": true,
 			"license": "ISC",
 			"dependencies": {
 				"reusify": "^1.0.4"
 			}
 		},
+		"node_modules/fdir": {
+			"version": "6.4.3",
+			"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
+			"integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+			"peerDependencies": {
+				"picomatch": "^3 || ^4"
+			},
+			"peerDependenciesMeta": {
+				"picomatch": {
+					"optional": true
+				}
+			}
+		},
 		"node_modules/figures": {
 			"version": "6.1.0",
 			"resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
@@ -5772,6 +5789,7 @@
 			"version": "1.4.1",
 			"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 			"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">= 8"
@@ -6407,6 +6425,7 @@
 			"version": "4.0.8",
 			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 			"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"braces": "^3.0.3",
@@ -6420,6 +6439,7 @@
 			"version": "2.3.1",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 			"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">=8.6"
@@ -7082,8 +7102,6 @@
 			"version": "4.0.2",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
 			"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-			"dev": true,
-			"license": "MIT",
 			"engines": {
 				"node": ">=12"
 			},
@@ -7318,6 +7336,7 @@
 			"version": "1.2.3",
 			"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
 			"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+			"dev": true,
 			"funding": [
 				{
 					"type": "github",
@@ -7571,6 +7590,7 @@
 			"version": "1.0.4",
 			"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
 			"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"iojs": ">=1.0.0",
@@ -7694,6 +7714,7 @@
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 			"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+			"dev": true,
 			"funding": [
 				{
 					"type": "github",
@@ -8373,6 +8394,21 @@
 				"node": ">=4"
 			}
 		},
+		"node_modules/tinyglobby": {
+			"version": "0.2.12",
+			"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
+			"integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+			"dependencies": {
+				"fdir": "^6.4.3",
+				"picomatch": "^4.0.2"
+			},
+			"engines": {
+				"node": ">=12.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/SuperchupuDev"
+			}
+		},
 		"node_modules/to-regex-range": {
 			"version": "5.0.1",
 			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
diff --git a/package.json b/package.json
index 5e80a63b..4761c6a9 100644
--- a/package.json
+++ b/package.json
@@ -137,26 +137,25 @@
 		"debug": "^4.4.0",
 		"dependency-graph": "^1.0.0",
 		"entities": "^6.0.0",
-		"fast-glob": "^3.3.3",
 		"filesize": "^10.1.6",
 		"gray-matter": "^4.0.3",
-		"is-glob": "^4.0.3",
 		"iso-639-1": "^3.1.5",
 		"js-yaml": "^4.1.0",
 		"kleur": "^4.1.5",
 		"liquidjs": "^10.21.0",
 		"luxon": "^3.6.1",
 		"markdown-it": "^14.1.0",
-		"micromatch": "^4.0.8",
 		"minimist": "^1.2.8",
 		"moo": "^0.5.2",
 		"node-retrieve-globals": "^6.0.0",
 		"nunjucks": "^3.2.4",
+		"picomatch": "^4.0.2",
 		"please-upgrade-node": "^3.2.0",
 		"posthtml": "^0.16.6",
 		"posthtml-match-helper": "^2.0.3",
 		"semver": "^7.7.1",
-		"slugify": "^1.6.6"
+		"slugify": "^1.6.6",
+		"tinyglobby": "^0.2.12"
 	},
 	"overrides": {
 		"gray-matter": {
diff --git a/src/FileSystemSearch.js b/src/FileSystemSearch.js
index 1918658b..0dfa129d 100644
--- a/src/FileSystemSearch.js
+++ b/src/FileSystemSearch.js
@@ -1,10 +1,10 @@
-import fastglob from "fast-glob";
+import { glob } from "tinyglobby";
 import { TemplatePath } from "@11ty/eleventy-utils";
 import debugUtil from "debug";
 
 import { isGlobMatch } from "./Util/GlobMatcher.js";
 
-const debug = debugUtil("Eleventy:FastGlobManager");
+const debug = debugUtil("Eleventy:FileSystemSearch");
 
 class FileSystemSearch {
 	constructor() {
@@ -52,7 +52,7 @@ class FileSystemSearch {
 
 			this.count++;
 
-			this.promises[cacheKey] = fastglob(
+			this.promises[cacheKey] = glob(
 				globs,
 				Object.assign(
 					{
diff --git a/src/TemplatePassthrough.js b/src/TemplatePassthrough.js
index c327547c..32c85d40 100644
--- a/src/TemplatePassthrough.js
+++ b/src/TemplatePassthrough.js
@@ -1,6 +1,6 @@
 import path from "node:path";
 
-import isGlob from "is-glob";
+import { isDynamicPattern } from "tinyglobby";
 import { filesize } from "filesize";
 import copy from "@11ty/recursive-copy";
 import { TemplatePath } from "@11ty/eleventy-utils";
@@ -48,7 +48,7 @@ class TemplatePassthrough {
 		// inputPath is relative to the root of your project and not your Eleventy input directory.
 		// TODO normalize these with forward slashes
 		this.inputPath = this.normalizeIfDirectory(path.inputPath);
-		this.#isInputPathGlob = isGlob(this.inputPath);
+		this.#isInputPathGlob = isDynamicPattern(this.inputPath);
 
 		this.outputPath = path.outputPath;
 		this.copyOptions = path.copyOptions; // custom options for recursive-copy
@@ -219,7 +219,7 @@ class TemplatePassthrough {
 		}
 
 		// TODO VirtualFileSystem candidate
-		if (!isGlob(this.inputPath) && this.isExists(this.inputPath)) {
+		if (!isDynamicPattern(this.inputPath) && this.isExists(this.inputPath)) {
 			return [
 				{
 					inputPath: this.inputPath,
diff --git a/src/TemplatePassthroughManager.js b/src/TemplatePassthroughManager.js
index e48b8dfa..a58a9610 100644
--- a/src/TemplatePassthroughManager.js
+++ b/src/TemplatePassthroughManager.js
@@ -1,4 +1,4 @@
-import isGlob from "is-glob";
+import { isDynamicPattern } from "tinyglobby";
 import { TemplatePath } from "@11ty/eleventy-utils";
 import debugUtil from "debug";
 
@@ -244,7 +244,11 @@ class TemplatePassthroughManager {
 			if (TemplatePath.startsWithSubPath(changedFile, path.inputPath)) {
 				return path;
 			}
-			if (changedFile && isGlob(path.inputPath) && isGlobMatch(changedFile, [path.inputPath])) {
+			if (
+				changedFile &&
+				isDynamicPattern(path.inputPath) &&
+				isGlobMatch(changedFile, [path.inputPath])
+			) {
 				return path;
 			}
 		}
diff --git a/src/Util/GlobMatcher.js b/src/Util/GlobMatcher.js
index b5c54e90..a4a6c550 100644
--- a/src/Util/GlobMatcher.js
+++ b/src/Util/GlobMatcher.js
@@ -1,4 +1,4 @@
-import micromatch from "micromatch";
+import picomatch from "picomatch";
 import { TemplatePath } from "@11ty/eleventy-utils";
 
 function isGlobMatch(filepath, globs = [], options = undefined) {
@@ -16,7 +16,7 @@ function isGlobMatch(filepath, globs = [], options = undefined) {
 	);
 
 	// globs: string or array of strings
-	return micromatch.isMatch(inputPath, globs, opts);
+	return picomatch.isMatch(inputPath, globs, opts);
 }
 
 export { isGlobMatch };
diff --git a/src/Util/ProjectDirectories.js b/src/Util/ProjectDirectories.js
index 0550498e..7dcd9baa 100644
--- a/src/Util/ProjectDirectories.js
+++ b/src/Util/ProjectDirectories.js
@@ -1,7 +1,7 @@
 import fs from "node:fs";
 import path from "node:path";
 import { TemplatePath } from "@11ty/eleventy-utils";
-import isGlob from "is-glob";
+import { isDynamicPattern } from "tinyglobby";
 
 /* Directories internally should always use *nix forward slashes */
 class ProjectDirectories {
@@ -143,9 +143,9 @@ class ProjectDirectories {
 			if (inputExists) {
 				this.inputFile = ProjectDirectories.normalizePath(dirOrFile);
 			} else {
-				if (!isGlob(dirOrFile)) {
+				if (!isDynamicPattern(dirOrFile)) {
 					throw new Error(
-						`The "${dirOrFile}" \`input\` parameter (directory or file path) must exist on the file system (unless detected as a glob by the \`is-glob\` package)`,
+						`The "${dirOrFile}" \`input\` parameter (directory or file path) must exist on the file system (unless detected as a glob by the \`tinyglobby\` package)`,
 					);
 				}
 


Test patch:
diff --git a/test/EleventyFilesGitIgnoreEleventyIgnoreTest.js b/test/EleventyFilesGitIgnoreEleventyIgnoreTest.js
index 0e8a53b9..ea8e5d02 100644
--- a/test/EleventyFilesGitIgnoreEleventyIgnoreTest.js
+++ b/test/EleventyFilesGitIgnoreEleventyIgnoreTest.js
@@ -204,7 +204,7 @@ test("Bad expected output, this indicates a bug upstream in a dependency (update
   });
 
   let { eleventyFiles: evf } = getEleventyFilesInstance(["liquid"], eleventyConfig);
-  evf._setEleventyIgnoreContent("!" + TemplatePath.absolutePath("test/stubs-403/_includes") + "/**");
+  evf._setEleventyIgnoreContent(TemplatePath.absolutePath("test/stubs-403/_includes") + "/**");
   evf.init(); // duplicate init
 
   t.deepEqual(await evf.getFiles(), [
@@ -226,7 +226,7 @@ test("Workaround for Bad expected output, this indicates a bug upstream in a dep
   });
 
   let { eleventyFiles: evf } = getEleventyFilesInstance(["liquid"], eleventyConfig);
-  evf._setEleventyIgnoreContent("!./test/stubs-403/_includes/**");
+  evf._setEleventyIgnoreContent("./test/stubs-403/_includes/**");
   evf.init(); // duplicate init
 
   t.deepEqual(await evf.getFiles(), ["./test/stubs-403/template.liquid"]);
diff --git a/test/EleventyFilesTest.js b/test/EleventyFilesTest.js
index 67c9086f..4b377bd6 100644
--- a/test/EleventyFilesTest.js
+++ b/test/EleventyFilesTest.js
@@ -1,5 +1,5 @@
 import test from "ava";
-import fastglob from "fast-glob";
+import { glob } from "tinyglobby";
 
 import EleventyFiles from "../src/EleventyFiles.js";
 import TemplateConfig from "../src/TemplateConfig.js";
@@ -132,10 +132,10 @@ test("Mutually exclusive Input and Output dirs", async (t) => {
 
   let { eleventyFiles: evf } = getEleventyFilesInstance(["liquid", "md"], eleventyConfig);
 
-  let files = await fastglob(evf.getFileGlobs());
+  let files = await glob(evf.getFileGlobs());
   t.deepEqual(evf.getRawFiles(), ["./test/stubs/writeTest/**/*.{liquid,md}"]);
   t.true(files.length > 0);
-  t.is(files[0], "./test/stubs/writeTest/test.md");
+  t.is(files[0], "test/stubs/writeTest/test.md");
 });
 
 test("Single File Input (deep path)", async (t) => {
@@ -147,10 +147,10 @@ test("Single File Input (deep path)", async (t) => {
 
   let { eleventyFiles: evf } = getEleventyFilesInstance(["liquid", "md"], eleventyConfig);
 
-  let files = await fastglob(evf.getFileGlobs());
+  let files = await glob(evf.getFileGlobs());
   t.is(evf.getRawFiles().length, 1);
   t.is(files.length, 1);
-  t.is(files[0], "./test/stubs/index.html");
+  t.is(files[0], "test/stubs/index.html");
 });
 
 test("Single File Input (shallow path)", async (t) => {
@@ -163,12 +163,12 @@ test("Single File Input (shallow path)", async (t) => {
   let { eleventyFiles: evf } = getEleventyFilesInstance(["md"], eleventyConfig);
 
   let globs = evf.getFileGlobs(); //.filter((path) => path !== "./README.md");
-  let files = await fastglob(globs, {
+  let files = await glob(globs, {
     ignore: evf.getIgnoreGlobs(),
   });
   t.is(evf.getRawFiles().length, 1);
   t.is(files.length, 1);
-  t.is(files[0], "./README.md");
+  t.is(files[0], "README.md");
 });
 
 test("Glob Input", async (t) => {
@@ -180,11 +180,11 @@ test("Glob Input", async (t) => {
   let { eleventyFiles: evf } = getEleventyFilesInstance(["md"], eleventyConfig);
 
   let globs = evf.getFileGlobs();
-  let files = await fastglob(globs);
+  let files = await glob(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");
+  t.is(files[0], "test/stubs/glob-pages/about.md");
+  t.is(files[1], "test/stubs/glob-pages/home.md");
 });
 
 test(".eleventyignore parsing", (t) => {
@@ -220,10 +220,10 @@ test(".eleventyignore files", async (t) => {
   });
   let { eleventyFiles: evf } = getEleventyFilesInstance(["liquid", "md"], eleventyConfig);
 
-  let ignoredFiles = await fastglob("test/stubs/ignoredFolder/*.md");
+  let ignoredFiles = await glob("test/stubs/ignoredFolder/*.md");
   t.is(ignoredFiles.length, 1);
 
-  let files = await fastglob(evf.getFileGlobs(), {
+  let files = await glob(evf.getFileGlobs(), {
     ignore: evf.getIgnoreGlobs(),
   });
 
diff --git a/test/TemplateCollectionTest.js b/test/TemplateCollectionTest.js
index 8558794d..55983104 100644
--- a/test/TemplateCollectionTest.js
+++ b/test/TemplateCollectionTest.js
@@ -257,7 +257,8 @@ test("partial match on tag string, issue 95", async (t) => {
   t.is(posts.length, 1);
 });
 
-// Swapped to micromatch in 3.0.0-alpha.17
+// Swapped to `micromatch` in 3.0.0-alpha.17, and later to `picomatch`.
+// The test can stay as a sanity check.
 test("micromatch assumptions, issue #127", async (t) => {
   function isMatch(filepath, globs) {
     return isGlobMatch(filepath, globs);
diff --git a/test/TemplateDataTest.js b/test/TemplateDataTest.js
index b34f1e80..f91bf650 100644
--- a/test/TemplateDataTest.js
+++ b/test/TemplateDataTest.js
@@ -90,7 +90,7 @@ test("Data dir does not exist", async (t) => {
     dataObj.setProjectUsingEsm(true);
     await dataObj.getGlobalData();
   }, {
-    message: "The \"test/thisdirectorydoesnotexist\" `input` parameter (directory or file path) must exist on the file system (unless detected as a glob by the `is-glob` package)"
+    message: "The \"test/thisdirectorydoesnotexist\" `input` parameter (directory or file path) must exist on the file system (unless detected as a glob by the `tinyglobby` package)"
   });
 });
 
diff --git a/test/TemplateGlobTest.js b/test/TemplateGlobTest.js
index fbc2b48f..54fb6ce3 100644
--- a/test/TemplateGlobTest.js
+++ b/test/TemplateGlobTest.js
@@ -1,5 +1,5 @@
 import test from "ava";
-import fastglob from "fast-glob";
+import { glob } from 'tinyglobby';
 import { TemplatePath } from "@11ty/eleventy-utils";
 
 import TemplateGlob from "../src/TemplateGlob.js";
@@ -70,7 +70,7 @@ test("Normalize array argument", (t) => {
 });
 
 test("matuzo project issue with fastglob assumptions", async (t) => {
-  let dotslashincludes = await fastglob(
+  let dotslashincludes = await glob(
     TemplateGlob.map([
       "./test/stubs/globby/**/*.html",
       "!./test/stubs/globby/_includes/**/*",
@@ -85,7 +85,7 @@ test("matuzo project issue with fastglob assumptions", async (t) => {
     0
   );
 
-  let globincludes = await fastglob(
+  let globincludes = await glob(
     TemplateGlob.map([
       "test/stubs/globby/**/*.html",
       "!./test/stubs/globby/_includes/**/*",
@@ -100,25 +100,26 @@ test("matuzo project issue with fastglob assumptions", async (t) => {
   );
 });
 
+// `fast-glob` isn't used any more, but the test can stay as a sanity check.
 test("fastglob assumptions", async (t) => {
-  let glob = await fastglob("test/stubs/ignoredFolder/**");
-  t.is(glob.length, 1);
+  let globbed = await glob("test/stubs/ignoredFolder/**");
+  t.is(globbed.length, 1);
 
-  let glob2 = await fastglob("test/stubs/ignoredFolder/**/*");
-  t.is(glob2.length, 1);
+  let globbed2 = await glob("test/stubs/ignoredFolder/**/*");
+  t.is(globbed2.length, 1);
 
-  let glob3 = await fastglob([
+  let globbed3 = await glob([
     "./test/stubs/ignoredFolder/**/*.md",
     "!./test/stubs/ignoredFolder/**",
   ]);
-  t.is(glob3.length, 0);
+  t.is(globbed3.length, 0);
 
-  let glob4 = await fastglob(["./test/stubs/ignoredFolder/*.md", "!./test/stubs/ignoredFolder/**"]);
-  t.is(glob4.length, 0);
+  let globbed4 = await glob(["./test/stubs/ignoredFolder/*.md", "!./test/stubs/ignoredFolder/**"]);
+  t.is(globbed4.length, 0);
 
-  let glob5 = await fastglob([
+  let globbed5 = await glob([
     "./test/stubs/ignoredFolder/ignored.md",
     "!./test/stubs/ignoredFolder/**",
   ]);
-  t.is(glob5.length, 0);
+  t.is(globbed5.length, 0);
 });
diff --git a/test/TemplateWriterTest.js b/test/TemplateWriterTest.js
index 0dd0f2d6..e2cf21d4 100644
--- a/test/TemplateWriterTest.js
+++ b/test/TemplateWriterTest.js
@@ -1,7 +1,7 @@
 import test from "ava";
 import fs from "fs";
 import { rimrafSync } from "rimraf";
-import fastglob from "fast-glob";
+import { glob } from "tinyglobby";
 import path from "path";
 
 import EleventyExtensionMap from "../src/EleventyExtensionMap.js";
@@ -22,7 +22,7 @@ test("Output is a subdir of input", async (t) => {
 
   let { templateWriter: tw, eleventyFiles: evf } = getTemplateWriterInstance(["liquid", "md"], eleventyConfig);
 
-  let files = await fastglob(evf.getFileGlobs());
+  let files = await glob(evf.getFileGlobs());
   t.deepEqual(evf.getRawFiles(), ["./test/stubs/writeTest/**/*.{liquid,md}"]);
   t.true(files.length > 0);
 
@@ -512,9 +512,9 @@ test("Write Test 11ty.js", async (t) => {
 
   let { templateWriter: tw, eleventyFiles: evf } = getTemplateWriterInstance(["11ty.js"], eleventyConfig);
 
-  let files = await fastglob(evf.getFileGlobs());
+  let files = await glob(evf.getFileGlobs());
   t.deepEqual(evf.getRawFiles(), ["./test/stubs/writeTestJS/**/*.{11ty.js,11ty.cjs,11ty.mjs}"]);
-  t.deepEqual(files, ["./test/stubs/writeTestJS/test.11ty.cjs"]);
+  t.deepEqual(files, ["test/stubs/writeTestJS/test.11ty.cjs"]);
 
   let { template: tmpl } = tw._createTemplate(files[0]);
   let data = await tmpl.getData();
@@ -541,7 +541,7 @@ test.skip("Markdown with alias", async (t) => {
   evf._setExtensionMap(map);
   evf.init();
 
-  let files = await fastglob(evf.getFileGlobs());
+  let files = await glob(evf.getFileGlobs());
   t.deepEqual(evf.getRawFiles(), [
     "./test/stubs/writeTestMarkdown/**/*.md",
     "./test/stubs/writeTestMarkdown/**/*.markdown",
@@ -579,7 +579,7 @@ test.skip("JavaScript with alias", async (t) => {
   evf._setExtensionMap(map);
   evf.init();
 
-  let files = await fastglob(evf.getFileGlobs());
+  let files = await glob(evf.getFileGlobs());
   t.deepEqual(
     evf.getRawFiles().sort(),
     ["./test/stubs/writeTestJS/**/*.11ty.js", "./test/stubs/writeTestJS/**/*.js"].sort(),