UNPKG

akasharender

Version:

Rendering support for generating static HTML websites or EPUB eBooks

100 lines 14 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 path from 'node:path'; import { promises as fsp } from 'node:fs'; // import { __dirname } from './index.js'; import { sqdb } from './sqdb.js'; const sql_create_table = await fsp.readFile(path.join(import.meta.dirname, 'sql', 'data-create-table.sql'), 'utf-8'); const sql_add_report = await fsp.readFile(path.join(import.meta.dirname, 'sql', 'data-add-report.sql'), 'utf-8'); const sql_delete_traces = await fsp.readFile(path.join(import.meta.dirname, 'sql', 'data-delete-traces.sql'), 'utf-8'); const sql_delete_all_traces = await fsp.readFile(path.join(import.meta.dirname, 'sql', 'data-delete-all-traces.sql'), 'utf-8'); const sql_get_all_traces = await fsp.readFile(path.join(import.meta.dirname, 'sql', 'data-get-all-traces.sql'), 'utf-8'); const sql_get_for_file = await fsp.readFile(path.join(import.meta.dirname, 'sql', 'data-for-file.sql'), 'utf-8'); class Trace { } export async function init() { await (await sqdb).run(sql_create_table); } export async function report(basedir, fpath, renderTo, stage, start) { const trace = new Trace(); trace.basedir = basedir; trace.fpath = fpath; trace.fullpath = path.join(basedir, fpath); trace.renderTo = renderTo; trace.stage = stage; trace.start = start.toISOString(); trace.now = new Date().toISOString(); // console.log(`data report`, trace); await (await sqdb).run(await sql_add_report, { $basedir: trace.basedir, $fpath: trace.fpath, $fullpath: trace.fullpath, $renderTo: trace.renderTo, $stage: trace.stage, $start: trace.start, $now: trace.now }); } ; /** * Support removing items from the saved data. This is useful * when we're rendering the same file multiple times. * * @param {*} basedir * @param {*} fpath */ export async function remove(basedir, fpath) { try { await (await sqdb).run(await sql_delete_traces, { $basedir: basedir, $fpath: fpath }); } catch (err) { } } ; export async function removeAll() { try { await (await sqdb).run(await sql_delete_all_traces); } catch (err) { } } ; export async function print() { const traces = await (await sqdb).all(await sql_get_all_traces); for (let trace of traces) { console.log(`${trace.fullpath} ${trace.renderTo} ${trace.stage} ${(new Date(trace.now).valueOf() - new Date(trace.start).valueOf()) / 1000} seconds`); } } ; export async function data4file(basedir, fpath) { // console.log(`data4file ${basedir} ${fpath}`); let ret = ""; const traces = await (await sqdb).all(await sql_get_for_file, { $basedir: basedir, $fpath: fpath }); for (let trace of traces) { if (trace.basedir === basedir && trace.fpath === fpath) { ret += `${trace.fullpath} ${trace.renderTo} ${trace.stage} ${(new Date(trace.now).valueOf() - new Date(trace.start).valueOf()) / 1000} seconds\n`; } } return ret; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxJQUFJLEdBQUcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMxQywwQ0FBMEM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUdqQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FDdkMsSUFBSSxDQUFDLElBQUksQ0FDTCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsdUJBQXVCLENBQ3RELEVBQ0QsT0FBTyxDQUNWLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQ3JDLElBQUksQ0FBQyxJQUFJLENBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUNwRCxFQUNELE9BQU8sQ0FDVixDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQ3hDLElBQUksQ0FBQyxJQUFJLENBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixDQUN2RCxFQUNELE9BQU8sQ0FDVixDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQzVDLElBQUksQ0FBQyxJQUFJLENBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLDRCQUE0QixDQUMzRCxFQUNELE9BQU8sQ0FDVixDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQ3pDLElBQUksQ0FBQyxJQUFJLENBQ0wsTUFBTSxDQUFD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QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQTtJQUN6SixDQUFDO0FBQ0wsQ0FBQztBQUFBLENBQUM7QUFFRixNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSztJQUMxQyxnREFBZ0Q7SUFDaEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBRWIsTUFBTSxNQUFNLEdBQ04sTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFRLE1BQU0sZ0JBQWdCLEVBQUU7UUFDeEQsUUFBUSxFQUFFLE9BQU87UUFDakIsTUFBTSxFQUFJLEtBQUs7S0FDbEIsQ0FBQyxDQUFDO0lBRUgsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDckQsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUM7UUFDdEosQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDI1IERhdmlkIEhlcnJvblxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEFrYXNoYUNNUyAoaHR0cDovL2FrYXNoYWNtcy5jb20vKS5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzcCB9IGZyb20gJ25vZGU6ZnMnO1xuLy8gaW1wb3J0IHsgX19kaXJuYW1lIH0gZnJvbSAnLi9pbmRleC5qcyc7XG5cbmltcG9ydCB7IHNxZGIgfSBmcm9tICcuL3NxZGIuanMnO1xuaW1wb3J0IHsgQXN5bmNEYXRhYmFzZSB9IGZyb20gJ3Byb21pc2VkLXNxbGl0ZTMnO1xuXG5jb25zdCBzcWxfY3JlYXRlX3RhYmxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZSwgJ3NxbCcsICdkYXRhLWNyZWF0ZS10YWJsZS5zcWwnXG4gICAgKSxcbiAgICAndXRmLTgnXG4pO1xuXG5jb25zdCBzcWxfYWRkX3JlcG9ydCA9IGF3YWl0IGZzcC5yZWFkRmlsZShcbiAgICBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsICdzcWwnLCAnZGF0YS1hZGQtcmVwb3J0LnNxbCdcbiAgICApLFxuICAgICd1dGYtOCdcbik7XG5cbmNvbnN0IHNxbF9kZWxldGVfdHJhY2VzID0gYXdhaXQgZnNwLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZSwgJ3NxbCcsICdkYXRhLWRlbGV0ZS10cmFjZXMuc3FsJ1xuICAgICksXG4gICAgJ3V0Zi04J1xuKTtcblxuY29uc3Qgc3FsX2RlbGV0ZV9hbGxfdHJhY2VzID0gYXdhaXQgZnNwLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZSwgJ3NxbCcsICdkYXRhLWRlbGV0ZS1hbGwtdHJhY2VzLnNxbCdcbiAgICApLFxuICAgICd1dGYtOCdcbik7XG5cbmNvbnN0IHNxbF9nZXRfYWxsX3RyYWNlcyA9IGF3YWl0IGZzcC5yZWFkRmlsZShcbiAgICBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsICdzcWwnLCAnZGF0YS1nZXQtYWxsLXRyYWNlcy5zcWwnXG4gICAgKSxcbiAgICAndXRmLTgnXG4pO1xuXG5jb25zdCBzcWxfZ2V0X2Zvcl9maWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKFxuICAgIHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZSwgJ3NxbCcsICdkYXRhLWZvci1maWxlLnNxbCdcbiAgICApLFxuICAgICd1dGYtOCdcbik7XG5cbmNsYXNzIFRyYWNlIHtcbiAgICBiYXNlZGlyOiBzdHJpbmc7XG4gICAgZnBhdGg6IHN0cmluZztcbiAgICBmdWxscGF0aD86IHN0cmluZztcbiAgICByZW5kZXJUbzogc3RyaW5nO1xuICAgIHN0YWdlOiBzdHJpbmc7XG4gICAgc3RhcnQ6IHN0cmluZztcbiAgICBub3c6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgYXdhaXQgKGF3YWl0IHNxZGIpLnJ1bihzcWxfY3JlYXRlX3RhYmxlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydChcbiAgICBiYXNlZGlyLCBmcGF0aCwgcmVuZGVyVG8sIHN0YWdlLCBzdGFydDogRGF0ZVxuKSB7XG4gICAgY29uc3QgdHJhY2UgICAgPSBuZXcgVHJhY2UoKTtcbiAgICB0cmFjZS5iYXNlZGlyICA9IGJhc2VkaXI7XG4gICAgdHJhY2UuZnBhdGggICAgPSBmcGF0aDtcbiAgICB0cmFjZS5mdWxscGF0aCA9IHBhdGguam9pbihiYXNlZGlyLCBmcGF0aCk7XG4gICAgdHJhY2UucmVuZGVyVG8gPSByZW5kZXJUbztcbiAgICB0cmFjZS5zdGFnZSAgICA9IHN0YWdlO1xuICAgIHRyYWNlLnN0YXJ0ICAgID0gc3RhcnQudG9JU09TdHJpbmcoKTtcbiAgICB0cmFjZS5ub3cgICAgICA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhgZGF0YSByZXBvcnRgLCB0cmFjZSk7XG4gICAgYXdhaXQgKGF3YWl0IHNxZGIpLnJ1bihhd2FpdCBzcWxfYWRkX3JlcG9ydCwge1xuICAgICAgICAkYmFzZWRpcjogIHRyYWNlLmJhc2VkaXIsXG4gICAgICAgICRmcGF0aDogICAgdHJhY2UuZnBhdGgsXG4gICAgICAgICRmdWxscGF0aDogdHJhY2UuZnVsbHBhdGgsXG4gICAgICAgICRyZW5kZXJUbzogdHJhY2UucmVuZGVyVG8sXG4gICAgICAgICRzdGFnZTogICAgdHJhY2Uuc3RhZ2UsXG4gICAgICAgICRzdGFydDogICAgdHJhY2Uuc3RhcnQsXG4gICAgICAgICRub3c6ICAgICAgIHRyYWNlLm5vd1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBTdXBwb3J0IHJlbW92aW5nIGl0ZW1zIGZyb20gdGhlIHNhdmVkIGRhdGEuICBUaGlzIGlzIHVzZWZ1bFxuICogd2hlbiB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgZmlsZSBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBAcGFyYW0geyp9IGJhc2VkaXJcbiAqIEBwYXJhbSB7Kn0gZnBhdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZShiYXNlZGlyLCBmcGF0aCkge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IChhd2FpdCBzcWRiKS5ydW4oYXdhaXQgc3FsX2RlbGV0ZV90cmFjZXMsIHtcbiAgICAgICAgICAgICRiYXNlZGlyOiBiYXNlZGlyLFxuICAgICAgICAgICAgJGZwYXRoOiAgIGZwYXRoXG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge31cbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgKGF3YWl0IHNxZGIpLnJ1bihhd2FpdCBzcWxfZGVsZXRlX2FsbF90cmFjZXMpO1xuICAgIH0gY2F0Y2ggKGVycikge31cbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludCgpIHtcbiAgICBjb25zdCB0cmFjZXNcbiAgICAgICAgPSBhd2FpdCAoYXdhaXQgc3FkYikuYWxsPFRyYWNlPihhd2FpdCBzcWxfZ2V0X2FsbF90cmFjZXMpO1xuXG4gICAgZm9yIChsZXQgdHJhY2Ugb2YgdHJhY2VzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3RyYWNlLmZ1bGxwYXRofSAke3RyYWNlLnJlbmRlclRvfSAke3RyYWNlLnN0YWdlfSAkeyhuZXcgRGF0ZSh0cmFjZS5ub3cpLnZhbHVlT2YoKSAtIG5ldyBEYXRlKHRyYWNlLnN0YXJ0KS52YWx1ZU9mKCkpIC8gMTAwMH0gc2Vjb25kc2ApXG4gICAgfVxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRhdGE0ZmlsZShiYXNlZGlyLCBmcGF0aCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGBkYXRhNGZpbGUgJHtiYXNlZGlyfSAke2ZwYXRofWApO1xuICAgIGxldCByZXQgPSBcIlwiO1xuXG4gICAgY29uc3QgdHJhY2VzXG4gICAgICAgID0gYXdhaXQgKGF3YWl0IHNxZGIpLmFsbDxUcmFjZT4oYXdhaXQgc3FsX2dldF9mb3JfZmlsZSwge1xuICAgICAgICAkYmFzZWRpcjogYmFzZWRpcixcbiAgICAgICAgJGZwYXRoOiAgIGZwYXRoXG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCB0cmFjZSBvZiB0cmFjZXMpIHtcbiAgICAgICAgaWYgKHRyYWNlLmJhc2VkaXIgPT09IGJhc2VkaXIgJiYgdHJhY2UuZnBhdGggPT09IGZwYXRoKSB7XG4gICAgICAgICAgICByZXQgKz0gYCR7dHJhY2UuZnVsbHBhdGh9ICR7dHJhY2UucmVuZGVyVG99ICR7dHJhY2Uuc3RhZ2V9ICR7KG5ldyBEYXRlKHRyYWNlLm5vdykudmFsdWVPZigpIC0gbmV3IERhdGUodHJhY2Uuc3RhcnQpLnZhbHVlT2YoKSkgLyAxMDAwfSBzZWNvbmRzXFxuYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuIl19