diff --git a/docs/.eleventy.js b/docs/.eleventy.js index 29d755be3..c75fdf019 100644 --- a/docs/.eleventy.js +++ b/docs/.eleventy.js @@ -9,6 +9,7 @@ import { removeDataAlphaElements } from './_utils/remove-data-alpha-elements.js' // import { formatCodePlugin } from './_utils/format-code.js'; import litPlugin from '@lit-labs/eleventy-plugin-lit'; import { readFile } from 'fs/promises'; +import nunjucks from 'nunjucks'; import componentList from './_data/componentList.js'; import * as filters from './_utils/filters.js'; import { outlinePlugin } from './_utils/outline.js'; @@ -40,6 +41,11 @@ const passThroughExtensions = ['js', 'css', 'png', 'svg', 'jpg', 'mp4']; const passThrough = [...passThroughExtensions.map(ext => 'docs/**/*.' + ext)]; export default function (eleventyConfig) { + /** + * This is the guard we use for now to make sure our final built files dont need a 2nd pass by the server. This keeps us able to still deploy the bare HTML files on Vercel until the app is ready. + */ + const serverBuild = process.env.WEBAWESOME_SERVER === 'true'; + // NOTE - alpha setting removes certain pages if (isAlpha) { eleventyConfig.ignores.add('**/experimental/**'); @@ -68,9 +74,35 @@ export default function (eleventyConfig) { return `https://early.webawesome.com/webawesome@${packageData.version}/dist/` + (location || '').replace(/^\//, ''); }); - // Turns `{% server_variable "foo" %} into `{{ server.foo | safe }}` + // Turns `{% server "foo" %} into `{{ server.foo | safe }}` when the WEBAWESOME_SERVER variable is set to "true" eleventyConfig.addShortcode('server', function (property) { - return `{{ server.${property} | safe }}`; + if (serverBuild) { + return `{{ server.${property} | safe }}`; + } + + return ''; + }); + + eleventyConfig.addTransform('second-nunjucks-transform', function NunjucksTransform(content) { + // For a server build, we expect a server to run the second transform. + if (serverBuild) { + return content; + } + + // Only run the transform on files nunjucks would transform. + if (!this.page.inputPath.match(/.(md|html|njk)$/)) { + return content; + } + + /** This largely mimics what an app would do and just stubs out what we don't care about. */ + return nunjucks.renderString(content, { + // Stub the server EJS shortcodes. + server: { + head: '', + loginOrAvatar: '', + flashes: '', + }, + }); }); // Paired shortcodes - {% shortCode %}content{% endShortCode %} @@ -132,30 +164,6 @@ export default function (eleventyConfig) { ]), ); - // SSR plugin - if (!isDev) { - // - // Problematic components in SSR land: - // - animation (breaks on navigation + ssr with Turbo) - // - mutation-observer (why SSR this?) - // - resize-observer (why SSR this?) - // - tooltip (why SSR this?) - // - const omittedModules = []; - const componentModules = componentList - .filter(component => !omittedModules.includes(component.tagName.split(/wa-/)[1])) - .map(component => { - const name = component.tagName.split(/wa-/)[1]; - const componentDirectory = process.env.UNBUNDLED_DIST_DIRECTORY || path.join('.', 'dist'); - return path.join(componentDirectory, 'components', name, `${name}.js`); - }); - - eleventyConfig.addPlugin(litPlugin, { - mode: 'worker', - componentModules, - }); - } - // Build the search index eleventyConfig.addPlugin( searchPlugin({ @@ -182,6 +190,31 @@ export default function (eleventyConfig) { eleventyConfig.addPassthroughCopy(glob); } + // SSR plugin + // Make sure this is the last thing, we dont want to run the risk of accidentally transforming shadow roots with the nunjucks 2nd transform. + if (!isDev) { + // + // Problematic components in SSR land: + // - animation (breaks on navigation + ssr with Turbo) + // - mutation-observer (why SSR this?) + // - resize-observer (why SSR this?) + // - tooltip (why SSR this?) + // + const omittedModules = []; + const componentModules = componentList + .filter(component => !omittedModules.includes(component.tagName.split(/wa-/)[1])) + .map(component => { + const name = component.tagName.split(/wa-/)[1]; + const componentDirectory = process.env.UNBUNDLED_DIST_DIRECTORY || path.join('.', 'dist'); + return path.join(componentDirectory, 'components', name, `${name}.js`); + }); + + eleventyConfig.addPlugin(litPlugin, { + mode: 'worker', + componentModules, + }); + } + return { markdownTemplateEngine: 'njk', dir: { diff --git a/scripts/build.js b/scripts/build.js index 31b335a96..d87c7818b 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -8,7 +8,6 @@ import { replace } from 'esbuild-plugin-replace'; import { mkdir, readFile } from 'fs/promises'; import getPort, { portNumbers } from 'get-port'; import { globby } from 'globby'; -import nunjucks from 'nunjucks'; import ora from 'ora'; import { dirname, join, relative } from 'path'; import process from 'process'; @@ -345,35 +344,6 @@ if (isDeveloping) { '/dist/': './dist-cdn/', }, }, - middleware: [ - function simulateWebawesomeApp(req, res, next) { - // Accumulator for strings so we can pass them through nunjucks a second time similar to how the webawesome-app - // will be running nunjucks twice. - const finalString = []; - const encoding = 'utf-8'; - - const _write = res.write; - res.write = function (chunk, encoding) { - finalString.push(chunk.toString()); - }; - - const _end = res.end; - res.end = function (...args) { - const transformedStr = nunjucks.renderString(finalString.join(''), { - // Stub the server EJS shortcodes. - server: { - head: '', - loginOrAvatar: '', - flashes: '', - }, - }); - _write.call(res, transformedStr, encoding); - _end.call(res, ...args); - }; - - next(); - }, - ], callbacks: { ready: (_err, instance) => { // 404 errors