From 4b3d46ab988d7313a5ef7744c12833bb8636ba8d Mon Sep 17 00:00:00 2001 From: Grant Hutchinson Date: Thu, 12 Nov 2020 21:02:16 -0500 Subject: [PATCH] Rfc/issue 185 Transforms API (pt. 1) (#422) * basic unbundled rendering of home page * got livereload working for all files * JSON support * import CSS support * disable eslint complexity * header working * ading banner and stylinh and fixed binary image loading * integrated evergreen deps * fully restored the home page in develop mode * wip getting serialization working * wip getting serialization working * clean up and refactor, serialize WIP * upgrade puppeteer to latest * a bit hacky but home page is now being built for production * render header navigation from graph * page template working for site in development * all pages working in develop * all pages serializing for prod * sort header and shelf * shelf expansion and table of contents * label fallback handling * fix index page rendering * clean up logging * favicon support * refactor server lifecycle to use compilation and expose devServer * built in serve command * serve docs * add support for app templates * pretty URLs * shelf working WIP * quick styling tweak for side nav * copy assets and graph.json in copy lifecycle * basic support for css files * fix copy error for nested folders * call rollup from JS API * rollup configuration sourced from compilation * make sure to await Promise.all * Rfc/issue 355 organize serve lifecycle (#419) * task: organize serve * fix: remove ctx from resolve * fix: refactor further * task: scope filters by file * linting * renable default tests and limited smoke tests * disable all tests enable subset of tests * task: add custom transforms API from koa context * fix: remove redundant line * fix: more descriptive var * meta specs * fix: merge conflict * enable custom title case * enable custom workspace spec * track missing dev dep * enabled workspace assets test case * fix link closing slash * content-outlet refactor * enabled getting started test case * enable nested directory test case * enable app template case * enable page template spec * enable user directory mapping case * update comments * task: standardize transforms * fix: prod render * task: adding disabled markdown transform * fix: cleanup class names * fix: cleanup class names * got code markdown rendering and added support for custom plugins from config * markdown plugins working including prism * default markdown specs * enable all tests * rename markdown case * syntax highlighting markdown spec * fix: transform fixes * task: add markdown and json transforms * fix: header rendering, comment out eve-container temp * fix: cleanup * fix: remove node_module seperate transform, instead use js/css with path resolver * task: remove old transforms * fix: immutability of compilation object * fix: tests, page-templates, defaults * fix: cleanup * fix: remove outdated transforms Co-authored-by: Owen Buckley --- packages/cli/src/lifecycles/serve.js | 59 ++-- packages/cli/src/templates/app.html | 15 + packages/cli/src/transforms/css.transform.js | 34 --- packages/cli/src/transforms/html.transform.js | 268 ------------------ .../cli/src/transforms/images.transform.js | 42 --- packages/cli/src/transforms/js.transform.js | 19 -- packages/cli/src/transforms/json.transform.js | 31 -- .../src/transforms/node-modules.transform.js | 22 -- .../cli/src/transforms/transform.assets.js | 59 ++++ packages/cli/src/transforms/transform.css.js | 47 +++ packages/cli/src/transforms/transform.html.js | 50 ++++ .../cli/src/transforms/transform.interface.js | 24 ++ packages/cli/src/transforms/transform.js.js | 38 +++ packages/cli/src/transforms/transform.json.js | 45 +++ packages/cli/src/transforms/transform.md.js | 107 +++++++ .../cli/src/transforms/transform.tools.js | 183 ++++++++++++ .../cases/build.default/build.default.spec.js | 2 +- www/components/header/header.js | 1 - 18 files changed, 611 insertions(+), 435 deletions(-) create mode 100644 packages/cli/src/templates/app.html delete mode 100644 packages/cli/src/transforms/css.transform.js delete mode 100644 packages/cli/src/transforms/html.transform.js delete mode 100644 packages/cli/src/transforms/images.transform.js delete mode 100644 packages/cli/src/transforms/js.transform.js delete mode 100644 packages/cli/src/transforms/json.transform.js delete mode 100644 packages/cli/src/transforms/node-modules.transform.js create mode 100644 packages/cli/src/transforms/transform.assets.js create mode 100644 packages/cli/src/transforms/transform.css.js create mode 100644 packages/cli/src/transforms/transform.html.js create mode 100644 packages/cli/src/transforms/transform.interface.js create mode 100644 packages/cli/src/transforms/transform.js.js create mode 100644 packages/cli/src/transforms/transform.json.js create mode 100644 packages/cli/src/transforms/transform.md.js create mode 100644 packages/cli/src/transforms/transform.tools.js diff --git a/packages/cli/src/lifecycles/serve.js b/packages/cli/src/lifecycles/serve.js index 4bb24f0f0..47dabeb84 100644 --- a/packages/cli/src/lifecycles/serve.js +++ b/packages/cli/src/lifecycles/serve.js @@ -4,30 +4,55 @@ const { promises: fsp } = require('fs'); const path = require('path'); const Koa = require('koa'); -const filterHTML = require('../transforms/html.transform'); -const filterModule = require('../transforms/node-modules.transform'); -const filterCSS = require('../transforms/css.transform'); -const filterJavascript = require('../transforms/js.transform'); -const filterJSON = require('../transforms/json.transform'); -const filterImages = require('../transforms/images.transform'); +const Transform = require('../transforms/transform.interface'); +const HTMLTransform = require('../transforms/transform.html'); +const MarkdownTransform = require('../transforms/transform.md'); +const CSSTransform = require('../transforms/transform.css'); +const JSTransform = require('../transforms/transform.js'); +const JSONTransform = require('../transforms/transform.json.js'); +const AssetTransform = require('../transforms/transform.assets'); function getDevServer(compilation) { const app = new Koa(); - // TODO use url.endsWith!! - // eslint-disable-next-line no-unused-vars app.use(async ctx => { - // console.debug('URL', ctx.request.url); - const { config, context } = compilation; - const { userWorkspace } = context; + let response = { + body: '', + contentType: '', + extension: '' + }; + + request = { + header: ctx.request.header, + url: ctx.request.url, + compilation: { ...compilation } + }; try { - await filterHTML(ctx, config, userWorkspace); - await filterModule(ctx); - await filterJSON(ctx, context); - await filterJavascript(ctx, userWorkspace); - await filterCSS(ctx, userWorkspace); - await filterImages(ctx, userWorkspace); + // default transforms + const defaultTransforms = [ + new HTMLTransform(request), + new MarkdownTransform(request), + new CSSTransform(request), + new JSTransform(request), + new JSONTransform(request), + new AssetTransform(request) + ]; + + // walk through all transforms + await Promise.all(defaultTransforms.map(async (plugin) => { + if (plugin instanceof Transform && plugin.shouldTransform()) { + + const transformedResponse = await plugin.applyTransform(); + + response = { + ...transformedResponse + }; + } + })); + + ctx.set('Content-Type', `${response.contentType}`); + ctx.body = response.body; } catch (err) { console.log(err); } diff --git a/packages/cli/src/templates/app.html b/packages/cli/src/templates/app.html new file mode 100644 index 000000000..9c4b24a55 --- /dev/null +++ b/packages/cli/src/templates/app.html @@ -0,0 +1,15 @@ + + + + + + + + + +
+

Welcome to my website!

+ +
+ + \ No newline at end of file diff --git a/packages/cli/src/transforms/css.transform.js b/packages/cli/src/transforms/css.transform.js deleted file mode 100644 index 94b352d21..000000000 --- a/packages/cli/src/transforms/css.transform.js +++ /dev/null @@ -1,34 +0,0 @@ -const path = require('path'); -const { promises: fsp } = require('fs'); - -module.exports = filterStyles = async (ctx, userWorkspace) => { - return new Promise(async (resolve, reject) => { - try { - if (ctx.request.url.indexOf('.css') >= 0) { - const destHeader = ctx.request.header['sec-fetch-dest']; - const cssPath = ctx.request.url.indexOf('/node_modules') >= 0 - ? path.join(process.cwd(), ctx.request.url) - : path.join(userWorkspace, ctx.request.url); - const css = await fsp.readFile(cssPath, 'utf-8'); - - //