UNPKG

aem-optimized

Version:

Spins up a dedicated server that pulls host page and replaces clientlibs with locals

136 lines (122 loc) 4.13 kB
const express = require('express'); const jsdom = require('jsdom'); const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); const vite = require('vite'); const { createServer } = vite; const { JSDOM } = jsdom; async function init(url, host, clientlibs, entry, headers, wcmmode) { // fetch with basic auth admin:admin let page; const fetchUrl = wcmmode ? `${host}${url}?wcmmode=${wcmmode}` : `${host}${url}`; try { page = await ( await fetch(fetchUrl, { headers, referrer: `${host}`, }) ).text(); } catch (e) { console.error(e); return; } const dom = new JSDOM(page); [...dom.window.document.querySelectorAll('script')].forEach((script) => { if (script.src.startsWith('/etc.clientlibs')) { for (const clientlib of clientlibs) { if (script.src.includes(clientlib)) { script.remove(); } } script.src = `${host}${script.src}`; } }); [...dom.window.document.querySelectorAll('link')].forEach((link) => { if (link.href.startsWith('/etc.clientlibs')) { for (const clientlib of clientlibs) { if (link.href.includes(clientlib)) { link.remove(); } } link.href = `${host}${link.href}`; } }); // const loadScript = dom.window.document.createElement('script'); // loadScript.setAttribute('type', 'text/javascript'); // loadScript.setAttribute('entry', entry); // loadScript.setAttribute('id', 'loadScript'); // loadScript.innerHTML = `if(!window.CQ?.Siteadmin) { // const script = document.createElement('script'); // script.setAttribute('type', 'module'); // script.setAttribute('src', document.querySelector('#loadScript').getAttribute('entry')); // const div = document.createElement('div'); // div.setAttribute('id', 'root'); // div.setAttribute('class', 'app'); // document.body.appendChild(div); // document.body.appendChild(script); // }`; // dom.window.document.body.appendChild(loadScript); // if (!globalThis['CQ']?.Siteadmin) { // const script = dom.window.document.createElement('script'); // script.setAttribute('type', 'module'); // script.setAttribute('src', entry); // const div = dom.window.document.createElement('div'); // div.setAttribute('id', 'root'); // div.setAttribute('class', 'app'); // dom.window.document.body.appendChild(div); // dom.window.document.body.appendChild(script); // } const script = dom.window.document.createElement('script'); script.setAttribute('type', 'module'); script.setAttribute('src', entry); const div = dom.window.document.createElement('div'); div.setAttribute('id', 'root'); div.setAttribute('class', 'app'); dom.window.document.body.appendChild(div); dom.window.document.body.appendChild(script); return dom.serialize(); } async function createMyServer( host, clientlibs, port, entry, headers, wcmmode = null ) { const app = express(); // Create Vite server in middleware mode. This disables Vite's own HTML // serving logic and let the parent server take control. // // In middleware mode, if you want to use Vite's own HTML serving logic // use `'html'` as the `middlewareMode` (ref https://vitejs.dev/config/#server-middlewaremode) const vite = await createServer({ server: { middlewareMode: 'ssr' }, }); // use vite's connect instance as middleware app.use(vite.middlewares); app.use(async function (req, res, next) { const url = req.originalUrl; const reg = new RegExp(/.*(\/|\.html|\.html\/.*|\.html\?.*)$/i); if (req.url === '/' || reg.test(req.url)) { const page = await init( req.url, host, clientlibs, entry, headers, wcmmode ); const template = await vite.transformIndexHtml(url, page); res.send(template.replace('<!-- APP -->', page)); } next(); }); app.listen(port, () => { console.log(`Server listening http://localhost:${port}`); }); } // const createMyServer = () => {}; export default createMyServer;