11const fs = require ( 'fs' ) ;
2+ const path = require ( 'path' ) ;
23
34// Plugins
45const eleventyNavigationPlugin = require ( '@11ty/eleventy-navigation' ) ;
5- const build = require ( './src/_data/build' ) ;
6+ const build = require ( './src/_data/build' ) || { } ;
67const i18n = require ( 'eleventy-plugin-i18n' ) ;
78const markdownIt = require ( 'markdown-it' ) ;
89const markdownItAnchor = require ( 'markdown-it-anchor' ) ;
910const sitemap = require ( '@quasibit/eleventy-plugin-sitemap' ) ;
1011const translations = require ( './src/_data/i18n' ) ;
1112
1213module . exports = function ( eleventyConfig ) {
13- console . log ( process . env . NODE_ENV ) ;
14+ console . log ( `Running in environment: ${ process . env . NODE_ENV || 'development' } ` ) ;
1415
1516 // Hot-reload site on CSS changes
1617 eleventyConfig . addWatchTarget ( 'src/css' ) ;
1718 eleventyConfig . addWatchTarget ( 'src/_11ty' ) ;
1819
20+ // Helper function to check if a file exists before requiring it
21+ const requireIfExists = filePath => {
22+ if ( ! fs . existsSync ( filePath ) ) {
23+ console . warn ( `Missing file: ${ filePath } ` ) ;
24+ }
25+ return fs . existsSync ( filePath ) ? require ( filePath ) : ( ) => { } ;
26+ } ;
27+
1928 // Collections
20- const collectionsDir = ` ./src/_11ty/collections` ;
21- eleventyConfig . addCollection ( 'primary' , require ( `${ collectionsDir } /primary.js` ) ) ;
22- eleventyConfig . addCollection ( 'sitemap' , require ( `${ collectionsDir } /sitemap.js` ) ) ;
29+ const collectionsDir = ' ./src/_11ty/collections' ;
30+ eleventyConfig . addCollection ( 'primary' , requireIfExists ( `${ collectionsDir } /primary.js` ) ) ;
31+ eleventyConfig . addCollection ( 'sitemap' , requireIfExists ( `${ collectionsDir } /sitemap.js` ) ) ;
2332
2433 // Filters
25- const filtersDir = `./src/_11ty/filters` ;
26- eleventyConfig . addFilter ( 'chunkByYear' , require ( `${ filtersDir } /chunkByYear.js` ) ) ;
27- eleventyConfig . addFilter ( 'cleanCardContent' , require ( `${ filtersDir } /cleanCardContent.js` ) ) ;
28- eleventyConfig . addFilter ( 'cleanSearchRaw' , require ( `${ filtersDir } /cleanSearchRaw.js` ) ) ;
29- eleventyConfig . addFilter ( 'endsWith' , require ( `${ filtersDir } /endsWith.js` ) ) ;
30- eleventyConfig . addFilter ( 'formatDate' , require ( `${ filtersDir } /formatDate.js` ) ) ;
31- eleventyConfig . addFilter ( 'formatDateRange' , require ( `${ filtersDir } /formatDateRange.js` ) ) ;
32- eleventyConfig . addFilter ( 'getArticleType' , require ( `${ filtersDir } /getArticleType.js` ) ) ;
33- eleventyConfig . addFilter ( 'getCollectionByTag' , require ( `${ filtersDir } /getCollectionByTag.js` ) ) ;
34- eleventyConfig . addFilter ( 'getCollectionTags' , require ( `${ filtersDir } /getCollectionTags.js` ) ) ;
35- eleventyConfig . addFilter ( 'getItems' , require ( `${ filtersDir } /getItems.js` ) ) ;
36- eleventyConfig . addFilter ( 'getItemsByLocale' , require ( `${ filtersDir } /getItemsByLocale.js` ) ) ;
37- eleventyConfig . addFilter ( 'getItemsInFuture' , require ( `${ filtersDir } /getItemsInFuture.js` ) ) ;
38- eleventyConfig . addFilter ( 'getItemsInPast' , require ( `${ filtersDir } /getItemsInPast.js` ) ) ;
39- eleventyConfig . addFilter ( 'getJobs' , require ( `${ filtersDir } /getJobs.js` ) ) ;
40- eleventyConfig . addFilter ( 'getSingleDigitFromDate' , require ( `${ filtersDir } /getSingleDigitFromDate.js` ) ) ;
41- eleventyConfig . addFilter ( 'isInFuture' , require ( `${ filtersDir } /isInFuture.js` ) ) ;
42- eleventyConfig . addFilter ( 'objectValues' , require ( `${ filtersDir } /objectValues.js` ) ) ;
43- eleventyConfig . addFilter ( 'randomize' , require ( `${ filtersDir } /randomize.js` ) ) ;
44- eleventyConfig . addFilter ( 'removeHtml' , require ( `${ filtersDir } /removeHtml.js` ) ) ;
45- eleventyConfig . addFilter ( 'removeTags' , require ( `${ filtersDir } /removeTags.js` ) ) ;
46- eleventyConfig . addFilter ( 'startsWith' , require ( `${ filtersDir } /startsWith.js` ) ) ;
47- eleventyConfig . addFilter ( 'truncate' , require ( `${ filtersDir } /truncate.js` ) ) ;
48-
49- // Layout aliases — TBC if this is bringing enough benefit
50- eleventyConfig . addLayoutAlias ( 'base' , 'layouts/_base.njk' ) ;
51- eleventyConfig . addLayoutAlias ( 'blog-post' , 'layouts/blog-post.njk' ) ;
52- eleventyConfig . addLayoutAlias ( 'case-study' , 'layouts/case-study.njk' ) ;
53- eleventyConfig . addLayoutAlias ( 'content' , 'layouts/content.njk' ) ;
54- eleventyConfig . addLayoutAlias ( 'content-simple' , 'layouts/content-simple.njk' ) ;
55- eleventyConfig . addLayoutAlias ( 'content-support' , 'layouts/content-support.njk' ) ;
56- eleventyConfig . addLayoutAlias ( 'event' , 'layouts/event.njk' ) ;
57- eleventyConfig . addLayoutAlias ( 'home' , 'layouts/home.njk' ) ;
58- eleventyConfig . addLayoutAlias ( 'press-release' , 'layouts/press-release.njk' ) ;
59- eleventyConfig . addLayoutAlias ( 'hub-community' , 'layouts/hub-community.njk' ) ;
60- eleventyConfig . addLayoutAlias ( 'hub-developers' , 'layouts/hub-developers.njk' ) ;
61- eleventyConfig . addLayoutAlias ( 'hub-discover' , 'layouts/hub-discover.njk' ) ;
62- eleventyConfig . addLayoutAlias ( 'hub-foundation' , 'layouts/hub-foundation.njk' ) ;
63- eleventyConfig . addLayoutAlias ( 'hub-news' , 'layouts/hub-news.njk' ) ;
64- eleventyConfig . addLayoutAlias ( 'hub-users' , 'layouts/hub-users.njk' ) ;
65- eleventyConfig . addLayoutAlias ( 'listing-blog-posts' , 'layouts/listing-blog-posts.njk' ) ;
66- eleventyConfig . addLayoutAlias ( 'listing-blog-post-categories' , 'layouts/listing-blog-post-categories.njk' ) ;
67- eleventyConfig . addLayoutAlias ( 'listing-blog-search' , 'layouts/listing-blog-search.njk' ) ;
68- eleventyConfig . addLayoutAlias ( 'listing-case-studies' , 'layouts/listing-case-studies.njk' ) ;
69- eleventyConfig . addLayoutAlias ( 'listing-case-study-categories' , 'layouts/listing-case-study-categories.njk' ) ;
70- eleventyConfig . addLayoutAlias ( 'listing-events' , 'layouts/listing-events.njk' ) ;
71- eleventyConfig . addLayoutAlias ( 'listing-event-categories' , 'layouts/listing-event-categories.njk' ) ;
72- eleventyConfig . addLayoutAlias ( 'listing-planet-ceph-articles' , 'layouts/listing-planet-ceph-articles.njk' ) ;
73- eleventyConfig . addLayoutAlias ( 'listing-press-releases' , 'layouts/listing-press-releases.njk' ) ;
74- eleventyConfig . addLayoutAlias ( 'listing-press-release-categories' , 'layouts/listing-press-release-categories.njk' ) ;
75- eleventyConfig . addLayoutAlias ( 'navigation' , 'layouts/navigation.njk' ) ;
34+ const filtersDir = './src/_11ty/filters' ;
35+ const filterFiles = [
36+ 'chunkByYear' ,
37+ 'cleanCardContent' ,
38+ 'cleanSearchRaw' ,
39+ 'endsWith' ,
40+ 'formatDate' ,
41+ 'formatDateRange' ,
42+ 'getArticleType' ,
43+ 'getCollectionByTag' ,
44+ 'getCollectionTags' ,
45+ 'getItems' ,
46+ 'getItemsByLocale' ,
47+ 'getItemsInFuture' ,
48+ 'getItemsInPast' ,
49+ 'getJobs' ,
50+ 'getSingleDigitFromDate' ,
51+ 'isInFuture' ,
52+ 'objectValues' ,
53+ 'randomize' ,
54+ 'removeHtml' ,
55+ 'removeTags' ,
56+ 'startsWith' ,
57+ 'truncate' ,
58+ ] ;
59+
60+ filterFiles . forEach ( filter => {
61+ eleventyConfig . addFilter ( filter , requireIfExists ( `${ filtersDir } /${ filter } .js` ) ) ;
62+ } ) ;
63+
64+ // Layout aliases
65+ const layoutAliases = {
66+ base : 'layouts/_base.njk' ,
67+ 'blog-post' : 'layouts/blog-post.njk' ,
68+ 'case-study' : 'layouts/case-study.njk' ,
69+ content : 'layouts/content.njk' ,
70+ 'content-simple' : 'layouts/content-simple.njk' ,
71+ 'content-support' : 'layouts/content-support.njk' ,
72+ event : 'layouts/event.njk' ,
73+ home : 'layouts/home.njk' ,
74+ 'press-release' : 'layouts/press-release.njk' ,
75+ 'hub-community' : 'layouts/hub-community.njk' ,
76+ 'hub-developers' : 'layouts/hub-developers.njk' ,
77+ 'hub-discover' : 'layouts/hub-discover.njk' ,
78+ 'hub-foundation' : 'layouts/hub-foundation.njk' ,
79+ 'hub-news' : 'layouts/hub-news.njk' ,
80+ 'hub-users' : 'layouts/hub-users.njk' ,
81+ 'listing-blog-posts' : 'layouts/listing-blog-posts.njk' ,
82+ 'listing-blog-post-categories' : 'layouts/listing-blog-post-categories.njk' ,
83+ 'listing-blog-search' : 'layouts/listing-blog-search.njk' ,
84+ 'listing-case-studies' : 'layouts/listing-case-studies.njk' ,
85+ 'listing-case-study-categories' : 'layouts/listing-case-study-categories.njk' ,
86+ 'listing-events' : 'layouts/listing-events.njk' ,
87+ 'listing-event-categories' : 'layouts/listing-event-categories.njk' ,
88+ 'listing-planet-ceph-articles' : 'layouts/listing-planet-ceph-articles.njk' ,
89+ 'listing-press-releases' : 'layouts/listing-press-releases.njk' ,
90+ 'listing-press-release-categories' : 'layouts/listing-press-release-categories.njk' ,
91+ navigation : 'layouts/navigation.njk' ,
92+ } ;
93+
94+ Object . entries ( layoutAliases ) . forEach ( ( [ alias , layoutPath ] ) => {
95+ const fullPath = path . join ( __dirname , 'src/_includes' , layoutPath ) ;
96+ if ( ! fs . existsSync ( fullPath ) ) {
97+ console . error ( `Missing layout: ${ layoutPath } ` ) ;
98+ }
99+ eleventyConfig . addLayoutAlias ( alias , layoutPath ) ;
100+ } ) ;
76101
77102 // Shortcodes
78- const shortcodesDir = ` ./src/_11ty/shortcodes` ;
79- eleventyConfig . addShortcode ( 'ArticleCard' , require ( `${ shortcodesDir } /ArticleCard.js` ) ) ;
80- eleventyConfig . addShortcode ( 'YouTube' , require ( `${ shortcodesDir } /YouTube.js` ) ) ;
103+ const shortcodesDir = ' ./src/_11ty/shortcodes' ;
104+ eleventyConfig . addShortcode ( 'ArticleCard' , requireIfExists ( `${ shortcodesDir } /ArticleCard.js` ) ) ;
105+ eleventyConfig . addShortcode ( 'YouTube' , requireIfExists ( `${ shortcodesDir } /YouTube.js` ) ) ;
81106
82107 // Transforms
83- const transformsDir = ` ./src/_11ty/transforms` ;
84- eleventyConfig . addTransform ( 'htmlmin' , require ( `${ transformsDir } /html-minifier.js` ) ) ;
108+ const transformsDir = ' ./src/_11ty/transforms' ;
109+ eleventyConfig . addTransform ( 'htmlmin' , requireIfExists ( `${ transformsDir } /html-minifier.js` ) ) ;
85110
86111 // Passthrough copy
87112 eleventyConfig . addPassthroughCopy ( './src/assets/**/*.json' ) ;
@@ -97,57 +122,60 @@ module.exports = function (eleventyConfig) {
97122 } ) ;
98123 eleventyConfig . addPlugin ( sitemap , {
99124 sitemap : {
100- hostname : build . isProduction ? 'https://ceph.io' : 'https://develop.ceph.io' ,
125+ hostname : build && build . isProduction ? 'https://ceph.io' : 'https://develop.ceph.io' ,
101126 } ,
102127 } ) ;
128+
103129 // Markdown overrides
104130 let markdownLibrary = markdownIt ( {
105131 html : true ,
106132 linkify : true ,
107133 } ) . use ( markdownItAnchor , {
108134 level : [ 2 , 3 , 4 , 5 , 6 ] ,
109135 permalink : true ,
110- permalinkClass : 'link-anchor' ,
111- permalinkSymbol : '¶' ,
136+ permalinkClass : 'direct-link' ,
137+ permalinkSymbol : '🔗' ,
138+ space : true ,
112139 } ) ;
113140
114141 eleventyConfig . setLibrary ( 'md' , markdownLibrary ) ;
115142
116143 // Run after the build ends
117144 eleventyConfig . on ( 'afterBuild' , ( ) => {
118- require ( './scripts/search-index.js' ) ;
145+ const searchIndexPath = './scripts/search-index.js' ;
146+ if ( fs . existsSync ( searchIndexPath ) ) {
147+ require ( searchIndexPath ) ;
148+ } else {
149+ console . warn ( 'Warning: search-index.js not found, skipping post-build task.' ) ;
150+ }
119151 } ) ;
120152
121153 eleventyConfig . setServerOptions ( {
122- // Swapping back to Browsersync
123- // See https://www.11ty.dev/docs/dev-server/#swap-back-to-browsersync
124154 module : '@11ty/eleventy-server-browsersync' ,
125155 callbacks : {
126156 ready : function ( err , bs ) {
127157 bs . addMiddleware ( '*' , ( req , res ) => {
128- // Dev mode redirect for root path to default language
129158 if ( req . url === '/' ) {
130- res . writeHead ( 302 , {
131- location : '/en/' ,
132- } ) ;
159+ res . writeHead ( 302 , { location : '/en/' } ) ;
133160 res . end ( ) ;
161+ } else {
162+ const errorPagePath = path . join ( __dirname , 'src/en/404.html' ) ;
163+ if ( fs . existsSync ( errorPagePath ) ) {
164+ const content_404 = fs . readFileSync ( errorPagePath ) ;
165+ res . writeHead ( 404 ) ;
166+ res . end ( content_404 ) ;
167+ } else {
168+ res . writeHead ( 404 , { 'Content-Type' : 'text/plain' } ) ;
169+ res . end ( '404 Not Found' ) ;
170+ }
134171 }
135-
136- // 404 on --serve
137- // https://www.11ty.dev/docs/quicktips/not-found/#with-serve
138- const content_404 = fs . readFileSync ( 'dist/en/404.html' ) ;
139- res . write ( content_404 ) ;
140- res . writeHead ( 404 ) ;
141- res . end ( ) ;
142172 } ) ;
143173 } ,
144174 } ,
145175 } ) ;
146176
147177 // Configuration
148178 eleventyConfig . setDataDeepMerge ( true ) ;
149- // TBC if this is a bit heavy-handed
150- // See https://www.11ty.dev/docs/data-deep-merge/
151179
152180 return {
153181 htmlTemplateEngine : 'njk' ,
0 commit comments