/** * Copyright 2023 Kapeta Inc. * SPDX-License-Identifier: BUSL-1.1 */ import FS from 'fs-extra'; import Path from 'path'; import { HTMLPage, HTMLPageEncoding } from './stream'; export async function copyDirectory( src: string, dest: string, modifyHtml: (fileName: string, content: string) => string ): Promise { await FS.promises.mkdir(dest, { recursive: true }); const entries = await FS.promises.readdir(src, { withFileTypes: true }); for (const entry of entries) { const srcPath = Path.join(src, entry.name); const destPath = Path.join(dest, entry.name); if (entry.isDirectory()) { await copyDirectory(srcPath, destPath, modifyHtml); } else if (entry.isFile()) { let content = await FS.promises.readFile(srcPath, 'utf-8'); if (Path.extname(srcPath) === '.html') { content = modifyHtml(srcPath, content); } await FS.promises.writeFile(destPath, content, 'utf-8'); } } } export function readFilesAndContent(directoryPath: string, htmlExclusive: boolean = true): HTMLPage[] { const htmlFiles:HTMLPage[] = []; function traverseDirectory(currentPath: string) { const files = FS.readdirSync(currentPath); for (const file of files) { const fileName = Path.join(currentPath, file); const relativeFilename = Path.relative(directoryPath, fileName); const stats = FS.statSync(fileName); if (stats.isDirectory()) { traverseDirectory(fileName); } else if (stats.isFile()) { if (Path.extname(fileName) === '.html') { const content = FS.readFileSync(fileName, 'utf8'); htmlFiles.push({fileName: relativeFilename, content: content, encoding: HTMLPageEncoding.TEXT }); } else { if (!htmlExclusive) { const content = FS.readFileSync(fileName); htmlFiles.push({fileName: relativeFilename, content: content.toString('base64'), encoding: HTMLPageEncoding.BINARY }) } } } } } traverseDirectory(directoryPath); return htmlFiles; } export function createFuture() { let resolve: (value: T | PromiseLike) => void = () => {}; let reject: (reason?: any) => void = () => {}; const promise = new Promise((res, rej) => { resolve = res; reject = rej; }); return { promise, resolve, reject, }; }