UNPKG

akasharender

Version:

Rendering support for generating static HTML websites or EPUB eBooks

241 lines 26.3 kB
/** * * Copyright 2014-2025 David Herron * * This file is part of AkashaCMS (http://akashacms.com/). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { promises as fs } from 'fs'; import path from 'path'; import fastq from 'fastq'; import * as data from '../data.js'; import { documentsCache, assetsCache, layoutsCache, partialsCache } from './file-cache-sqlite.js'; async function renderVPath(config, info) { await data.remove(info.mountPoint, info.vpath); let result = await config.akasha.renderPath(config, info.vpath); console.log(result); } /** * Search for all documents that use the layout which changed, and * rerender them. Obviously this function must only be called in * the handlers for 'change' and 'add' in layouts. * * @param config * @param info */ async function renderForLayout(config, info) { const docs = await documentsCache.search({ layouts: [info.vpath] }); const queue = fastq.promise(async function (item) { try { await data.remove(item.mountPoint, item.vpath); let result = await config.akasha.renderPath(config, item.vpath); console.log(result); return "ok"; } catch (err) { throw new Error(`renderForLayout FAIL to render ${item.vpath} because ${err.stack}`); } }, 10); const waitFor = []; for (let doc of docs) { waitFor.push(queue.push(doc)); } if (waitFor.length > 0) await Promise.all(waitFor); console.log(`FINISH rendering ${waitFor.length} documents from changing template ${info.vpath}`); } async function rebuild(config) { await data.removeAll(); let results = await config.akasha.render(config); for (let result of results) { if (result.error) { console.error(result.error); } else { console.log(result.result); } } return results; } async function unlinkVPath(config, info) { if (!config.renderDestination) { // console.log(`UNLINK ${collection} could not perform unlink (no renderDestination) for `, info); return; } const renderer = config.findRendererPath(info.vpath); let renderPath; if (renderer) { renderPath = renderer.filePath(info.vpath); } else { renderPath = info.vpath; } await fs.unlink(path.join(config.renderDestination, renderPath)); console.log(`UNLINK ${renderPath}`); } export async function watchman(config) { documentsCache .on('change', async (collection, info) => { try { await renderVPath(config, info); } catch (e) { documentsCache.emit('error', { code: 'change', collection: collection, vpath: info.vpath, error: e }); } }) .on('add', async (collection, info) => { try { await renderVPath(config, info); } catch (e) { documentsCache.emit('error', { code: 'add', collection: collection, vpath: info.vpath, error: e }); } }) .on('unlink', async (collection, info) => { try { // console.log(`UNLINK ${config.renderDestination} ${info.renderPath}`); await unlinkVPath(config, info); } catch (e) { documentsCache.emit('error', { code: 'unlink', collection: collection, vpath: info.vpath, error: e }); } }); console.log('... watching documents'); assetsCache .on('change', async (collection, info) => { try { const destFN = path.join(config.renderDestination, info.renderPath); await fs.copyFile(info.fspath, destFN); console.log(`CHANGE ${info.vpath} COPY==> ${info.renderPath}`); } catch (e) { assetsCache.emit('error', { code: 'change', collection: collection, vpath: info.vpath, error: e }); } }) .on('add', async (collection, info) => { try { const destFN = path.join(config.renderDestination, info.renderPath); await fs.copyFile(info.fspath, destFN); console.log(`ADD ${info.vpath} COPY==> ${info.renderPath}`); } catch (e) { assetsCache.emit('error', { code: 'add', collection: collection, vpath: info.vpath, error: e }); } }) .on('unlink', async (collection, info) => { try { await fs.unlink(path.join(config.renderDestination, info.renderPath)); console.log(`UNLINK ${info.renderPath}`); } catch (e) { assetsCache.emit('error', { code: 'unlink', collection: collection, vpath: info.vpath, error: e }); } }); console.log('... watching assets'); layoutsCache .on('change', async (collection, info) => { try { await renderForLayout(config, info); } catch (e) { layoutsCache.emit('error', { code: 'change', collection: collection, vpath: info.vpath, error: e }); } }) .on('add', async (collection, info) => { try { await renderForLayout(config, info); } catch (e) { layoutsCache.emit('error', { code: 'add', collection: collection, vpath: info.vpath, error: e }); } }) .on('unlink', (collection, info) => { // Nothing to do }); console.log('... watching layouts'); partialsCache .on('change', async (collection, info) => { try { await rebuild(config); } catch (e) { partialsCache.emit('error', { code: 'change', collection: collection, vpath: info.vpath, error: e }); } }) .on('add', async (collection, info) => { try { await rebuild(config); } catch (e) { partialsCache.emit('error', { code: 'add', collection: collection, vpath: info.vpath, error: e }); } }) .on('unlink', (collection, info) => { // Nothing to do }); console.log('... watching partials'); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2htYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvY2FjaGUvd2F0Y2htYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0gsY0FBYyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUMzRCxNQUFNLHdCQUF3QixDQUFDO0FBRWhDLEtBQUssVUFBVSxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUk7SUFDbkMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLElBQUksTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSTtJQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDckMsT0FBTyxFQUFFLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBRTtLQUMxQixDQUFDLENBQUM7SUFFSCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssV0FBVSxJQUFJO1FBQzNDLElBQUksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxF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QUksQ0FBQztZQUNELE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3hCLElBQUksRUFBRSxLQUFLO2dCQUNYLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDO2FBQ1gsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUMsQ0FBQztTQUNELEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDL0IsZ0JBQWdCO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDI1IERhdmlkIEhlcnJvblxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEFrYXNoYUNNUyAoaHR0cDovL2FrYXNoYWNtcy5jb20vKS5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmYXN0cSBmcm9tICdmYXN0cSc7XG5pbXBvcnQgKiBhcyBkYXRhIGZyb20gJy4uL2RhdGEuanMnO1xuaW1wb3J0IHtcbiAgICBkb2N1bWVudHNDYWNoZSwgYXNzZXRzQ2FjaGUsIGxheW91dHNDYWNoZSwgcGFydGlhbHNDYWNoZVxufSBmcm9tICcuL2ZpbGUtY2FjaGUtc3FsaXRlLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyVlBhdGgoY29uZmlnLCBpbmZvKSB7XG4gICAgYXdhaXQgZGF0YS5yZW1vdmUoaW5mby5tb3VudFBvaW50LCBpbmZvLnZwYXRoKTtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgY29uZmlnLmFrYXNoYS5yZW5kZXJQYXRoKGNvbmZpZywgaW5mby52cGF0aCk7XG4gICAgY29uc29sZS5sb2cocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBTZWFyY2ggZm9yIGFsbCBkb2N1bWVudHMgdGhhdCB1c2UgdGhlIGxheW91dCB3aGljaCBjaGFuZ2VkLCBhbmRcbiAqIHJlcmVuZGVyIHRoZW0uICBPYnZpb3VzbHkgdGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgY2FsbGVkIGluXG4gKiB0aGUgaGFuZGxlcnMgZm9yICdjaGFuZ2UnIGFuZCAnYWRkJyBpbiBsYXlvdXRzLlxuICogXG4gKiBAcGFyYW0gY29uZmlnIFxuICogQHBhcmFtIGluZm8gXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlckZvckxheW91dChjb25maWcsIGluZm8pIHtcbiAgICBjb25zdCBkb2NzID0gYXdhaXQgZG9jdW1lbnRzQ2FjaGUuc2VhcmNoKHtcbiAgICAgICAgbGF5b3V0czogWyBpbmZvLnZwYXRoIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IHF1ZXVlID0gZmFzdHEucHJvbWlzZShhc3luYyBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBkYXRhLnJlbW92ZShpdGVtLm1vdW50UG9pbnQsIGl0ZW0udnBhdGgpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNvbmZpZy5ha2FzaGEucmVuZGVyUGF0aChjb25maWcsIGl0ZW0udnBhdGgpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZW5kZXJGb3JMYXlvdXQgRkFJTCB0byByZW5kZXIgJHtpdGVtLnZwYXRofSBiZWNhdXNlICR7ZXJyLnN0YWNrfWApO1xuICAgICAgICB9XG4gICAgfSwgMTApO1xuXG5cbiAgICBjb25zdCB3YWl0Rm9yID0gW107XG4gICAgZm9yIChsZXQgZG9jIG9mIGRvY3MpIHtcbiAgICAgICAgd2FpdEZvci5wdXNoKHF1ZXVlLnB1c2goZG9jKSk7XG4gICAgfVxuXG4gICAgaWYgKHdhaXRGb3IubGVuZ3RoID4gMCkgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgY29uc29sZS5sb2coYEZJTklTSCByZW5kZXJpbmcgJHt3YWl0Rm9yLmxlbmd0aH0gZG9jdW1lbnRzIGZyb20gY2hhbmdpbmcgdGVtcGxhdGUgJHtpbmZvLnZwYXRofWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWJ1aWxkKGNvbmZpZykge1xuICAgIGF3YWl0IGRhdGEucmVtb3ZlQWxsKCk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjb25maWcuYWthc2hhLnJlbmRlcihjb25maWcpO1xuICAgIGZvciAobGV0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5yZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bmxpbmtWUGF0aChjb25maWcsIGluZm8pIHtcbiAgICBpZiAoIWNvbmZpZy5yZW5kZXJEZXN0aW5hdGlvbikge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgVU5MSU5LICR7Y29sbGVjdGlvbn0gY291bGQgbm90IHBlcmZvcm0gdW5saW5rIChubyByZW5kZXJEZXN0aW5hdGlvbikgZm9yIGAsIGluZm8pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlcmVyID0gY29uZmlnLmZpbmRSZW5kZXJlclBhdGgoaW5mby52cGF0aCk7XG4gICAgbGV0IHJlbmRlclBhdGg7XG4gICAgaWYgKHJlbmRlcmVyKSB7XG4gICAgICAgIHJlbmRlclBhdGggPSByZW5kZXJlci5maWxlUGF0aChpbmZvLnZwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZW5kZXJQYXRoID0gaW5mby52cGF0aDtcbiAgICB9XG4gICAgYXdhaXQgZnMudW5saW5rKHBhdGguam9pbihjb25maWcucmVuZGVyRGVzdGluYXRpb24sIHJlbmRlclBhdGgpKTtcbiAgICBjb25zb2xlLmxvZyhgVU5MSU5LICR7cmVuZGVyUGF0aH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNobWFuKGNvbmZpZykge1xuICAgIGRvY3VtZW50c0NhY2hlXG4gICAgLm9uKCdjaGFuZ2UnLCBhc3luYyAoY29sbGVjdGlvbiwgaW5mbykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVuZGVyVlBhdGgoY29uZmlnLCBpbmZvKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZG9jdW1lbnRzQ2FjaGUuZW1pdCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgY29kZTogJ2NoYW5nZScsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICB2cGF0aDogaW5mby52cGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbignYWRkJywgYXN5bmMgKGNvbGxlY3Rpb24sIGluZm8pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlbmRlclZQYXRoKGNvbmZpZywgaW5mbyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50c0NhY2hlLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICdhZGQnLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdnBhdGg6IGluZm8udnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oJ3VubGluaycsIGFzeW5jIChjb2xsZWN0aW9uLCBpbmZvKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgVU5MSU5LICR7Y29uZmlnLnJlbmRlckRlc3RpbmF0aW9ufSAke2luZm8ucmVuZGVyUGF0aH1gKTtcbiAgICAgICAgICAgIGF3YWl0IHVubGlua1ZQYXRoKGNvbmZpZywgaW5mbyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50c0NhY2hlLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICd1bmxpbmsnLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdnBhdGg6IGluZm8udnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coJy4uLiB3YXRjaGluZyBkb2N1bWVudHMnKTtcblxuICAgIGFzc2V0c0NhY2hlXG4gICAgLm9uKCdjaGFuZ2UnLCBhc3luYyAoY29sbGVjdGlvbiwgaW5mbykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGVzdEZOID0gcGF0aC5qb2luKGNvbmZpZy5yZW5kZXJEZXN0aW5hdGlvbiwgaW5mby5yZW5kZXJQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKGluZm8uZnNwYXRoLCBkZXN0Rk4pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYENIQU5HRSAke2luZm8udnBhdGh9IENPUFk9PT4gJHtpbmZvLnJlbmRlclBhdGh9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFzc2V0c0NhY2hlLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICdjaGFuZ2UnLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdnBhdGg6IGluZm8udnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oJ2FkZCcsIGFzeW5jIChjb2xsZWN0aW9uLCBpbmZvKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0Rk4gPSBwYXRoLmpvaW4oY29uZmlnLnJlbmRlckRlc3RpbmF0aW9uLCBpbmZvLnJlbmRlclBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgZnMuY29weUZpbGUoaW5mby5mc3BhdGgsIGRlc3RGTik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQUREICR7aW5mby52cGF0aH0gQ09QWT09PiAke2luZm8ucmVuZGVyUGF0aH1gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXNzZXRzQ2FjaGUuZW1pdCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgY29kZTogJ2FkZCcsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICB2cGF0aDogaW5mby52cGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbigndW5saW5rJywgYXN5bmMgKGNvbGxlY3Rpb24sIGluZm8pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhwYXRoLmpvaW4oY29uZmlnLnJlbmRlckRlc3RpbmF0aW9uLCBpbmZvLnJlbmRlclBhdGgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVTkxJTksgJHtpbmZvLnJlbmRlclBhdGh9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFzc2V0c0NhY2hlLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICd1bmxpbmsnLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdnBhdGg6IGluZm8udnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coJy4uLiB3YXRjaGluZyBhc3NldHMnKTtcblxuICAgIGxheW91dHNDYWNoZVxuICAgIC5vbignY2hhbmdlJywgYXN5bmMgKGNvbGxlY3Rpb24sIGluZm8pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlbmRlckZvckxheW91dChjb25maWcsIGluZm8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsYXlvdXRzQ2FjaGUuZW1pdCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgY29kZTogJ2NoYW5nZScsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICB2cGF0aDogaW5mby52cGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbignYWRkJywgYXN5bmMgKGNvbGxlY3Rpb24sIGluZm8pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlbmRlckZvckxheW91dChjb25maWcsIGluZm8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsYXlvdXRzQ2FjaGUuZW1pdCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgY29kZTogJ2FkZCcsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICB2cGF0aDogaW5mby52cGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbigndW5saW5rJywgKGNvbGxlY3Rpb24sIGluZm8pID0+IHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkb1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCcuLi4gd2F0Y2hpbmcgbGF5b3V0cycpO1xuXG4gICAgcGFydGlhbHNDYWNoZVxuICAgIC5vbignY2hhbmdlJywgYXN5bmMgKGNvbGxlY3Rpb24sIGluZm8pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlYnVpbGQoY29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcGFydGlhbHNDYWNoZS5lbWl0KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiAnY2hhbmdlJyxcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHZwYXRoOiBpbmZvLnZwYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKCdhZGQnLCBhc3luYyAoY29sbGVjdGlvbiwgaW5mbykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVidWlsZChjb25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwYXJ0aWFsc0NhY2hlLmVtaXQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGNvZGU6ICdhZGQnLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgdnBhdGg6IGluZm8udnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oJ3VubGluaycsIChjb2xsZWN0aW9uLCBpbmZvKSA9PiB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG9cbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZygnLi4uIHdhdGNoaW5nIHBhcnRpYWxzJyk7XG59XG4iXX0=