diff --git a/.yarnrc.yml b/.yarnrc.yml
new file mode 100644
index 0000000..3186f3f
--- /dev/null
+++ b/.yarnrc.yml
@@ -0,0 +1 @@
+nodeLinker: node-modules
diff --git a/_site/README/index.html b/_site/README/index.html
deleted file mode 100644
index 613890d..0000000
--- a/_site/README/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
Heading
diff --git a/_site/index.html b/_site/index.html
deleted file mode 100644
index 921c931..0000000
--- a/_site/index.html
+++ /dev/null
@@ -1,2 +0,0 @@
-abs3nt.dev
-hello i am abs3nt
diff --git a/eleventy.config.js b/eleventy.config.js
new file mode 100644
index 0000000..1a9fe37
--- /dev/null
+++ b/eleventy.config.js
@@ -0,0 +1,8 @@
+module.exports = function (eleventyConfig) {
+ return {
+ dir: {
+ input: "src",
+ output: "dist",
+ },
+ };
+};
diff --git a/index.html b/index.html
deleted file mode 100644
index 921c931..0000000
--- a/index.html
+++ /dev/null
@@ -1,2 +0,0 @@
-abs3nt.dev
-hello i am abs3nt
diff --git a/node_modules/.bin/acorn b/node_modules/.bin/acorn
new file mode 120000
index 0000000..cf76760
--- /dev/null
+++ b/node_modules/.bin/acorn
@@ -0,0 +1 @@
+../acorn/bin/acorn
\ No newline at end of file
diff --git a/node_modules/.bin/cssesc b/node_modules/.bin/cssesc
new file mode 120000
index 0000000..487b689
--- /dev/null
+++ b/node_modules/.bin/cssesc
@@ -0,0 +1 @@
+../cssesc/bin/cssesc
\ No newline at end of file
diff --git a/node_modules/.bin/dev-ip b/node_modules/.bin/dev-ip
new file mode 120000
index 0000000..138e5ac
--- /dev/null
+++ b/node_modules/.bin/dev-ip
@@ -0,0 +1 @@
+../dev-ip/lib/dev-ip.js
\ No newline at end of file
diff --git a/node_modules/.bin/ejs b/node_modules/.bin/ejs
new file mode 120000
index 0000000..88e80d0
--- /dev/null
+++ b/node_modules/.bin/ejs
@@ -0,0 +1 @@
+../ejs/bin/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/eleventy b/node_modules/.bin/eleventy
new file mode 120000
index 0000000..489851a
--- /dev/null
+++ b/node_modules/.bin/eleventy
@@ -0,0 +1 @@
+../@11ty/eleventy/cmd.js
\ No newline at end of file
diff --git a/node_modules/.bin/eleventy-dev-server b/node_modules/.bin/eleventy-dev-server
new file mode 120000
index 0000000..31a8419
--- /dev/null
+++ b/node_modules/.bin/eleventy-dev-server
@@ -0,0 +1 @@
+../@11ty/eleventy-dev-server/cmd.js
\ No newline at end of file
diff --git a/node_modules/.bin/errno b/node_modules/.bin/errno
new file mode 120000
index 0000000..5a98e53
--- /dev/null
+++ b/node_modules/.bin/errno
@@ -0,0 +1 @@
+../errno/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/esparse b/node_modules/.bin/esparse
new file mode 120000
index 0000000..7423b18
--- /dev/null
+++ b/node_modules/.bin/esparse
@@ -0,0 +1 @@
+../esprima/bin/esparse.js
\ No newline at end of file
diff --git a/node_modules/.bin/esvalidate b/node_modules/.bin/esvalidate
new file mode 120000
index 0000000..16069ef
--- /dev/null
+++ b/node_modules/.bin/esvalidate
@@ -0,0 +1 @@
+../esprima/bin/esvalidate.js
\ No newline at end of file
diff --git a/node_modules/.bin/handlebars b/node_modules/.bin/handlebars
new file mode 120000
index 0000000..fb7d090
--- /dev/null
+++ b/node_modules/.bin/handlebars
@@ -0,0 +1 @@
+../handlebars/bin/handlebars
\ No newline at end of file
diff --git a/node_modules/.bin/jake b/node_modules/.bin/jake
new file mode 120000
index 0000000..3626745
--- /dev/null
+++ b/node_modules/.bin/jake
@@ -0,0 +1 @@
+../jake/bin/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/jiti b/node_modules/.bin/jiti
new file mode 120000
index 0000000..031ee3f
--- /dev/null
+++ b/node_modules/.bin/jiti
@@ -0,0 +1 @@
+../jiti/bin/jiti.js
\ No newline at end of file
diff --git a/node_modules/.bin/js-yaml b/node_modules/.bin/js-yaml
new file mode 120000
index 0000000..9dbd010
--- /dev/null
+++ b/node_modules/.bin/js-yaml
@@ -0,0 +1 @@
+../js-yaml/bin/js-yaml.js
\ No newline at end of file
diff --git a/node_modules/.bin/liquid b/node_modules/.bin/liquid
new file mode 120000
index 0000000..b06ee5f
--- /dev/null
+++ b/node_modules/.bin/liquid
@@ -0,0 +1 @@
+../liquidjs/bin/liquid.js
\ No newline at end of file
diff --git a/node_modules/.bin/liquidjs b/node_modules/.bin/liquidjs
new file mode 120000
index 0000000..b06ee5f
--- /dev/null
+++ b/node_modules/.bin/liquidjs
@@ -0,0 +1 @@
+../liquidjs/bin/liquid.js
\ No newline at end of file
diff --git a/node_modules/.bin/markdown-it b/node_modules/.bin/markdown-it
new file mode 120000
index 0000000..894bcdb
--- /dev/null
+++ b/node_modules/.bin/markdown-it
@@ -0,0 +1 @@
+../markdown-it/bin/markdown-it.js
\ No newline at end of file
diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime
new file mode 120000
index 0000000..fbb7ee0
--- /dev/null
+++ b/node_modules/.bin/mime
@@ -0,0 +1 @@
+../mime/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp
new file mode 120000
index 0000000..017896c
--- /dev/null
+++ b/node_modules/.bin/mkdirp
@@ -0,0 +1 @@
+../mkdirp/bin/cmd.js
\ No newline at end of file
diff --git a/node_modules/.bin/mustache b/node_modules/.bin/mustache
new file mode 120000
index 0000000..f8b7197
--- /dev/null
+++ b/node_modules/.bin/mustache
@@ -0,0 +1 @@
+../mustache/bin/mustache
\ No newline at end of file
diff --git a/node_modules/.bin/nanoid b/node_modules/.bin/nanoid
new file mode 120000
index 0000000..e2be547
--- /dev/null
+++ b/node_modules/.bin/nanoid
@@ -0,0 +1 @@
+../nanoid/bin/nanoid.cjs
\ No newline at end of file
diff --git a/node_modules/.bin/node-which b/node_modules/.bin/node-which
new file mode 120000
index 0000000..6f8415e
--- /dev/null
+++ b/node_modules/.bin/node-which
@@ -0,0 +1 @@
+../which/bin/node-which
\ No newline at end of file
diff --git a/node_modules/.bin/nunjucks-precompile b/node_modules/.bin/nunjucks-precompile
new file mode 120000
index 0000000..3465a52
--- /dev/null
+++ b/node_modules/.bin/nunjucks-precompile
@@ -0,0 +1 @@
+../nunjucks/bin/precompile
\ No newline at end of file
diff --git a/node_modules/.bin/parser b/node_modules/.bin/parser
new file mode 120000
index 0000000..ce7bf97
--- /dev/null
+++ b/node_modules/.bin/parser
@@ -0,0 +1 @@
+../@babel/parser/bin/babel-parser.js
\ No newline at end of file
diff --git a/node_modules/.bin/resolve b/node_modules/.bin/resolve
new file mode 120000
index 0000000..b6afda6
--- /dev/null
+++ b/node_modules/.bin/resolve
@@ -0,0 +1 @@
+../resolve/bin/resolve
\ No newline at end of file
diff --git a/node_modules/.bin/rimraf b/node_modules/.bin/rimraf
new file mode 120000
index 0000000..4cd49a4
--- /dev/null
+++ b/node_modules/.bin/rimraf
@@ -0,0 +1 @@
+../rimraf/bin.js
\ No newline at end of file
diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver
new file mode 120000
index 0000000..5aaadf4
--- /dev/null
+++ b/node_modules/.bin/semver
@@ -0,0 +1 @@
+../semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/.bin/sucrase b/node_modules/.bin/sucrase
new file mode 120000
index 0000000..0ac7e77
--- /dev/null
+++ b/node_modules/.bin/sucrase
@@ -0,0 +1 @@
+../sucrase/bin/sucrase
\ No newline at end of file
diff --git a/node_modules/.bin/sucrase-node b/node_modules/.bin/sucrase-node
new file mode 120000
index 0000000..8b96fae
--- /dev/null
+++ b/node_modules/.bin/sucrase-node
@@ -0,0 +1 @@
+../sucrase/bin/sucrase-node
\ No newline at end of file
diff --git a/node_modules/.bin/tailwind b/node_modules/.bin/tailwind
new file mode 120000
index 0000000..d497797
--- /dev/null
+++ b/node_modules/.bin/tailwind
@@ -0,0 +1 @@
+../tailwindcss/lib/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/tailwindcss b/node_modules/.bin/tailwindcss
new file mode 120000
index 0000000..d497797
--- /dev/null
+++ b/node_modules/.bin/tailwindcss
@@ -0,0 +1 @@
+../tailwindcss/lib/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/uglifyjs b/node_modules/.bin/uglifyjs
new file mode 120000
index 0000000..fef3468
--- /dev/null
+++ b/node_modules/.bin/uglifyjs
@@ -0,0 +1 @@
+../uglify-js/bin/uglifyjs
\ No newline at end of file
diff --git a/node_modules/.bin/yaml b/node_modules/.bin/yaml
new file mode 120000
index 0000000..0368324
--- /dev/null
+++ b/node_modules/.bin/yaml
@@ -0,0 +1 @@
+../yaml/bin.mjs
\ No newline at end of file
diff --git a/node_modules/.yarn-state.yml b/node_modules/.yarn-state.yml
new file mode 100644
index 0000000..1a2395c
--- /dev/null
+++ b/node_modules/.yarn-state.yml
@@ -0,0 +1,1169 @@
+# Warning: This file is automatically generated. Removing it is fine, but will
+# cause your node_modules installation to become invalidated.
+
+__metadata:
+ version: 1
+ nmMode: classic
+
+"@11ty/dependency-tree@npm:2.0.1":
+ locations:
+ - "node_modules/@11ty/dependency-tree"
+
+"@11ty/eleventy-dev-server@npm:1.0.4":
+ locations:
+ - "node_modules/@11ty/eleventy-dev-server"
+
+"@11ty/eleventy-utils@npm:1.0.3":
+ locations:
+ - "node_modules/@11ty/eleventy-utils"
+
+"@11ty/eleventy@npm:2.0.1":
+ locations:
+ - "node_modules/@11ty/eleventy"
+
+"@11ty/lodash-custom@npm:4.17.21":
+ locations:
+ - "node_modules/@11ty/lodash-custom"
+
+"@alloc/quick-lru@npm:5.2.0":
+ locations:
+ - "node_modules/@alloc/quick-lru"
+
+"@babel/helper-string-parser@npm:7.24.7":
+ locations:
+ - "node_modules/@babel/helper-string-parser"
+
+"@babel/helper-validator-identifier@npm:7.24.7":
+ locations:
+ - "node_modules/@babel/helper-validator-identifier"
+
+"@babel/parser@npm:7.24.7":
+ locations:
+ - "node_modules/@babel/parser"
+
+"@babel/types@npm:7.24.7":
+ locations:
+ - "node_modules/@babel/types"
+
+"@catppuccin/tailwindcss@virtual:22af014af304e4b12efa087d38ea14f51e7695e22ebf6420c62e665b6a54225a8eb6e5baf350ad2187bdb0669a01fe404a929437a0073c6bb8fe4c3706a2c55b#npm:0.1.6":
+ locations:
+ - "node_modules/@catppuccin/tailwindcss"
+
+"@iarna/toml@npm:2.2.5":
+ locations:
+ - "node_modules/@iarna/toml"
+
+"@isaacs/cliui@npm:8.0.2":
+ locations:
+ - "node_modules/@isaacs/cliui"
+
+"@jridgewell/gen-mapping@npm:0.3.5":
+ locations:
+ - "node_modules/@jridgewell/gen-mapping"
+
+"@jridgewell/resolve-uri@npm:3.1.2":
+ locations:
+ - "node_modules/@jridgewell/resolve-uri"
+
+"@jridgewell/set-array@npm:1.2.1":
+ locations:
+ - "node_modules/@jridgewell/set-array"
+
+"@jridgewell/sourcemap-codec@npm:1.4.15":
+ locations:
+ - "node_modules/@jridgewell/sourcemap-codec"
+
+"@jridgewell/trace-mapping@npm:0.3.25":
+ locations:
+ - "node_modules/@jridgewell/trace-mapping"
+
+"@nodelib/fs.scandir@npm:2.1.5":
+ locations:
+ - "node_modules/@nodelib/fs.scandir"
+
+"@nodelib/fs.stat@npm:2.0.5":
+ locations:
+ - "node_modules/@nodelib/fs.stat"
+
+"@nodelib/fs.walk@npm:1.2.8":
+ locations:
+ - "node_modules/@nodelib/fs.walk"
+
+"@pkgjs/parseargs@npm:0.11.0":
+ locations:
+ - "node_modules/@pkgjs/parseargs"
+
+"@sindresorhus/slugify@npm:1.1.2":
+ locations:
+ - "node_modules/@sindresorhus/slugify"
+
+"@sindresorhus/transliterate@npm:0.1.2":
+ locations:
+ - "node_modules/@sindresorhus/transliterate"
+
+"@types/minimatch@npm:3.0.5":
+ locations:
+ - "node_modules/@types/minimatch"
+
+"@types/node@npm:20.14.10":
+ locations:
+ - "node_modules/@types/node"
+
+"a-sync-waterfall@npm:1.0.1":
+ locations:
+ - "node_modules/a-sync-waterfall"
+
+"acorn@npm:7.4.1":
+ locations:
+ - "node_modules/acorn"
+
+"ansi-regex@npm:5.0.1":
+ locations:
+ - "node_modules/ansi-regex"
+
+"ansi-regex@npm:6.0.1":
+ locations:
+ - "node_modules/strip-ansi/node_modules/ansi-regex"
+
+"ansi-styles@npm:4.3.0":
+ locations:
+ - "node_modules/ansi-styles"
+
+"ansi-styles@npm:6.2.1":
+ locations:
+ - "node_modules/wrap-ansi/node_modules/ansi-styles"
+
+"any-promise@npm:0.1.0":
+ locations:
+ - "node_modules/promise-each/node_modules/any-promise"
+
+"any-promise@npm:1.3.0":
+ locations:
+ - "node_modules/any-promise"
+
+"anymatch@npm:3.1.3":
+ locations:
+ - "node_modules/anymatch"
+
+"arg@npm:5.0.2":
+ locations:
+ - "node_modules/arg"
+
+"argparse@npm:1.0.10":
+ locations:
+ - "node_modules/argparse"
+
+"argparse@npm:2.0.1":
+ locations:
+ - "node_modules/markdown-it/node_modules/argparse"
+
+"array-differ@npm:1.0.0":
+ locations:
+ - "node_modules/maximatch/node_modules/array-differ"
+
+"array-differ@npm:3.0.0":
+ locations:
+ - "node_modules/array-differ"
+
+"array-union@npm:1.0.2":
+ locations:
+ - "node_modules/maximatch/node_modules/array-union"
+
+"array-union@npm:2.1.0":
+ locations:
+ - "node_modules/array-union"
+
+"array-uniq@npm:1.0.3":
+ locations:
+ - "node_modules/array-uniq"
+
+"arrify@npm:1.0.1":
+ locations:
+ - "node_modules/maximatch/node_modules/arrify"
+
+"arrify@npm:2.0.1":
+ locations:
+ - "node_modules/arrify"
+
+"asap@npm:2.0.6":
+ locations:
+ - "node_modules/asap"
+
+"assert-never@npm:1.3.0":
+ locations:
+ - "node_modules/assert-never"
+
+"async@npm:3.2.5":
+ locations:
+ - "node_modules/async"
+
+"babel-walk@npm:3.0.0-canary-5":
+ locations:
+ - "node_modules/babel-walk"
+
+"balanced-match@npm:1.0.2":
+ locations:
+ - "node_modules/balanced-match"
+
+"bcp-47-match@npm:1.0.3":
+ locations:
+ - "node_modules/bcp-47-match"
+
+"bcp-47-normalize@npm:1.1.1":
+ locations:
+ - "node_modules/bcp-47-normalize"
+
+"bcp-47@npm:1.0.8":
+ locations:
+ - "node_modules/bcp-47"
+
+"binary-extensions@npm:2.3.0":
+ locations:
+ - "node_modules/binary-extensions"
+
+"brace-expansion@npm:1.1.11":
+ locations:
+ - "node_modules/minimatch/node_modules/brace-expansion"
+
+"brace-expansion@npm:2.0.1":
+ locations:
+ - "node_modules/brace-expansion"
+
+"braces@npm:3.0.3":
+ locations:
+ - "node_modules/braces"
+
+"call-bind@npm:1.0.7":
+ locations:
+ - "node_modules/call-bind"
+
+"camelcase-css@npm:2.0.1":
+ locations:
+ - "node_modules/camelcase-css"
+
+"chalk@npm:4.1.2":
+ locations:
+ - "node_modules/chalk"
+
+"character-parser@npm:2.2.0":
+ locations:
+ - "node_modules/character-parser"
+
+"chokidar@npm:3.6.0":
+ locations:
+ - "node_modules/chokidar"
+
+"color-convert@npm:2.0.1":
+ locations:
+ - "node_modules/color-convert"
+
+"color-name@npm:1.1.4":
+ locations:
+ - "node_modules/color-name"
+
+"commander@npm:10.0.1":
+ locations:
+ - "node_modules/commander"
+
+"commander@npm:4.1.1":
+ locations:
+ - "node_modules/sucrase/node_modules/commander"
+
+"commander@npm:5.1.0":
+ locations:
+ - "node_modules/nunjucks/node_modules/commander"
+
+"concat-map@npm:0.0.1":
+ locations:
+ - "node_modules/concat-map"
+
+"constantinople@npm:4.0.1":
+ locations:
+ - "node_modules/constantinople"
+
+"cross-spawn@npm:7.0.3":
+ locations:
+ - "node_modules/cross-spawn"
+
+"cssesc@npm:3.0.0":
+ locations:
+ - "node_modules/cssesc"
+
+"debug@virtual:593d0014635aef7193149d484690d0265953f676955a1d3c5790630ae1dd35272b10aefbcf1736f8c2b196d3b37ffd0a972b97a0c7719d481592abaf319fe014#npm:2.6.9":
+ locations:
+ - "node_modules/finalhandler/node_modules/debug"
+
+"debug@virtual:c9e1a4b59e37cb479517edede3bf2093b28c0ca1a9d0e517f3c345075bd1e468980b94b4957e389116607ee7155441dfd7d09e19a4229d5d09bcf06244401590#npm:4.3.5":
+ locations:
+ - "node_modules/debug"
+
+"define-data-property@npm:1.1.4":
+ locations:
+ - "node_modules/define-data-property"
+
+"dependency-graph@npm:0.11.0":
+ locations:
+ - "node_modules/dependency-graph"
+
+"dev-ip@npm:1.0.1":
+ locations:
+ - "node_modules/dev-ip"
+
+"devsite@workspace:.":
+ locations:
+ - ""
+ bin:
+ "node_modules/sucrase":
+ "glob": "glob/dist/esm/bin.mjs"
+ ".":
+ "eleventy": "@11ty/eleventy/cmd.js"
+ "eleventy-dev-server": "@11ty/eleventy-dev-server/cmd.js"
+ "tailwind": "tailwindcss/lib/cli.js"
+ "tailwindcss": "tailwindcss/lib/cli.js"
+ "ejs": "ejs/bin/cli.js"
+ "handlebars": "handlebars/bin/handlebars"
+ "liquidjs": "liquidjs/bin/liquid.js"
+ "liquid": "liquidjs/bin/liquid.js"
+ "markdown-it": "markdown-it/bin/markdown-it.js"
+ "mustache": "mustache/bin/mustache"
+ "semver": "semver/bin/semver.js"
+ "nunjucks-precompile": "nunjucks/bin/precompile"
+ "jiti": "jiti/bin/jiti.js"
+ "resolve": "resolve/bin/resolve"
+ "sucrase": "sucrase/bin/sucrase"
+ "sucrase-node": "sucrase/bin/sucrase-node"
+ "dev-ip": "dev-ip/lib/dev-ip.js"
+ "mime": "mime/cli.js"
+ "node-which": "which/bin/node-which"
+ "jake": "jake/bin/cli.js"
+ "js-yaml": "js-yaml/bin/js-yaml.js"
+ "uglifyjs": "uglify-js/bin/uglifyjs"
+ "errno": "errno/cli.js"
+ "mkdirp": "mkdirp/bin/cmd.js"
+ "rimraf": "rimraf/bin.js"
+ "cssesc": "cssesc/bin/cssesc"
+ "nanoid": "nanoid/bin/nanoid.cjs"
+ "yaml": "yaml/bin.mjs"
+ "esparse": "esprima/bin/esparse.js"
+ "esvalidate": "esprima/bin/esvalidate.js"
+ "parser": "@babel/parser/bin/babel-parser.js"
+ "acorn": "acorn/bin/acorn"
+
+"didyoumean@npm:1.2.2":
+ locations:
+ - "node_modules/didyoumean"
+
+"dlv@npm:1.1.3":
+ locations:
+ - "node_modules/dlv"
+
+"doctypes@npm:1.1.0":
+ locations:
+ - "node_modules/doctypes"
+
+"dom-serializer@npm:1.4.1":
+ locations:
+ - "node_modules/dom-serializer"
+
+"domelementtype@npm:2.3.0":
+ locations:
+ - "node_modules/domelementtype"
+
+"domhandler@npm:4.3.1":
+ locations:
+ - "node_modules/domhandler"
+
+"domutils@npm:2.8.0":
+ locations:
+ - "node_modules/domutils"
+
+"eastasianwidth@npm:0.2.0":
+ locations:
+ - "node_modules/eastasianwidth"
+
+"ee-first@npm:1.1.1":
+ locations:
+ - "node_modules/ee-first"
+
+"ejs@npm:3.1.10":
+ locations:
+ - "node_modules/ejs"
+
+"emoji-regex@npm:8.0.0":
+ locations:
+ - "node_modules/emoji-regex"
+
+"emoji-regex@npm:9.2.2":
+ locations:
+ - "node_modules/string-width/node_modules/emoji-regex"
+
+"encodeurl@npm:1.0.2":
+ locations:
+ - "node_modules/encodeurl"
+
+"entities@npm:2.2.0":
+ locations:
+ - "node_modules/dom-serializer/node_modules/entities"
+
+"entities@npm:3.0.1":
+ locations:
+ - "node_modules/entities"
+
+"errno@npm:0.1.8":
+ locations:
+ - "node_modules/errno"
+
+"es-define-property@npm:1.0.0":
+ locations:
+ - "node_modules/es-define-property"
+
+"es-errors@npm:1.3.0":
+ locations:
+ - "node_modules/es-errors"
+
+"escape-html@npm:1.0.3":
+ locations:
+ - "node_modules/escape-html"
+
+"escape-string-regexp@npm:2.0.0":
+ locations:
+ - "node_modules/escape-string-regexp"
+
+"escape-string-regexp@npm:4.0.0":
+ locations:
+ - "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp"
+
+"esprima@npm:4.0.1":
+ locations:
+ - "node_modules/esprima"
+
+"extend-shallow@npm:2.0.1":
+ locations:
+ - "node_modules/extend-shallow"
+
+"fast-glob@npm:3.3.2":
+ locations:
+ - "node_modules/fast-glob"
+
+"fastq@npm:1.17.1":
+ locations:
+ - "node_modules/fastq"
+
+"filelist@npm:1.0.4":
+ locations:
+ - "node_modules/filelist"
+
+"fill-range@npm:7.1.1":
+ locations:
+ - "node_modules/fill-range"
+
+"finalhandler@npm:1.2.0":
+ locations:
+ - "node_modules/finalhandler"
+
+"foreground-child@npm:3.2.1":
+ locations:
+ - "node_modules/foreground-child"
+
+"fs.realpath@npm:1.0.0":
+ locations:
+ - "node_modules/fs.realpath"
+
+"function-bind@npm:1.1.2":
+ locations:
+ - "node_modules/function-bind"
+
+"get-intrinsic@npm:1.2.4":
+ locations:
+ - "node_modules/get-intrinsic"
+
+"glob-parent@npm:5.1.2":
+ locations:
+ - "node_modules/glob-parent"
+
+"glob-parent@npm:6.0.2":
+ locations:
+ - "node_modules/tailwindcss/node_modules/glob-parent"
+
+"glob@npm:10.4.3":
+ locations:
+ - "node_modules/sucrase/node_modules/glob"
+
+"glob@npm:7.2.3":
+ locations:
+ - "node_modules/glob"
+
+"gopd@npm:1.0.1":
+ locations:
+ - "node_modules/gopd"
+
+"graceful-fs@npm:4.2.11":
+ locations:
+ - "node_modules/graceful-fs"
+
+"gray-matter@npm:4.0.3":
+ locations:
+ - "node_modules/gray-matter"
+
+"hamljs@npm:0.6.2":
+ locations:
+ - "node_modules/hamljs"
+
+"handlebars@npm:4.7.8":
+ locations:
+ - "node_modules/handlebars"
+
+"has-flag@npm:4.0.0":
+ locations:
+ - "node_modules/has-flag"
+
+"has-property-descriptors@npm:1.0.2":
+ locations:
+ - "node_modules/has-property-descriptors"
+
+"has-proto@npm:1.0.3":
+ locations:
+ - "node_modules/has-proto"
+
+"has-symbols@npm:1.0.3":
+ locations:
+ - "node_modules/has-symbols"
+
+"has-tostringtag@npm:1.0.2":
+ locations:
+ - "node_modules/has-tostringtag"
+
+"hasown@npm:2.0.2":
+ locations:
+ - "node_modules/hasown"
+
+"htmlparser2@npm:7.2.0":
+ locations:
+ - "node_modules/htmlparser2"
+
+"http-equiv-refresh@npm:1.0.0":
+ locations:
+ - "node_modules/http-equiv-refresh"
+
+"inflight@npm:1.0.6":
+ locations:
+ - "node_modules/inflight"
+
+"inherits@npm:2.0.4":
+ locations:
+ - "node_modules/inherits"
+
+"is-alphabetical@npm:1.0.4":
+ locations:
+ - "node_modules/is-alphabetical"
+
+"is-alphanumerical@npm:1.0.4":
+ locations:
+ - "node_modules/is-alphanumerical"
+
+"is-binary-path@npm:2.1.0":
+ locations:
+ - "node_modules/is-binary-path"
+
+"is-core-module@npm:2.14.0":
+ locations:
+ - "node_modules/is-core-module"
+
+"is-decimal@npm:1.0.4":
+ locations:
+ - "node_modules/is-decimal"
+
+"is-expression@npm:4.0.0":
+ locations:
+ - "node_modules/is-expression"
+
+"is-extendable@npm:0.1.1":
+ locations:
+ - "node_modules/is-extendable"
+
+"is-extglob@npm:2.1.1":
+ locations:
+ - "node_modules/is-extglob"
+
+"is-fullwidth-code-point@npm:3.0.0":
+ locations:
+ - "node_modules/is-fullwidth-code-point"
+
+"is-glob@npm:4.0.3":
+ locations:
+ - "node_modules/is-glob"
+
+"is-json@npm:2.0.1":
+ locations:
+ - "node_modules/is-json"
+
+"is-number@npm:7.0.0":
+ locations:
+ - "node_modules/is-number"
+
+"is-promise@npm:2.2.2":
+ locations:
+ - "node_modules/is-promise"
+
+"is-regex@npm:1.1.4":
+ locations:
+ - "node_modules/is-regex"
+
+"isexe@npm:2.0.0":
+ locations:
+ - "node_modules/isexe"
+
+"iso-639-1@npm:2.1.15":
+ locations:
+ - "node_modules/iso-639-1"
+
+"jackspeak@npm:3.4.1":
+ locations:
+ - "node_modules/jackspeak"
+
+"jake@npm:10.9.1":
+ locations:
+ - "node_modules/jake"
+
+"jiti@npm:1.21.6":
+ locations:
+ - "node_modules/jiti"
+
+"js-stringify@npm:1.0.2":
+ locations:
+ - "node_modules/js-stringify"
+
+"js-yaml@npm:3.14.1":
+ locations:
+ - "node_modules/js-yaml"
+
+"jstransformer@npm:1.0.0":
+ locations:
+ - "node_modules/jstransformer"
+
+"junk@npm:1.0.3":
+ locations:
+ - "node_modules/junk"
+
+"kind-of@npm:6.0.3":
+ locations:
+ - "node_modules/kind-of"
+
+"kleur@npm:4.1.5":
+ locations:
+ - "node_modules/kleur"
+
+"lilconfig@npm:2.1.0":
+ locations:
+ - "node_modules/lilconfig"
+
+"lilconfig@npm:3.1.2":
+ locations:
+ - "node_modules/postcss-load-config/node_modules/lilconfig"
+
+"lines-and-columns@npm:1.2.4":
+ locations:
+ - "node_modules/lines-and-columns"
+
+"linkify-it@npm:4.0.1":
+ locations:
+ - "node_modules/linkify-it"
+
+"liquidjs@npm:10.14.0":
+ locations:
+ - "node_modules/liquidjs"
+
+"list-to-array@npm:1.1.0":
+ locations:
+ - "node_modules/list-to-array"
+
+"lodash.deburr@npm:4.1.0":
+ locations:
+ - "node_modules/lodash.deburr"
+
+"lru-cache@npm:10.3.1":
+ locations:
+ - "node_modules/lru-cache"
+
+"luxon@npm:3.4.4":
+ locations:
+ - "node_modules/luxon"
+
+"markdown-it@npm:13.0.2":
+ locations:
+ - "node_modules/markdown-it"
+
+"maximatch@npm:0.1.0":
+ locations:
+ - "node_modules/maximatch"
+
+"mdurl@npm:1.0.1":
+ locations:
+ - "node_modules/mdurl"
+
+"merge2@npm:1.4.1":
+ locations:
+ - "node_modules/merge2"
+
+"micromatch@npm:4.0.7":
+ locations:
+ - "node_modules/micromatch"
+
+"mime@npm:3.0.0":
+ locations:
+ - "node_modules/mime"
+
+"minimatch@npm:3.1.2":
+ locations:
+ - "node_modules/minimatch"
+
+"minimatch@npm:5.1.6":
+ locations:
+ - "node_modules/filelist/node_modules/minimatch"
+
+"minimatch@npm:9.0.5":
+ locations:
+ - "node_modules/sucrase/node_modules/minimatch"
+
+"minimist@npm:1.2.8":
+ locations:
+ - "node_modules/minimist"
+
+"minipass@npm:3.3.6":
+ locations:
+ - "node_modules/ssri/node_modules/minipass"
+
+"minipass@npm:7.1.2":
+ locations:
+ - "node_modules/minipass"
+
+"mkdirp@npm:0.5.6":
+ locations:
+ - "node_modules/mkdirp"
+
+"moo@npm:0.5.2":
+ locations:
+ - "node_modules/moo"
+
+"morphdom@npm:2.7.3":
+ locations:
+ - "node_modules/morphdom"
+
+"ms@npm:2.0.0":
+ locations:
+ - "node_modules/ms"
+
+"ms@npm:2.1.2":
+ locations:
+ - "node_modules/debug/node_modules/ms"
+
+"multimatch@npm:5.0.0":
+ locations:
+ - "node_modules/multimatch"
+
+"mustache@npm:4.2.0":
+ locations:
+ - "node_modules/mustache"
+
+"mz@npm:2.7.0":
+ locations:
+ - "node_modules/mz"
+
+"nanoid@npm:3.3.7":
+ locations:
+ - "node_modules/nanoid"
+
+"neo-async@npm:2.6.2":
+ locations:
+ - "node_modules/neo-async"
+
+"normalize-path@npm:3.0.0":
+ locations:
+ - "node_modules/normalize-path"
+
+"nunjucks@virtual:38575667a0f0a7b5bac10ee52446370590206cb4d6c1b4fa87e1c8adbb936a22b8da7a49588d2a80d87db6e39d28a8013503deddc1eebdb780f19a2c81d349f2#npm:3.2.4":
+ locations:
+ - "node_modules/nunjucks"
+
+"object-assign@npm:4.1.1":
+ locations:
+ - "node_modules/object-assign"
+
+"object-hash@npm:3.0.0":
+ locations:
+ - "node_modules/object-hash"
+
+"on-finished@npm:2.4.1":
+ locations:
+ - "node_modules/on-finished"
+
+"once@npm:1.4.0":
+ locations:
+ - "node_modules/once"
+
+"package-json-from-dist@npm:1.0.0":
+ locations:
+ - "node_modules/package-json-from-dist"
+
+"parse-srcset@npm:1.0.2":
+ locations:
+ - "node_modules/parse-srcset"
+
+"parseurl@npm:1.3.3":
+ locations:
+ - "node_modules/parseurl"
+
+"path-is-absolute@npm:1.0.1":
+ locations:
+ - "node_modules/path-is-absolute"
+
+"path-key@npm:3.1.1":
+ locations:
+ - "node_modules/path-key"
+
+"path-parse@npm:1.0.7":
+ locations:
+ - "node_modules/path-parse"
+
+"path-scurry@npm:1.11.1":
+ locations:
+ - "node_modules/path-scurry"
+
+"path-to-regexp@npm:6.2.2":
+ locations:
+ - "node_modules/path-to-regexp"
+
+"picocolors@npm:1.0.1":
+ locations:
+ - "node_modules/picocolors"
+
+"picomatch@npm:2.3.1":
+ locations:
+ - "node_modules/picomatch"
+
+"pify@npm:2.3.0":
+ locations:
+ - "node_modules/pify"
+
+"pirates@npm:4.0.6":
+ locations:
+ - "node_modules/pirates"
+
+"please-upgrade-node@npm:3.2.0":
+ locations:
+ - "node_modules/please-upgrade-node"
+
+"postcss-import@virtual:18aba64742bc7799e5186578113f42e99b152f5068e2bf8163a16c70382d8aaa7d8e3400d1e3aea692635655480c295717f5c451e94f1023c573a584b3a9ffeb#npm:15.1.0":
+ locations:
+ - "node_modules/postcss-import"
+
+"postcss-js@virtual:18aba64742bc7799e5186578113f42e99b152f5068e2bf8163a16c70382d8aaa7d8e3400d1e3aea692635655480c295717f5c451e94f1023c573a584b3a9ffeb#npm:4.0.1":
+ locations:
+ - "node_modules/postcss-js"
+
+"postcss-load-config@virtual:18aba64742bc7799e5186578113f42e99b152f5068e2bf8163a16c70382d8aaa7d8e3400d1e3aea692635655480c295717f5c451e94f1023c573a584b3a9ffeb#npm:4.0.2":
+ locations:
+ - "node_modules/postcss-load-config"
+
+"postcss-nested@virtual:18aba64742bc7799e5186578113f42e99b152f5068e2bf8163a16c70382d8aaa7d8e3400d1e3aea692635655480c295717f5c451e94f1023c573a584b3a9ffeb#npm:6.0.1":
+ locations:
+ - "node_modules/postcss-nested"
+
+"postcss-selector-parser@npm:6.1.0":
+ locations:
+ - "node_modules/postcss-selector-parser"
+
+"postcss-value-parser@npm:4.2.0":
+ locations:
+ - "node_modules/postcss-value-parser"
+
+"postcss@npm:8.4.39":
+ locations:
+ - "node_modules/postcss"
+
+"posthtml-parser@npm:0.11.0":
+ locations:
+ - "node_modules/posthtml-parser"
+
+"posthtml-render@npm:3.0.0":
+ locations:
+ - "node_modules/posthtml-render"
+
+"posthtml-urls@npm:1.0.0":
+ locations:
+ - "node_modules/posthtml-urls"
+
+"posthtml@npm:0.16.6":
+ locations:
+ - "node_modules/posthtml"
+
+"promise-each@npm:2.2.0":
+ locations:
+ - "node_modules/promise-each"
+
+"promise@npm:7.3.1":
+ locations:
+ - "node_modules/promise"
+
+"prr@npm:1.0.1":
+ locations:
+ - "node_modules/prr"
+
+"pug-attrs@npm:3.0.0":
+ locations:
+ - "node_modules/pug-attrs"
+
+"pug-code-gen@npm:3.0.3":
+ locations:
+ - "node_modules/pug-code-gen"
+
+"pug-error@npm:2.1.0":
+ locations:
+ - "node_modules/pug-error"
+
+"pug-filters@npm:4.0.0":
+ locations:
+ - "node_modules/pug-filters"
+
+"pug-lexer@npm:5.0.1":
+ locations:
+ - "node_modules/pug-lexer"
+
+"pug-linker@npm:4.0.0":
+ locations:
+ - "node_modules/pug-linker"
+
+"pug-load@npm:3.0.0":
+ locations:
+ - "node_modules/pug-load"
+
+"pug-parser@npm:6.0.0":
+ locations:
+ - "node_modules/pug-parser"
+
+"pug-runtime@npm:3.0.1":
+ locations:
+ - "node_modules/pug-runtime"
+
+"pug-strip-comments@npm:2.0.0":
+ locations:
+ - "node_modules/pug-strip-comments"
+
+"pug-walk@npm:2.0.0":
+ locations:
+ - "node_modules/pug-walk"
+
+"pug@npm:3.0.3":
+ locations:
+ - "node_modules/pug"
+
+"queue-microtask@npm:1.2.3":
+ locations:
+ - "node_modules/queue-microtask"
+
+"read-cache@npm:1.0.0":
+ locations:
+ - "node_modules/read-cache"
+
+"readdirp@npm:3.6.0":
+ locations:
+ - "node_modules/readdirp"
+
+"recursive-copy@npm:2.0.14":
+ locations:
+ - "node_modules/recursive-copy"
+
+"resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d":
+ locations:
+ - "node_modules/resolve"
+
+"reusify@npm:1.0.4":
+ locations:
+ - "node_modules/reusify"
+
+"rimraf@npm:2.7.1":
+ locations:
+ - "node_modules/rimraf"
+
+"run-parallel@npm:1.2.0":
+ locations:
+ - "node_modules/run-parallel"
+
+"section-matter@npm:1.0.0":
+ locations:
+ - "node_modules/section-matter"
+
+"semver-compare@npm:1.0.0":
+ locations:
+ - "node_modules/semver-compare"
+
+"semver@npm:7.6.2":
+ locations:
+ - "node_modules/semver"
+
+"set-function-length@npm:1.2.2":
+ locations:
+ - "node_modules/set-function-length"
+
+"shebang-command@npm:2.0.0":
+ locations:
+ - "node_modules/shebang-command"
+
+"shebang-regex@npm:3.0.0":
+ locations:
+ - "node_modules/shebang-regex"
+
+"signal-exit@npm:4.1.0":
+ locations:
+ - "node_modules/signal-exit"
+
+"slash@npm:1.0.0":
+ locations:
+ - "node_modules/slash"
+
+"slugify@npm:1.6.6":
+ locations:
+ - "node_modules/slugify"
+
+"source-map-js@npm:1.2.0":
+ locations:
+ - "node_modules/source-map-js"
+
+"source-map@npm:0.6.1":
+ locations:
+ - "node_modules/source-map"
+
+"sprintf-js@npm:1.0.3":
+ locations:
+ - "node_modules/sprintf-js"
+
+"ssri@npm:8.0.1":
+ locations:
+ - "node_modules/ssri"
+
+"statuses@npm:2.0.1":
+ locations:
+ - "node_modules/statuses"
+
+"string-width@npm:4.2.3":
+ locations:
+ - "node_modules/wrap-ansi-cjs/node_modules/string-width"
+ - "node_modules/string-width-cjs"
+
+"string-width@npm:5.1.2":
+ locations:
+ - "node_modules/string-width"
+
+"strip-ansi@npm:6.0.1":
+ locations:
+ - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi"
+ - "node_modules/strip-ansi-cjs"
+ - "node_modules/string-width-cjs/node_modules/strip-ansi"
+
+"strip-ansi@npm:7.1.0":
+ locations:
+ - "node_modules/strip-ansi"
+
+"strip-bom-string@npm:1.0.0":
+ locations:
+ - "node_modules/strip-bom-string"
+
+"sucrase@npm:3.35.0":
+ locations:
+ - "node_modules/sucrase"
+
+"supports-color@npm:7.2.0":
+ locations:
+ - "node_modules/supports-color"
+
+"supports-preserve-symlinks-flag@npm:1.0.0":
+ locations:
+ - "node_modules/supports-preserve-symlinks-flag"
+
+"tailwindcss@npm:3.4.4":
+ locations:
+ - "node_modules/tailwindcss"
+
+"thenify-all@npm:1.6.0":
+ locations:
+ - "node_modules/thenify-all"
+
+"thenify@npm:3.3.1":
+ locations:
+ - "node_modules/thenify"
+
+"to-fast-properties@npm:2.0.0":
+ locations:
+ - "node_modules/to-fast-properties"
+
+"to-regex-range@npm:5.0.1":
+ locations:
+ - "node_modules/to-regex-range"
+
+"token-stream@npm:1.0.0":
+ locations:
+ - "node_modules/token-stream"
+
+"ts-interface-checker@npm:0.1.13":
+ locations:
+ - "node_modules/ts-interface-checker"
+
+"uc.micro@npm:1.0.6":
+ locations:
+ - "node_modules/uc.micro"
+
+"uglify-js@npm:3.18.0":
+ locations:
+ - "node_modules/uglify-js"
+
+"undici-types@npm:5.26.5":
+ locations:
+ - "node_modules/undici-types"
+
+"unpipe@npm:1.0.0":
+ locations:
+ - "node_modules/unpipe"
+
+"util-deprecate@npm:1.0.2":
+ locations:
+ - "node_modules/util-deprecate"
+
+"void-elements@npm:3.1.0":
+ locations:
+ - "node_modules/void-elements"
+
+"which@npm:2.0.2":
+ locations:
+ - "node_modules/which"
+
+"with@npm:7.0.2":
+ locations:
+ - "node_modules/with"
+
+"wordwrap@npm:1.0.0":
+ locations:
+ - "node_modules/wordwrap"
+
+"wrap-ansi@npm:7.0.0":
+ locations:
+ - "node_modules/wrap-ansi-cjs"
+
+"wrap-ansi@npm:8.1.0":
+ locations:
+ - "node_modules/wrap-ansi"
+
+"wrappy@npm:1.0.2":
+ locations:
+ - "node_modules/wrappy"
+
+"ws@virtual:35c7c2892d725266679f5535537b72095436bf58e40269ea2fd4e737cab6bba169c84ecd38a403932f3953289b9f6422aeac326691808b360ff3b62cd51b85f1#npm:8.18.0":
+ locations:
+ - "node_modules/ws"
+
+"yallist@npm:4.0.0":
+ locations:
+ - "node_modules/yallist"
+
+"yaml@npm:2.4.5":
+ locations:
+ - "node_modules/yaml"
diff --git a/node_modules/@11ty/dependency-tree/LICENSE b/node_modules/@11ty/dependency-tree/LICENSE
new file mode 100644
index 0000000..629c31b
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Eleventy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/@11ty/dependency-tree/README.md b/node_modules/@11ty/dependency-tree/README.md
new file mode 100644
index 0000000..b7fa19c
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/README.md
@@ -0,0 +1,92 @@
+# dependency-tree
+
+Returns an unordered array of local paths to dependencies of a node JavaScript file (everything it or any of its dependencies `require`s).
+
+Reduced feature (faster) alternative to the [`dependency-tree` package](https://www.npmjs.com/package/dependency-tree) that only works with stock node JS. This is used by Eleventy to find dependencies of a JavaScript file to watch for changes to re-run Eleventy’s build.
+
+## Big Huge Caveat
+
+⚠ A big caveat to this plugin is that it will require the file in order to build a dependency tree. So if your module has side effects and you don’t want it to execute—do not use this!
+
+## Installation
+
+```
+npm install --save-dev @11ty/dependency-tree
+```
+
+## Features
+
+* Ignores `node_modules`
+* Or, use `nodeModuleNamesOnly` to return a list of node_modules packages (added in v2.0.0)
+* Ignores Node’s built-ins (e.g. `path`)
+* Handles circular dependencies (Node does this too)
+
+## Usage
+
+```js
+// my-file.js
+
+// if my-local-dependency.js has dependencies, it will include those too
+const test = require("./my-local-dependency.js");
+
+// ignored, is a built-in
+const path = require("path");
+```
+
+```js
+const DependencyTree = require("@11ty/dependency-tree");
+
+DependencyTree("./my-file.js");
+// returns ["./my-local-dependency.js"]
+```
+
+### `allowNotFound`
+
+```js
+const DependencyTree = require("@11ty/dependency-tree");
+
+DependencyTree("./this-does-not-exist.js"); // throws an error
+
+DependencyTree("./this-does-not-exist.js", { allowNotFound: true });
+// returns []
+```
+
+### `nodeModuleNames`
+
+(Added in v2.0.1) Controls whether or not node package names are included in the list of dependencies.
+
+* `nodeModuleNames: "include"`: included alongside the local JS files.
+* `nodeModuleNames: "exclude"` (default): node module package names are excluded.
+* `nodeModuleNames: "only"`: only node module package names are returned.
+
+```js
+// my-file.js:
+
+require("./my-local-dependency.js");
+require("@11ty/eleventy");
+```
+
+```js
+const DependencyTree = require("@11ty/dependency-tree");
+
+DependencyTree("./my-file.js");
+// returns ["./my-local-dependency.js"]
+
+DependencyTree("./my-file.js", { nodeModuleNames: "exclude" });
+// returns ["./my-local-dependency.js"]
+
+DependencyTree("./my-file.js", { nodeModuleNames: "include" });
+// returns ["./my-local-dependency.js", "@11ty/eleventy"]
+
+DependencyTree("./my-file.js", { nodeModuleNames: "only" });
+// returns ["@11ty/eleventy"]
+```
+
+#### (Deprecated) `nodeModuleNamesOnly`
+
+(Added in v2.0.0) Changed to use `nodeModuleNames` option instead. Backwards compatibility is maintained automatically.
+
+* `nodeModuleNamesOnly: false` is mapped to `nodeModuleNames: "exclude"`
+* `nodeModuleNamesOnly: true` is mapped to `nodeModuleNames: "only"`
+
+If both `nodeModuleNamesOnly` and `nodeModuleNames` are included in options, `nodeModuleNames` takes precedence.
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/main.js b/node_modules/@11ty/dependency-tree/main.js
new file mode 100644
index 0000000..8d0df87
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/main.js
@@ -0,0 +1,120 @@
+const path = require("path");
+
+function getAbsolutePath(filename) {
+ let normalizedFilename = path.normalize(filename); // removes dot slash
+ let hasDotSlash = filename.startsWith("./");
+ return hasDotSlash ? path.join(path.resolve("."), normalizedFilename) : normalizedFilename;
+}
+
+function getRelativePath(filename) {
+ let normalizedFilename = path.normalize(filename); // removes dot slash
+ let workingDirectory = path.resolve(".");
+ let result = "./" + (normalizedFilename.startsWith(workingDirectory) ? normalizedFilename.substr(workingDirectory.length + 1) : normalizedFilename);
+ return result;
+}
+
+function getNodeModuleName(filename) {
+ let foundNodeModules = false;
+ let moduleName = [];
+
+ let s = filename.split(path.sep);
+ for(let entry of s) {
+ if(foundNodeModules) {
+ moduleName.push(entry);
+ if(!entry.startsWith("@")) {
+ return moduleName.join("/");
+ }
+ }
+
+ if(entry === "node_modules") {
+ foundNodeModules = true;
+ }
+ }
+
+ return false;
+}
+
+/* unordered */
+function getDependenciesFor(filename, avoidCircular, optionsArg = {}) {
+ // backwards compatibility with `nodeModuleNamesOnly` boolean option
+ // Using `nodeModuleNames` property moving forward
+ if(("nodeModuleNamesOnly" in optionsArg) && !("nodeModuleNames" in optionsArg)) {
+ if(optionsArg.nodeModuleNamesOnly === true) {
+ optionsArg.nodeModuleNames = "only";
+ }
+ if(optionsArg.nodeModuleNamesOnly === false) {
+ optionsArg.nodeModuleNames = "exclude";
+ }
+ }
+
+ let options = Object.assign({
+ allowNotFound: false,
+ nodeModuleNames: "exclude", // also "include" or "only"
+ }, optionsArg);
+ let absoluteFilename = getAbsolutePath(filename)
+
+ try {
+ require(absoluteFilename);
+ } catch(e) {
+ if(e.code === "MODULE_NOT_FOUND" && options.allowNotFound) {
+ // do nothing
+ } else {
+ throw e;
+ }
+ }
+
+
+ let mod;
+ for(let entry in require.cache) {
+ if(entry === absoluteFilename) {
+ mod = require.cache[entry];
+ break;
+ }
+ }
+
+ let dependencies = new Set();
+
+ if(!mod) {
+ if(!options.allowNotFound) {
+ throw new Error(`Could not find ${filename} in @11ty/dependency-tree`);
+ }
+ } else {
+ let relativeFilename = getRelativePath(mod.filename);
+ if(!avoidCircular) {
+ avoidCircular = {};
+ } else if(options.nodeModuleNames !== "only") {
+ dependencies.add(relativeFilename);
+ }
+
+ avoidCircular[relativeFilename] = true;
+
+ if(mod.children) {
+ for(let child of mod.children) {
+ let relativeChildFilename = getRelativePath(child.filename);
+ let nodeModuleName = getNodeModuleName(child.filename);
+
+ if(options.nodeModuleNames !== "exclude" && nodeModuleName) {
+ dependencies.add(nodeModuleName);
+ }
+ // Add dependencies of this dependency (not top level node_modules)
+ if(nodeModuleName === false) {
+ if(!dependencies.has(relativeChildFilename) && // avoid infinite looping with circular deps
+ !avoidCircular[relativeChildFilename] ) {
+ for(let dependency of getDependenciesFor(relativeChildFilename, avoidCircular, options)) {
+ dependencies.add(dependency);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return dependencies;
+}
+
+function getCleanDependencyListFor(filename, options = {}) {
+ return Array.from( getDependenciesFor(filename, null, options) );
+}
+
+module.exports = getCleanDependencyListFor;
+module.exports.getNodeModuleName = getNodeModuleName;
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/package.json b/node_modules/@11ty/dependency-tree/package.json
new file mode 100644
index 0000000..b323bd6
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@11ty/dependency-tree",
+ "version": "2.0.1",
+ "description": "Finds all JavaScript require dependencies from a filename.",
+ "main": "main.js",
+ "scripts": {
+ "test": "npx ava"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/11ty/eleventy-dependency-tree.git"
+ },
+ "author": {
+ "name": "Zach Leatherman",
+ "email": "zach@zachleat.com",
+ "url": "https://zachleat.com/"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "ava": "^3.15.0"
+ },
+ "ava": {
+ "files": [
+ "./test/*.js"
+ ],
+ "ignoredByWatcher": [
+ "./test/stubs/**"
+ ]
+ }
+}
diff --git a/node_modules/@11ty/dependency-tree/test/mainTest.js b/node_modules/@11ty/dependency-tree/test/mainTest.js
new file mode 100644
index 0000000..ab5af3c
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/mainTest.js
@@ -0,0 +1,92 @@
+const test = require("ava");
+const DependencyTree = require("../main.js");
+
+test("Nonexistent", t => {
+ t.throws(() => {
+ DependencyTree("./test/stubs/thisdoesnotexist.js");
+ });
+});
+
+test("Allow not Found", t => {
+ DependencyTree("./test/stubs/thisdoesnotexist.js", { allowNotFound: true });
+ t.true(true);
+});
+
+test("Not require()’d before calling", t => {
+ DependencyTree("./test/stubs/parent/parent.js");
+ t.true(true);
+});
+
+test("simple.js", t => {
+ t.deepEqual(DependencyTree("./test/stubs/simple.js"), ["./test/stubs/simple2.js"]);
+});
+
+test("parent.js", t => {
+ t.deepEqual(DependencyTree("./test/stubs/parent/parent.js").sort(), [
+ "./test/stubs/parent/child1.js",
+ "./test/stubs/parent/child2.js",
+ "./test/stubs/parent/grandchild.js",
+ "./test/stubs/parent/greatgrandchild.js"
+ ]);
+
+ t.deepEqual(DependencyTree("./test/stubs/parent/child1.js").sort(), [
+ "./test/stubs/parent/grandchild.js",
+ "./test/stubs/parent/greatgrandchild.js"
+ ]);
+
+ t.deepEqual(DependencyTree("./test/stubs/parent/child2.js").sort(), [
+ "./test/stubs/parent/grandchild.js",
+ "./test/stubs/parent/greatgrandchild.js"
+ ]);
+
+ t.deepEqual(DependencyTree("./test/stubs/parent/grandchild.js"), [
+ "./test/stubs/parent/greatgrandchild.js"
+ ]);
+
+ t.deepEqual(DependencyTree("./test/stubs/parent/greatgrandchild.js"), []);
+});
+
+test("circular", t => {
+ t.deepEqual(DependencyTree("./test/stubs/circular/circle-a.js").sort(), [
+ "./test/stubs/circular/circle-b.js",
+ "./test/stubs/circular/circle-c.js"]);
+});
+
+test("another circular", t => {
+ t.deepEqual(DependencyTree("./test/stubs/circular2/circle-a.js").sort(), [
+ "./test/stubs/circular2/circle-b.js",
+ "./test/stubs/circular2/circle-c.js"
+ ]);
+});
+
+test("dot dot (dependency is up a directory)", t => {
+ t.deepEqual(DependencyTree("./test/stubs/dotdot/dotdot.js").sort(), [
+ "./test/stubs/simple2.js"
+ ]);
+});
+
+test("only node_modules", t => {
+ t.deepEqual(DependencyTree("./test/stubs/uses_node_modules.js", {
+ nodeModuleNamesOnly: true
+ }).sort(), [
+ "@sindresorhus/is",
+ "lodash",
+ ]);
+});
+
+test("getNodeModuleName", t => {
+ t.is(DependencyTree.getNodeModuleName("./eleventy-dependency-tree/node_modules/lodash/lodash.js"), "lodash");
+ t.is(DependencyTree.getNodeModuleName("./eleventy-dependency-tree/node_modules/@sindresorhus/is/dist/index.js"), "@sindresorhus/is");
+});
+
+test("both files and node_modules", t => {
+ t.deepEqual(DependencyTree("./test/stubs/uses_node_modules.js", {
+ nodeModuleNames: "include"
+ }).sort(), [
+ "./test/stubs/parent/child1.js",
+ "./test/stubs/parent/grandchild.js",
+ "./test/stubs/parent/greatgrandchild.js",
+ "@sindresorhus/is",
+ "lodash",
+ ]);
+});
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-a.js b/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-a.js
new file mode 100644
index 0000000..6623835
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-a.js
@@ -0,0 +1 @@
+const circleB = require("./circle-b");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-b.js b/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-b.js
new file mode 100644
index 0000000..c0e7321
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-b.js
@@ -0,0 +1 @@
+const circleC = require("./circle-c");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-c.js b/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-c.js
new file mode 100644
index 0000000..8a6e8fe
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/circular/circle-c.js
@@ -0,0 +1 @@
+const circleA = require("./circle-a");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-a.js b/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-a.js
new file mode 100644
index 0000000..6623835
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-a.js
@@ -0,0 +1 @@
+const circleB = require("./circle-b");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-b.js b/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-b.js
new file mode 100644
index 0000000..c0e7321
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-b.js
@@ -0,0 +1 @@
+const circleC = require("./circle-c");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-c.js b/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-c.js
new file mode 100644
index 0000000..035f42f
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/circular2/circle-c.js
@@ -0,0 +1 @@
+const circleA = require("./circle-b");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/dotdot/dotdot.js b/node_modules/@11ty/dependency-tree/test/stubs/dotdot/dotdot.js
new file mode 100644
index 0000000..c9f0d88
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/dotdot/dotdot.js
@@ -0,0 +1 @@
+const test = require("../simple2")
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/parent/child1.js b/node_modules/@11ty/dependency-tree/test/stubs/parent/child1.js
new file mode 100644
index 0000000..a1dd077
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/parent/child1.js
@@ -0,0 +1,4 @@
+const test2 = require("./grandchild");
+const lodash = require("lodash");
+
+module.exports = {};
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/parent/child2.js b/node_modules/@11ty/dependency-tree/test/stubs/parent/child2.js
new file mode 100644
index 0000000..991077a
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/parent/child2.js
@@ -0,0 +1,3 @@
+const test = require("./grandchild");
+
+module.exports = {};
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/parent/grandchild.js b/node_modules/@11ty/dependency-tree/test/stubs/parent/grandchild.js
new file mode 100644
index 0000000..d721195
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/parent/grandchild.js
@@ -0,0 +1,2 @@
+const test = require("./greatgrandchild.js");
+module.exports = {};
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/parent/greatgrandchild.js b/node_modules/@11ty/dependency-tree/test/stubs/parent/greatgrandchild.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/parent/parent.js b/node_modules/@11ty/dependency-tree/test/stubs/parent/parent.js
new file mode 100644
index 0000000..3045c9b
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/parent/parent.js
@@ -0,0 +1,5 @@
+const path = require("path");
+const test = require("./child1");
+const test2 = require("./child2");
+
+module.exports = {};
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/simple.js b/node_modules/@11ty/dependency-tree/test/stubs/simple.js
new file mode 100644
index 0000000..eedd85c
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/simple.js
@@ -0,0 +1 @@
+const test = require("./simple2");
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/simple2.js b/node_modules/@11ty/dependency-tree/test/stubs/simple2.js
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/@11ty/dependency-tree/test/stubs/uses_node_modules.js b/node_modules/@11ty/dependency-tree/test/stubs/uses_node_modules.js
new file mode 100644
index 0000000..870f51f
--- /dev/null
+++ b/node_modules/@11ty/dependency-tree/test/stubs/uses_node_modules.js
@@ -0,0 +1,4 @@
+const is = require("@sindresorhus/is");
+const child1 = require("./parent/child1.js");
+
+module.exports = {};
\ No newline at end of file
diff --git a/node_modules/@11ty/eleventy-dev-server/README.md b/node_modules/@11ty/eleventy-dev-server/README.md
new file mode 100644
index 0000000..fcdb54c
--- /dev/null
+++ b/node_modules/@11ty/eleventy-dev-server/README.md
@@ -0,0 +1,56 @@
+
+
+# eleventy-dev-server 🕚⚡️🎈🐀
+
+A minimal, modern, generic, hot-reloading local web server to help web developers.
+
+## ➡ [Documentation](https://www.11ty.dev/docs/watch-serve/#eleventy-dev-server)
+
+- Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/)!
+- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty)
+- Support [11ty on Open Collective](https://opencollective.com/11ty)
+- [11ty on npm](https://www.npmjs.com/org/11ty)
+- [11ty on GitHub](https://github.com/11ty)
+
+[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy-dev-server.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy-dev-server)
+
+## Installation
+
+This is bundled with `@11ty/eleventy` (and you do not need to install it separately) in Eleventy v2.0.
+
+## CLI
+
+Eleventy Dev Server now also includes a CLI. The CLI is for **standalone** (non-Eleventy) use only: separate installation is unnecessary if you’re using this server with `@11ty/eleventy`.
+
+```sh
+npm install -g @11ty/eleventy-dev-server
+
+# Alternatively, install locally into your project
+npm install @11ty/eleventy-dev-server
+```
+
+This package requires Node 14 or newer.
+
+### CLI Usage
+
+```sh
+# Serve the current directory
+npx @11ty/eleventy-dev-server
+
+# Serve a different subdirectory (also aliased as --input)
+npx @11ty/eleventy-dev-server --dir=_site
+
+# Disable the `domdiff` feature
+npx @11ty/eleventy-dev-server --domdiff=false
+
+# Full command list in the Help
+npx @11ty/eleventy-dev-server --help
+```
+
+## Tests
+
+```
+npm run test
+```
+
+- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md))
diff --git a/node_modules/@11ty/eleventy-dev-server/cli.js b/node_modules/@11ty/eleventy-dev-server/cli.js
new file mode 100644
index 0000000..35621eb
--- /dev/null
+++ b/node_modules/@11ty/eleventy-dev-server/cli.js
@@ -0,0 +1,92 @@
+const chokidar = require("chokidar");
+const fs = require("fs");
+
+const pkg = require("./package.json");
+const EleventyDevServer = require("./server.js");
+
+const Logger = {
+ info: function(...args) {
+ console.log( "[11ty/eleventy-dev-server]", ...args );
+ },
+ error: function(...args) {
+ console.error( "[11ty/eleventy-dev-server]", ...args );
+ },
+ fatal: function(...args) {
+ Logger.error(...args);
+ process.exitCode = 1;
+ }
+};
+
+Logger.log = Logger.info;
+
+class Cli {
+ static getVersion() {
+ return pkg.version;
+ }
+
+ static getHelp() {
+ return `Usage:
+
+ eleventy-dev-server
+ eleventy-dev-server --dir=_site
+ eleventy-dev-server --port=3000
+
+Arguments:
+
+ --version
+
+ --dir=.
+ Directory to serve (default: \`.\`)
+
+ --input (alias for --dir)
+
+ --port=8080
+ Run the web server on this port (default: \`8080\`)
+ Will autoincrement if already in use.
+
+ --domdiff (enabled, default)
+ --domdiff=false (disabled)
+ Apply HTML changes without a full page reload.
+
+ --help`;
+ }
+
+ static getDefaultOptions() {
+ return {
+ port: "8080",
+ input: ".",
+ domDiff: true,
+ }
+ }
+
+ async serve(options = {}) {
+ this.options = Object.assign(Cli.getDefaultOptions(), options);
+
+ this.server = EleventyDevServer.getServer("eleventy-dev-server-cli", this.options.input, {
+ // TODO allow server configuration extensions
+ showVersion: true,
+ logger: Logger,
+ domDiff: this.options.domDiff,
+
+ // CLI watches all files in the folder by default
+ // this is different from Eleventy usage!
+ watch: [ this.options.input ],
+ });
+
+ this.server.serve(this.options.port);
+
+ // TODO? send any errors here to the server too
+ // with server.sendError({ error });
+ }
+
+ close() {
+ if(this.server) {
+ this.server.close();
+ }
+ }
+}
+
+module.exports = {
+ Logger,
+ Cli
+}
diff --git a/node_modules/@11ty/eleventy-dev-server/client/reload-client.js b/node_modules/@11ty/eleventy-dev-server/client/reload-client.js
new file mode 100644
index 0000000..1763411
--- /dev/null
+++ b/node_modules/@11ty/eleventy-dev-server/client/reload-client.js
@@ -0,0 +1,259 @@
+class Util {
+ static pad(num, digits = 2) {
+ let zeroes = new Array(digits + 1).join(0);
+ return `${zeroes}${num}`.slice(-1 * digits);
+ }
+
+ static log(message) {
+ Util.output("log", message);
+ }
+ static error(message, error) {
+ Util.output("error", message, error);
+ }
+ static output(type, ...messages) {
+ let now = new Date();
+ let date = `${Util.pad(now.getUTCHours())}:${Util.pad(
+ now.getUTCMinutes()
+ )}:${Util.pad(now.getUTCSeconds())}.${Util.pad(
+ now.getUTCMilliseconds(),
+ 3
+ )}`;
+ console[type](`[11ty][${date} UTC]`, ...messages);
+ }
+
+ static capitalize(word) {
+ return word.substr(0, 1).toUpperCase() + word.substr(1);
+ }
+
+ static matchRootAttributes(htmlContent) {
+ // Workaround for morphdom bug with attributes on https://github.com/11ty/eleventy-dev-server/issues/6
+ // Note also `childrenOnly: true` above
+ const parser = new DOMParser();
+ let parsed = parser.parseFromString(htmlContent, "text/html");
+ let parsedDoc = parsed.documentElement;
+ let newAttrs = parsedDoc.getAttributeNames();
+
+ let docEl = document.documentElement;
+ // Remove old
+ let removedAttrs = docEl.getAttributeNames().filter(name => !newAttrs.includes(name));
+ for(let attr of removedAttrs) {
+ docEl.removeAttribute(attr);
+ }
+
+ // Add new
+ for(let attr of newAttrs) {
+ docEl.setAttribute(attr, parsedDoc.getAttribute(attr));
+ }
+ }
+
+ static isEleventyLinkNodeMatch(from, to) {
+ // Issue #18 https://github.com/11ty/eleventy-dev-server/issues/18
+ // Don’t update a if the _11ty searchParam is the only thing that’s different
+ if(from.tagName !== "LINK" || to.tagName !== "LINK") {
+ return false;
+ }
+
+ let oldWithoutHref = from.cloneNode();
+ let newWithoutHref = to.cloneNode();
+
+ oldWithoutHref.removeAttribute("href");
+ newWithoutHref.removeAttribute("href");
+
+ // if all other attributes besides href match
+ if(!oldWithoutHref.isEqualNode(newWithoutHref)) {
+ return false;
+ }
+
+ let oldUrl = new URL(from.href);
+ let newUrl = new URL(to.href);
+
+ // morphdom wants to force href="style.css?_11ty" => href="style.css"
+ let isErasing = oldUrl.searchParams.has("_11ty") && !newUrl.searchParams.has("_11ty");
+ if(!isErasing) {
+ // not a match if _11ty has a new value (not being erased)
+ return false;
+ }
+
+ oldUrl.searchParams.set("_11ty", "");
+ newUrl.searchParams.set("_11ty", "");
+
+ // is a match if erasing and the rest of the href matches too
+ return oldUrl.toString() === newUrl.toString();
+ }
+
+ // https://github.com/patrick-steele-idem/morphdom/issues/178#issuecomment-652562769
+ static runScript(source, target) {
+ let script = document.createElement('script');
+
+ //copy over the attributes
+ for(let attr of [...source.attributes]) {
+ script.setAttribute(attr.nodeName ,attr.nodeValue);
+ }
+
+ script.innerHTML = source.innerHTML;
+ (target || source).replaceWith(script);
+ }
+}
+
+class EleventyReload {
+ constructor() {
+ this.connectionMessageShown = false;
+ this.reconnectEventCallback = this.reconnect.bind(this);
+ }
+
+ init(options = {}) {
+ if (!("WebSocket" in window)) {
+ return;
+ }
+
+ let { protocol, host } = new URL(document.location.href);
+
+ // works with http (ws) and https (wss)
+ let websocketProtocol = protocol.replace("http", "ws");
+
+ let socket = new WebSocket(`${websocketProtocol}//${host}`);
+
+ socket.addEventListener("message", async (event) => {
+ try {
+ let data = JSON.parse(event.data);
+ // Util.log( JSON.stringify(data, null, 2) );
+
+ let { type } = data;
+
+ if (type === "eleventy.reload") {
+ await this.onreload(data);
+ } else if (type === "eleventy.msg") {
+ Util.log(`${data.message}`);
+ } else if (type === "eleventy.error") {
+ // Log Eleventy build errors
+ // Extra parsing for Node Error objects
+ let e = JSON.parse(data.error);
+ Util.error(`Build error: ${e.message}`, e);
+ } else if (type === "eleventy.status") {
+ // Full page reload on initial reconnect
+ if (data.status === "connected" && options.mode === "reconnect") {
+ window.location.reload();
+ }
+
+ if(data.status === "connected") {
+ // With multiple windows, only show one connection message
+ if(!this.isConnected) {
+ Util.log(Util.capitalize(data.status));
+ }
+
+ this.connectionMessageShown = true;
+ } else {
+ if(data.status === "disconnected") {
+ this.addReconnectListeners();
+ }
+
+ Util.log(Util.capitalize(data.status));
+ }
+ } else {
+ Util.log("Unknown event type", data);
+ }
+ } catch (e) {
+ Util.error(`Error parsing ${event.data}: ${e.message}`, e);
+ }
+ });
+
+ socket.addEventListener("open", () => {
+ // no reconnection when the connect is already open
+ this.removeReconnectListeners();
+ });
+
+ socket.addEventListener("close", () => {
+ this.connectionMessageShown = false;
+ this.addReconnectListeners();
+ });
+ }
+
+ reconnect() {
+ Util.log( "Reconnecting…" );
+ this.init({ mode: "reconnect" });
+ }
+
+ async onreload({ subtype, files, build }) {
+ if (subtype === "css") {
+ for (let link of document.querySelectorAll(`link[rel="stylesheet"]`)) {
+ let url = new URL(link.href);
+ url.searchParams.set("_11ty", Date.now());
+ link.href = url.toString();
+ }
+ Util.log(`CSS updated without page reload.`);
+ } else {
+ let morphed = false;
+
+ try {
+ if((build.templates || []).length > 0) {
+ // Important: using `./` in `./morphdom.js` allows the special `.11ty` folder to be changed upstream
+ const { default: morphdom } = await import(`./morphdom.js`);
+
+ // { url, inputPath, content }
+ for (let template of build.templates || []) {
+ if (template.url === document.location.pathname) {
+ // Importantly, if this does not match but is still relevant (layout/include/etc), a full reload happens below. This could be improved.
+ if ((files || []).includes(template.inputPath)) {
+ // Notable limitation: this won’t re-run script elements or JavaScript page lifecycle events (load/DOMContentLoaded)
+ morphed = true;
+
+ morphdom(document.documentElement, template.content, {
+ childrenOnly: true,
+ onBeforeElUpdated: function (fromEl, toEl) {
+ if (fromEl.nodeName === "SCRIPT" && toEl.nodeName === "SCRIPT") {
+ Util.runScript(toEl, fromEl);
+ return false;
+ }
+
+ // Speed-up trick from morphdom docs
+ // https://dom.spec.whatwg.org/#concept-node-equals
+ if (fromEl.isEqualNode(toEl)) {
+ return false;
+ }
+
+ if(Util.isEleventyLinkNodeMatch(fromEl, toEl)) {
+ return false;
+ }
+
+ return true;
+ },
+ onNodeAdded: function (node) {
+ if (node.nodeName === 'SCRIPT') {
+ Util.runScript(node);
+ }
+ },
+ });
+
+ Util.matchRootAttributes(template.content);
+ Util.log(`HTML delta applied without page reload.`);
+ }
+ break;
+ }
+ }
+ }
+ } catch(e) {
+ Util.error( "Morphdom error", e );
+ }
+
+ if (!morphed) {
+ Util.log(`Page reload initiated.`);
+ window.location.reload();
+ }
+ }
+ }
+
+ addReconnectListeners() {
+ this.removeReconnectListeners();
+
+ window.addEventListener("focus", this.reconnectEventCallback);
+ window.addEventListener("visibilitychange", this.reconnectEventCallback);
+ }
+
+ removeReconnectListeners() {
+ window.removeEventListener("focus", this.reconnectEventCallback);
+ window.removeEventListener("visibilitychange", this.reconnectEventCallback);
+ }
+}
+
+let reloader = new EleventyReload();
+reloader.init();
\ No newline at end of file
diff --git a/node_modules/@11ty/eleventy-dev-server/cmd.js b/node_modules/@11ty/eleventy-dev-server/cmd.js
new file mode 100755
index 0000000..0cde317
--- /dev/null
+++ b/node_modules/@11ty/eleventy-dev-server/cmd.js
@@ -0,0 +1,69 @@
+#!/usr/bin/env node
+
+const pkg = require("./package.json");
+
+// Node check
+require("please-upgrade-node")(pkg, {
+ message: function (requiredVersion) {
+ return (
+ "eleventy-dev-server requires Node " +
+ requiredVersion +
+ ". You will need to upgrade Node!"
+ );
+ },
+});
+
+const { Logger, Cli } = require("./cli.js");
+
+const debug = require("debug")("EleventyDevServer:cmd");
+
+try {
+ const argv = require("minimist")(process.argv.slice(2), {
+ string: [
+ "dir",
+ "input", // alias for dir
+ "port",
+ ],
+ boolean: [
+ "version",
+ "help",
+ "domdiff",
+ ],
+ default: Cli.getDefaultOptions(),
+ unknown: function (unknownArgument) {
+ throw new Error(
+ `We don’t know what '${unknownArgument}' is. Use --help to see the list of supported commands.`
+ );
+ },
+ });
+
+ debug("command: eleventy-dev-server %o", argv);
+
+ process.on("unhandledRejection", (error, promise) => {
+ Logger.fatal("Unhandled rejection in promise:", promise, error);
+ });
+ process.on("uncaughtException", (error) => {
+ Logger.fatal("Uncaught exception:", error);
+ });
+
+ if (argv.version) {
+ console.log(Cli.getVersion());
+ } else if (argv.help) {
+ console.log(Cli.getHelp());
+ } else {
+ let cli = new Cli();
+
+ cli.serve({
+ input: argv.dir || argv.input,
+ port: argv.port,
+ domDiff: argv.domdiff,
+ });
+
+ process.on("SIGINT", () => {
+ cli.close();
+ process.exit();
+ });
+ }
+} catch (e) {
+ Logger.fatal("Fatal Error:", e)
+}
diff --git a/node_modules/@11ty/eleventy-dev-server/package.json b/node_modules/@11ty/eleventy-dev-server/package.json
new file mode 100644
index 0000000..4606b77
--- /dev/null
+++ b/node_modules/@11ty/eleventy-dev-server/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "@11ty/eleventy-dev-server",
+ "version": "1.0.4",
+ "description": "A minimal, modern, generic, hot-reloading local web server to help web developers.",
+ "main": "server.js",
+ "scripts": {
+ "test": "npx ava --verbose",
+ "sample": "node cmd.js --input=test/stubs"
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/11ty"
+ },
+ "bin": {
+ "eleventy-dev-server": "./cmd.js"
+ },
+ "keywords": [
+ "eleventy",
+ "server",
+ "cli"
+ ],
+ "publishConfig": {
+ "access": "public"
+ },
+ "author": {
+ "name": "Zach Leatherman",
+ "email": "zachleatherman@gmail.com",
+ "url": "https://zachleat.com/"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/11ty/eleventy-dev-server.git"
+ },
+ "bugs": "https://github.com/11ty/eleventy-dev-server/issues",
+ "homepage": "https://github.com/11ty/eleventy-dev-server/",
+ "dependencies": {
+ "@11ty/eleventy-utils": "^1.0.1",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.4",
+ "dev-ip": "^1.0.1",
+ "finalhandler": "^1.2.0",
+ "mime": "^3.0.0",
+ "minimist": "^1.2.8",
+ "morphdom": "^2.7.0",
+ "please-upgrade-node": "^3.2.0",
+ "ssri": "^8.0.1",
+ "ws": "^8.13.0"
+ },
+ "devDependencies": {
+ "ava": "^5.2.0"
+ }
+}
diff --git a/node_modules/@11ty/eleventy-dev-server/server.js b/node_modules/@11ty/eleventy-dev-server/server.js
new file mode 100644
index 0000000..aad4c38
--- /dev/null
+++ b/node_modules/@11ty/eleventy-dev-server/server.js
@@ -0,0 +1,807 @@
+const pkg = require("./package.json");
+const path = require("path");
+const fs = require("fs");
+const finalhandler = require("finalhandler");
+const WebSocket = require("ws");
+const { WebSocketServer } = WebSocket;
+const mime = require("mime");
+const ssri = require("ssri");
+const devip = require("dev-ip");
+const chokidar = require("chokidar");
+const { TemplatePath } = require("@11ty/eleventy-utils");
+
+const debug = require("debug")("EleventyDevServer");
+
+const wrapResponse = require("./server/wrapResponse.js");
+
+const DEFAULT_OPTIONS = {
+ port: 8080,
+ liveReload: true, // Enable live reload at all
+ showAllHosts: false, // IP address based hosts (other than localhost)
+ injectedScriptsFolder: ".11ty", // Change the name of the special folder used for injected scripts
+ portReassignmentRetryCount: 10, // number of times to increment the port if in use
+ https: {}, // `key` and `cert`, required for http/2 and https
+ domDiff: true, // Use morphdom to apply DOM diffing delta updates to HTML
+ showVersion: false, // Whether or not to show the server version on the command line.
+ encoding: "utf-8", // Default file encoding
+ pathPrefix: "/", // May be overridden by Eleventy, adds a virtual base directory to your project
+ watch: [], // Globs to pass to separate dev server chokidar for watching
+ aliases: {}, // Aliasing feature
+
+ // Logger (fancier one is injected by Eleventy)
+ logger: {
+ info: console.log,
+ log: console.log,
+ error: console.error,
+ }
+}
+
+class EleventyDevServer {
+ static getServer(...args) {
+ return new EleventyDevServer(...args);
+ }
+
+ constructor(name, dir, options = {}) {
+ debug("Creating new Dev Server instance.")
+ this.name = name;
+ this.normalizeOptions(options);
+
+ this.fileCache = {};
+ // Directory to serve
+ if(!dir) {
+ throw new Error("Missing `dir` to serve.");
+ }
+ this.dir = dir;
+ this.logger = this.options.logger;
+
+ if(this.options.watch.length > 0) {
+ this.getWatcher();
+ }
+ }
+
+ normalizeOptions(options = {}) {
+ this.options = Object.assign({}, DEFAULT_OPTIONS, options);
+
+ // better names for options https://github.com/11ty/eleventy-dev-server/issues/41
+ if(options.folder !== undefined) {
+ this.options.injectedScriptsFolder = options.folder;
+ delete this.options.folder;
+ }
+ if(options.domdiff !== undefined) {
+ this.options.domDiff = options.domdiff;
+ delete this.options.domdiff;
+ }
+ if(options.enabled !== undefined) {
+ this.options.liveReload = options.enabled;
+ delete this.options.enabled;
+ }
+
+ this.options.pathPrefix = this.cleanupPathPrefix(this.options.pathPrefix);
+ }
+
+ get watcher() {
+ if(!this._watcher) {
+ debug("Watching %O", this.options.watch);
+ // TODO if using Eleventy and `watch` option includes output folder (_site) this will trigger two update events!
+ this._watcher = chokidar.watch(this.options.watch, {
+ // TODO allow chokidar configuration extensions (or re-use the ones in Eleventy)
+
+ ignored: ["**/node_modules/**", ".git"],
+ ignoreInitial: true,
+
+ // same values as Eleventy
+ awaitWriteFinish: {
+ stabilityThreshold: 150,
+ pollInterval: 25,
+ },
+ });
+
+ this._watcher.on("change", (path) => {
+ this.logger.log( `File changed: ${path} (skips build)` );
+ this.reloadFiles([path]);
+ });
+
+ this._watcher.on("add", (path) => {
+ this.logger.log( `File added: ${path} (skips build)` );
+ this.reloadFiles([path]);
+ });
+ }
+
+ return this._watcher;
+ }
+
+ getWatcher() {
+ return this.watcher;
+ }
+
+ watchFiles(files) {
+ if(Array.isArray(files)) {
+ files = files.map(entry => TemplatePath.stripLeadingDotSlash(entry));
+
+ debug("Also watching %O", files);
+ this.watcher.add(files);
+ }
+ }
+
+ cleanupPathPrefix(pathPrefix) {
+ if(!pathPrefix || pathPrefix === "/") {
+ return "/";
+ }
+ if(!pathPrefix.startsWith("/")) {
+ pathPrefix = `/${pathPrefix}`
+ }
+ if(!pathPrefix.endsWith("/")) {
+ pathPrefix = `${pathPrefix}/`;
+ }
+ return pathPrefix;
+ }
+
+ // Allowed list of files that can be served from outside `dir`
+ setAliases(aliases) {
+ if(aliases) {
+ this.passthroughAliases = aliases;
+ debug( "Setting aliases (emulated passthrough copy) %O", aliases );
+ }
+ }
+
+ matchPassthroughAlias(url) {
+ let aliases = Object.assign({}, this.options.aliases, this.passthroughAliases);
+ for(let targetUrl in aliases) {
+ if(!targetUrl) {
+ continue;
+ }
+
+ let file = aliases[targetUrl];
+ if(url.startsWith(targetUrl)) {
+ let inputDirectoryPath = file + url.slice(targetUrl.length);
+
+ // e.g. addPassthroughCopy("img/") but
+ // generated by the image plugin (written to the output folder)
+ // If they do not exist in the input directory, this will fallback to the output directory.
+ if(fs.existsSync(inputDirectoryPath)) {
+ return inputDirectoryPath;
+ }
+ }
+ }
+ return false;
+ }
+
+ isFileInDirectory(dir, file) {
+ let absoluteDir = TemplatePath.absolutePath(dir);
+ let absoluteFile = TemplatePath.absolutePath(file);
+ return absoluteFile.startsWith(absoluteDir);
+ }
+
+ getOutputDirFilePath(filepath, filename = "") {
+ let computedPath;
+ if(filename === ".html") {
+ // avoid trailing slash for filepath/.html requests
+ let prefix = path.join(this.dir, filepath);
+ if(prefix.endsWith(path.sep)) {
+ prefix = prefix.substring(0, prefix.length - path.sep.length);
+ }
+ computedPath = prefix + filename;
+ } else {
+ computedPath = path.join(this.dir, filepath, filename);
+ }
+
+ computedPath = decodeURIComponent(computedPath);
+
+ if(!filename) { // is a direct URL request (not an implicit .html or index.html add)
+ let alias = this.matchPassthroughAlias(filepath);
+
+ if(alias) {
+ if(!this.isFileInDirectory(path.resolve("."), alias)) {
+ throw new Error("Invalid path");
+ }
+
+ return alias;
+ }
+ }
+
+ // Check that the file is in the output path (error if folks try use `..` in the filepath)
+ if(!this.isFileInDirectory(this.dir, computedPath)) {
+ throw new Error("Invalid path");
+ }
+
+ return computedPath;
+ }
+
+ isOutputFilePathExists(rawPath) {
+ return fs.existsSync(rawPath) && !TemplatePath.isDirectorySync(rawPath);
+ }
+
+ /* Use conventions documented here https://www.zachleat.com/web/trailing-slash/
+ * resource.html exists:
+ * /resource matches
+ * /resource/ redirects to /resource
+ * resource/index.html exists:
+ * /resource redirects to /resource/
+ * /resource/ matches
+ * both resource.html and resource/index.html exists:
+ * /resource matches /resource.html
+ * /resource/ matches /resource/index.html
+ */
+ mapUrlToFilePath(url) {
+ // Note: `localhost` is not important here, any host would work
+ let u = new URL(url, "http://localhost/");
+ url = u.pathname;
+
+ // Remove PathPrefix from start of URL
+ if (this.options.pathPrefix !== "/") {
+ // Requests to root should redirect to new pathPrefix
+ if(url === "/") {
+ return {
+ statusCode: 302,
+ url: this.options.pathPrefix,
+ }
+ }
+
+ // Requests to anything outside of root should fail with 404
+ if (!url.startsWith(this.options.pathPrefix)) {
+ return {
+ statusCode: 404,
+ };
+ }
+
+ url = url.slice(this.options.pathPrefix.length - 1);
+ }
+
+ let rawPath = this.getOutputDirFilePath(url);
+ if (this.isOutputFilePathExists(rawPath)) {
+ return {
+ statusCode: 200,
+ filepath: rawPath,
+ };
+ }
+
+ let indexHtmlPath = this.getOutputDirFilePath(url, "index.html");
+ let indexHtmlExists = fs.existsSync(indexHtmlPath);
+
+ let htmlPath = this.getOutputDirFilePath(url, ".html");
+ let htmlExists = fs.existsSync(htmlPath);
+
+ // /resource/ => /resource/index.html
+ if (indexHtmlExists && url.endsWith("/")) {
+ return {
+ statusCode: 200,
+ filepath: indexHtmlPath,
+ };
+ }
+ // /resource => resource.html
+ if (htmlExists && !url.endsWith("/")) {
+ return {
+ statusCode: 200,
+ filepath: htmlPath,
+ };
+ }
+
+ // /resource => redirect to /resource/
+ if (indexHtmlExists && !url.endsWith("/")) {
+ return {
+ statusCode: 301,
+ url: url + "/",
+ };
+ }
+
+ // /resource/ => redirect to /resource
+ if (htmlExists && url.endsWith("/")) {
+ return {
+ statusCode: 301,
+ url: url.substring(0, url.length - 1),
+ };
+ }
+
+ return {
+ statusCode: 404,
+ };
+ }
+
+ _getFileContents(localpath, rootDir, useCache = true) {
+ if(this.fileCache[localpath]) {
+ return this.fileCache[localpath];
+ }
+
+ let filepath;
+ let searchLocations = [];
+
+ if(rootDir) {
+ searchLocations.push(TemplatePath.absolutePath(rootDir, localpath));
+ }
+ // fallbacks for file:../ installations
+ searchLocations.push(TemplatePath.absolutePath(__dirname, localpath));
+ searchLocations.push(TemplatePath.absolutePath(__dirname, "../../../", localpath));
+
+ for(let loc of searchLocations) {
+ if(fs.existsSync(loc)) {
+ filepath = loc;
+ break;
+ }
+ }
+
+ let contents = fs.readFileSync(filepath, {
+ encoding: this.options.encoding,
+ });
+ if(useCache) {
+ this.fileCache[localpath] = contents;
+ }
+ return contents;
+ }
+
+ augmentContentWithNotifier(content, inlineContents = false, options = {}) {
+ let { integrityHash, scriptContents } = options;
+ if(!scriptContents) {
+ scriptContents = this._getFileContents("./client/reload-client.js");
+ }
+ if(!integrityHash) {
+ integrityHash = ssri.fromData(scriptContents);
+ }
+
+ // This isn’t super necessary because it’s a local file, but it’s included anyway
+ let script = ``;
+
+ if (content.includes("")) {
+ return content.replace("", `${script}`);
+ }
+
+ // If the HTML document contains an importmap, insert the module script after the importmap element
+ let importMapRegEx = /