Skip to content

Commit 021fc9a

Browse files
authored
feat: eleventy — migrate from v2 to v3 (#234)
feat: `eleventy` — migrate from v2 to v3
2 parents 1cae011 + 5d0580b commit 021fc9a

3 files changed

Lines changed: 750 additions & 1436 deletions

File tree

.eleventy.js

Lines changed: 96 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,160 +1,172 @@
1-
const pluginRss = require('@11ty/eleventy-plugin-rss')
2-
require('dotenv').config()
3-
const fs = require("fs");
4-
const path = require("path");
5-
6-
module.exports = function (eleventyConfig) {
7-
const { DateTime } = require('luxon')
8-
const hljs = require('highlight.js')
9-
const anchor = require('markdown-it-anchor')
10-
const markdownIt = require('markdown-it')({
1+
import dotenv from "dotenv"
2+
import fs from "fs"
3+
import path from "path"
4+
import { DateTime } from "luxon"
5+
import hljs from "highlight.js"
6+
import markdownIt from "markdown-it"
7+
import anchor from "markdown-it-anchor"
8+
import bracketedSpans from "markdown-it-bracketed-spans"
9+
import attrs from "markdown-it-attrs"
10+
import toc from "markdown-it-table-of-contents"
11+
import mark from "markdown-it-mark"
12+
import rssPlugin from "@11ty/eleventy-plugin-rss"
13+
14+
dotenv.config()
15+
16+
export default function (eleventyConfig) {
17+
const isDevelopment = process.env.NODE_ENV === "development"
18+
const markdownItConfig = markdownIt({
1119
html: true,
1220
linkify: true,
1321
typographer: true,
1422
highlight: function (str, lang) {
15-
if (lang && hljs.getLanguage(lang))
23+
if (lang && hljs.getLanguage(lang)) {
1624
try {
1725
return hljs.highlight(str, { language: lang }).value
1826
} catch (__) { }
19-
20-
return ''
27+
}
28+
return ""
2129
},
2230
})
2331
.use(anchor, {
2432
permalink: anchor.permalink.linkAfterHeader({
25-
style: 'visually-hidden',
26-
assistiveText: title => `Permalink to “${title}”`,
27-
visuallyHiddenClass: 'sr-only',
28-
wrapper: ['<div class="header-wrapper">', '</div>']
33+
style: "visually-hidden",
34+
assistiveText: (title) => `Permalink to “${title}”`,
35+
visuallyHiddenClass: "sr-only",
36+
wrapper: ['<div class="header-wrapper">', '</div>'],
2937
}),
3038
})
31-
.use(require('markdown-it-bracketed-spans'))
32-
.use(require('markdown-it-attrs'), {
33-
leftDelimiter: '{',
34-
rightDelimiter: '}',
39+
.use(bracketedSpans)
40+
.use(attrs, {
41+
leftDelimiter: "{",
42+
rightDelimiter: "}",
3543
allowedAttributes: [],
3644
})
37-
.use(require('markdown-it-table-of-contents'), {
45+
.use(toc, {
3846
includeLevel: [1, 2, 3],
3947
containerHeaderHtml: `<div class="toc-container-header">Table of Contents</div>`,
4048
})
41-
.use(require('markdown-it-mark'))
42-
43-
eleventyConfig.setLibrary('md', markdownIt)
49+
.use(mark)
4450

45-
const isDevelopment = process.env.NODE_ENV === 'development';
46-
eleventyConfig.addGlobalData("isDevelopment", isDevelopment);
51+
eleventyConfig.setLibrary("md", markdownItConfig)
52+
eleventyConfig.addGlobalData("isDevelopment", isDevelopment)
4753

48-
eleventyConfig.addPlugin(pluginRss, {
54+
eleventyConfig.addPlugin(rssPlugin, {
4955
posthtmlRenderOptions: {
50-
closingSingleTag: 'default',
56+
closingSingleTag: "default",
5157
},
5258
})
5359

54-
eleventyConfig.addPassthroughCopy('src/assets/*.pdf')
55-
eleventyConfig.addPassthroughCopy({ 'src/assets/js/*': 'js' })
56-
eleventyConfig.addPassthroughCopy({ 'src/assets/images': 'images' })
57-
58-
eleventyConfig.addPassthroughCopy('src/admin/*')
59-
eleventyConfig.addPassthroughCopy('settings.json')
60-
eleventyConfig.addPassthroughCopy('src/robots.txt')
60+
eleventyConfig.addPassthroughCopy({
61+
"src/assets/*.pdf": "assets",
62+
"src/assets/images": "images",
63+
"src/assets/js/*": "js",
64+
"src/admin/*": "admin",
65+
"settings.json": "settings.json",
66+
"src/robots.txt": "robots.txt"
67+
})
6168

62-
eleventyConfig.addFilter('postDate', (dateObj) => {
63-
if (typeof (dateObj) !== 'object') dateObj = new Date(dateObj)
69+
eleventyConfig.addFilter("postDate", (dateObj) => {
70+
if (typeof dateObj !== "object") dateObj = new Date(dateObj)
6471
return DateTime.fromJSDate(dateObj).toLocaleString(DateTime.DATE_MED)
6572
})
6673

67-
eleventyConfig.addFilter('reverseGroupedPosts', (object) => {
68-
return Object.entries(object).sort((a, b) => b[0] - a[0])
69-
})
74+
eleventyConfig.addFilter("reverseGroupedPosts", (object) =>
75+
Object.entries(object).sort((a, b) => b[0] - a[0])
76+
)
7077

71-
eleventyConfig.addFilter('htmlDateString', (dateObj) => {
78+
eleventyConfig.addFilter("htmlDateString", (dateObj) => {
7279
let date = new Date(dateObj)
7380
return date.toISOString()
7481
})
7582

76-
eleventyConfig.addFilter('postYear', (dateObj) => {
77-
return DateTime.fromJSDate(dateObj).toLocaleString({ year: 'numeric' })
83+
eleventyConfig.addFilter("postYear", (dateObj) => {
84+
return DateTime.fromJSDate(dateObj).toLocaleString({ year: "numeric" })
7885
})
7986

80-
eleventyConfig.addFilter('sliceRecent', (array) => {
87+
eleventyConfig.addFilter("sliceRecent", (array) => {
8188
return array.slice(0, 3)
8289
})
8390

84-
eleventyConfig.addFilter('trimText', (string) => {
85-
return string.split(' ').splice(0, 12).join(' ')
91+
eleventyConfig.addFilter("trimText", (string) => {
92+
return string.split(" ").splice(0, 12).join(" ")
8693
})
8794

88-
eleventyConfig.addFilter('cutText', (string, size) => {
89-
return string.split('-').splice(0, size).join('-')
95+
eleventyConfig.addFilter("cutText", (string, size) => {
96+
return string.split("-").splice(0, size).join("-")
9097
})
9198

92-
eleventyConfig.addFilter('serializeTitle', (string, yearSplice = 2) => {
93-
const titleParts = string.split('-')
99+
eleventyConfig.addFilter("serializeTitle", (string, yearSplice = 2) => {
100+
const titleParts = string.split("-")
94101
const [year, ...title] = titleParts
95-
const titleInitials = title.map(title => title.split('')[0]).join('')
102+
const titleInitials = title.map((title) => title.split("")[0]).join("")
96103
const yearSuffix = year.slice(-yearSplice)
97104

98105
return `${yearSuffix}-${titleInitials}`
99106
})
100107

101108
eleventyConfig.addFilter("development", (link) => {
102-
return isDevelopment ? "/" : link;
103-
});
109+
return isDevelopment ? "/" : link
110+
})
104111

105-
eleventyConfig.addFilter('breakLine', (string, cutAt = 3, maxSize = 30) => {
106-
const titleWords = string.split(' ')
112+
eleventyConfig.addFilter("breakLine", (string, cutAt = 3, maxSize = 30) => {
113+
const titleWords = string.split(" ")
107114
const titleLength = string.length
108115
const titlePreview = titleWords.slice(0, cutAt).join(" ")
109116
const titleRemaining = titleWords.slice(cutAt).join(" ")
110117

111118
const hasTitleRemaining = !!titleRemaining
112-
const formattedTitleWithBreak = hasTitleRemaining ? `${titlePreview}<br/>${titleRemaining}` : titlePreview
119+
const formattedTitleWithBreak = hasTitleRemaining
120+
? `${titlePreview}<br/>${titleRemaining}`
121+
: titlePreview
113122

114-
const returnTitle = titleLength <= maxSize || !hasTitleRemaining ? string : formattedTitleWithBreak
115-
return returnTitle
123+
return titleLength <= maxSize || !hasTitleRemaining
124+
? string
125+
: formattedTitleWithBreak
116126
})
117127

118-
eleventyConfig.addFilter('svg', (fileName, index) => {
119-
const filePath = path.join(__dirname, "src/assets/svg", fileName);
128+
eleventyConfig.addFilter("svg", (fileName, index) => {
129+
const filePath = path.join(process.cwd(), "src/assets/svg", fileName)
120130
try {
121-
let svgContent = fs.readFileSync(filePath, "utf8");
131+
let svgContent = fs.readFileSync(filePath, "utf8")
122132
if (index) {
123-
svgContent = svgContent.replace("<svg", `<svg data-animation="fade-in" data-delay=${index}`);
133+
svgContent = svgContent.replace(
134+
"<svg",
135+
`<svg data-animation="fade-in" data-delay=${index}`
136+
)
124137
}
125-
return svgContent;
138+
return svgContent
126139
} catch (error) {
127-
return `<!-- SVG ${fileName} not found -->`;
140+
return `<!-- SVG ${fileName} not found -->`
128141
}
129-
});
142+
})
130143

131-
eleventyConfig.addFilter('renderMarkdown', (text) => {
132-
return markdownIt.render(text)
144+
eleventyConfig.addFilter("renderMarkdown", (text) => {
145+
return markdownItConfig.render(text)
133146
})
134147

135-
eleventyConfig.addFilter('renderMarkdownInline', (text) => {
136-
return markdownIt.renderInline(text)
148+
eleventyConfig.addFilter("renderMarkdownInline", (text) => {
149+
return markdownItConfig.renderInline(text)
137150
})
138151

139-
eleventyConfig.addFilter('featuredDate', (string) => {
152+
eleventyConfig.addFilter("featuredDate", (string) => {
140153
let date = new Date(string)
141-
return date.toLocaleDateString('en-us', {
142-
year: 'numeric',
143-
month: 'short',
144-
day: 'numeric',
154+
return date.toLocaleDateString("en-us", {
155+
year: "numeric",
156+
month: "short",
157+
day: "numeric",
145158
})
146159
})
147160

148161
return {
149-
templateFormats: ['md', 'njk', 'html', 'liquid'],
150-
151-
markdownTemplateEngine: 'liquid',
152-
htmlTemplateEngine: 'njk',
153-
dataTemplateEngine: 'njk',
162+
templateFormats: ["md", "njk", "html", "liquid"],
163+
markdownTemplateEngine: "liquid",
164+
htmlTemplateEngine: "njk",
165+
dataTemplateEngine: "njk",
154166
dir: {
155-
data: '_data',
156-
input: 'src',
157-
output: 'public',
167+
data: "_data",
168+
input: "src",
169+
output: "public",
158170
},
159171
}
160-
}
172+
}

0 commit comments

Comments
 (0)