Change feed.njk to a typescript template

14e3d38c967898d3811831bdf23b9108575439aa

Tucker McKnight <tucker@pangolin.lan> | Sat Jan 03 2026

Change feed.njk to a typescript template

This is the last njk template that needed to be changed over.

Several changes have been made to this template. First, the RSS
plugin isn't expected to be provided by the parent 11ty site anymore.
Instead, this plugin will require the RSS plugin itself.

The dateToRfc3339 function is therefore being imported directly,
instead of being looked for as an eleventyConfig filter.

Some of the other functions dealing with absolute URLs are no longer
being used. This is using its own baseUrl value instead. (May want
to revisit this later, but let's just use baseUrl for now.)
main.ts:21
Before
20
21
22
23

24
import indexJsTemplate from './js_templates/index.ts'
import branchesJsTemplate from './js_templates/branches.ts'
import rawJsTemplate from './js_templates/raw.ts'

⁣
const ajv = new Ajv()
const exec = util.promisify(childProcess.exec)
After
20
21
22
23
24
25
import indexJsTemplate from './js_templates/index.ts'
import branchesJsTemplate from './js_templates/branches.ts'
import rawJsTemplate from './js_templates/raw.ts'
import feedJsTemplate from './js_templates/feed.ts'

const ajv = new Ajv()
const exec = util.promisify(childProcess.exec)
main.ts:498
Before
After
make.sh:6
Before
5
6
7
8
9
10
mkdir -p dist/img
cp frontend/top.js dist/frontend/top.js
cp -r frontend/img dist/frontend/img
cp templates/*.njk dist/templates
cp partial_templates/*.njk dist/partial_templates
cp -r vendor dist/
After
5
6
7


8
mkdir -p dist/img
cp frontend/top.js dist/frontend/top.js
cp -r frontend/img dist/frontend/img
⁣
⁣
cp -r vendor dist/
package-lock.json:9
Before
8
9
10

11
12
      "version": "0.0.1-alpha.1",
      "license": "ISC",
      "dependencies": {
⁣
        "ajv": "^8.17.1",
        "diff": "^8.0.2",
        "lodash": "^4.17.21"
After
8
9
10
11
12
13
      "version": "0.0.1-alpha.1",
      "license": "ISC",
      "dependencies": {
        "@11ty/eleventy-plugin-rss": "^2.0.4",
        "ajv": "^8.17.1",
        "diff": "^8.0.2",
        "lodash": "^4.17.21"
package-lock.json:1054
Before
1053
1054
1055
















1056
1057
        "node": ">= 8"
      }
    },
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
    "node_modules/detect-libc": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
After
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
        "node": ">= 8"
      }
    },
    "node_modules/debug": {
      "version": "4.4.3",
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
      "dependencies": {
        "ms": "^2.1.3"
      },
      "engines": {
        "node": ">=6.0"
      },
      "peerDependenciesMeta": {
        "supports-color": {
          "optional": true
        }
      }
    },
    "node_modules/detect-libc": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
package-lock.json:1192
Before
1191
1192
1193








1194
1195
        "node": ">=4.0"
      }
    },
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
    "node_modules/events": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
After
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
        "node": ">=4.0"
      }
    },
    "node_modules/evaluate-value": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz",
      "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==",
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/events": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
package-lock.json:1440
Before
1439
1440
1441





1442
1443
        "node": ">=0.10.0"
      }
    },
⁣
⁣
⁣
⁣
⁣
    "node_modules/is-number": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
After
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
        "node": ">=0.10.0"
      }
    },
    "node_modules/is-json": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz",
      "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA=="
    },
    "node_modules/is-number": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
package-lock.json:1554
Before
1553
1554
1555





1556
1557
        "uc.micro": "^2.0.0"
      }
    },
⁣
⁣
⁣
⁣
⁣
    "node_modules/loader-runner": {
      "version": "4.3.1",
      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
After
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
        "uc.micro": "^2.0.0"
      }
    },
    "node_modules/list-to-array": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz",
      "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g=="
    },
    "node_modules/loader-runner": {
      "version": "4.3.1",
      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
package-lock.json:1692
Before
1691
1692
1693





1694
1695
        "node": ">=16 || 14 >=14.17"
      }
    },
⁣
⁣
⁣
⁣
⁣
    "node_modules/neo-async": {
      "version": "2.6.2",
      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
After
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
        "node": ">=16 || 14 >=14.17"
      }
    },
    "node_modules/ms": {
      "version": "2.1.3",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
    },
    "node_modules/neo-async": {
      "version": "2.6.2",
      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
package-lock.json:1767
Before
1766
1767
1768





1769
1770
      "dev": true,
      "license": "BlueOak-1.0.0"
    },
⁣
⁣
⁣
⁣
⁣
    "node_modules/path-exists": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
After
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
      "dev": true,
      "license": "BlueOak-1.0.0"
    },
    "node_modules/parse-srcset": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
      "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
    },
    "node_modules/path-exists": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
package.json:27
Before
26
27
28

29
30
    "webpack-cli": "^6.0.1"
  },
  "dependencies": {
⁣
    "ajv": "^8.17.1",
    "diff": "^8.0.2",
    "lodash": "^4.17.21"
After
26
27
28
29
30
31
    "webpack-cli": "^6.0.1"
  },
  "dependencies": {
    "@11ty/eleventy-plugin-rss": "^2.0.4",
    "ajv": "^8.17.1",
    "diff": "^8.0.2",
    "lodash": "^4.17.21"
partial_templates/main_bottom.njk:1
Before
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        </div>
      </div>
    </div>
    <script>
      const toggleUnifiedMode = (e) => {
        const diffs = document.getElementById('diffs')
        const afterDiffs = document.querySelectorAll('.diff-right')
        if (e.checked) {
          diffs.classList.add("unified")
          afterDiffs.forEach((elem) => {
            elem.classList.remove('border-start', 'ps-2')
          })
        }
        else {
          diffs.classList.remove("unified")
          afterDiffs.forEach((elem) => {
            elem.classList.add('border-start', 'ps-2')
          })
        }
      }

      const selectBranch = (e) => {
        const values = e.value.split(",")
        window.location = `{{reposPath}}/${values[0]}/branches/${values[1]}/${values[2]}`
      }
    </script>
    <script src="{{reposPath}}/frontend/main-frontend.bundle.js"></script>
  </body>
</html>
After


























⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣
⁣