From cf47bb13a9a6713d94034e41d63e756d1f02a0f2 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Tue, 26 Mar 2024 21:13:32 -0300 Subject: web-routes: basic implementation --- src/upd8.js | 46 +++++++++++++++++++++++++++++++++++++++++ src/web-routes.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/web-routes.js (limited to 'src') diff --git a/src/upd8.js b/src/upd8.js index 96a1e9e..a1ef292 100755 --- a/src/upd8.js +++ b/src/upd8.js @@ -50,6 +50,7 @@ import {isMain, traverse} from '#node-utils'; import {sortByName} from '#sort'; import {empty, withEntries} from '#sugar'; import {generateURLs, urlSpec} from '#urls'; +import {identifyAllWebRoutes} from '#web-routes'; import {linkWikiDataArrays, loadAndProcessDataDocuments, sortWikiDataArrays} from '#yaml'; @@ -169,6 +170,9 @@ async function main() { preloadFileSizes: {...defaultStepStatus, name: `preload file sizes`}, + identifyWebRoutes: + {...defaultStepStatus, name: `identify web routes`}, + performBuild: {...defaultStepStatus, name: `perform selected build mode`}, }; @@ -659,6 +663,11 @@ async function main() { }, }); + fallbackStep('identifyWebRoutes', { + default: 'skip', + buildConfig: 'webRoutes', + }); + fallbackStep('verifyImagePaths', { default: 'perform', buildConfig: 'mediaValidation', @@ -1771,6 +1780,42 @@ async function main() { } } + let webRoutes = null; + + if (stepStatusSummary.identifyWebRoutes.status === STATUS_NOT_STARTED) { + Object.assign(stepStatusSummary.identifyWebRoutes, { + status: STATUS_STARTED_NOT_DONE, + timeStart: Date.now(), + }); + + try { + webRoutes = await identifyAllWebRoutes({ + mediaCachePath, + mediaPath, + }); + } catch (error) { + console.error(error); + + logError`There was an issue identifying web routes!`; + fileIssue(); + + Object.assign(stepStatusSummary.identifyWebRoutes, { + status: STATUS_FATAL_ERROR, + message: `JavaScript error - view log for details`, + timeEnd: Date.now(), + }); + + return false; + } + + logInfo`Successfully determined web routes.`; + + Object.assign(stepStatusSummary.identifyWebRoutes, { + status: STATUS_DONE_CLEAN, + timeEnd: Date.now(), + }); + } + if (stepStatusSummary.performBuild.status === STATUS_NOT_APPLICABLE) { return true; } @@ -1827,6 +1872,7 @@ async function main() { thumbsCache, urls, urlSpec, + webRoutes, wikiData, cachebust: '?' + CACHEBUST, diff --git a/src/web-routes.js b/src/web-routes.js new file mode 100644 index 0000000..1d010b6 --- /dev/null +++ b/src/web-routes.js @@ -0,0 +1,61 @@ +import {readdir} from 'node:fs/promises'; +import * as path from 'node:path'; +import {fileURLToPath} from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const codeSrcPath = __dirname; +const codeRootPath = path.resolve(codeSrcPath, '..'); + +function getNodeDependencyRootPath(dependencyName) { + const packageJSON = + import.meta.resolve(dependencyName + '/package.json'); + + return path.dirname(fileURLToPath(packageJSON)); +} + +export const stationaryCodeRoutes = [ + { + from: path.join(codeSrcPath, 'static'), + to: '/static', + }, + + { + from: path.join(codeSrcPath, 'util'), + to: '/util', + }, +]; + +export const dependencyRoutes = []; + +export const allStaticWebRoutes = [ + ...stationaryCodeRoutes, + ...dependencyRoutes, +]; + +export async function identifyDynamicWebRoutes({ + mediaPath, + mediaCachePath, +}) { + const routeFunctions = [ + () => Promise.resolve([ + {from: path.resolve(mediaPath), to: '/media'}, + {from: path.resolve(mediaCachePath), to: '/thumb'}, + ]), + ]; + + const routeCheckPromises = + routeFunctions.map(fn => fn()); + + const routeCheckResults = + await Promise.all(routeCheckPromises); + + return routeCheckResults.flat(); +} + +export async function identifyAllWebRoutes(opts) { + return [ + ...allStaticWebRoutes, + ...await identifyDynamicWebRoutes(opts), + ]; +} -- cgit 1.3.0-6-gf8a5