UNPKG

legal-markdown-js

Version:

Node.js implementation of LegalMarkdown for processing legal documents with markdown and YAML - Complete feature parity with Ruby version

92 lines (79 loc) 2.81 kB
import { existsSync, readdirSync, readFileSync, writeFileSync, statSync } from 'fs'; import { join, extname, relative } from 'path'; import { fileURLToPath } from 'url'; const MIME: Record<string, string> = { '.html': 'text/html', '.css': 'text/css', '.js': 'text/javascript', '.mjs': 'text/javascript', '.json': 'application/json', '.png': 'image/png', '.jpg': 'image/jpeg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.ico': 'image/x-icon', '.woff': 'font/woff', '.woff2': 'font/woff2', }; export type AssetEntry = { content: string; mime: string }; export type AssetMap = Record<string, AssetEntry>; function collectFiles(dir: string, acc: string[]): void { for (const entry of readdirSync(dir)) { const full = join(dir, entry); if (statSync(full).isDirectory()) { collectFiles(full, acc); } else { acc.push(full); } } } export function generateAssetMap(webDir: string): AssetMap { if (!existsSync(webDir)) { throw new Error( `dist/web directory not found at: ${webDir}\nRun npm run build:web first.` ); } const files: string[] = []; collectFiles(webDir, files); const map: AssetMap = {}; for (const filePath of files) { const rel = relative(webDir, filePath); const urlKey = '/' + rel.replace(/\\/g, '/'); const ext = extname(filePath).toLowerCase(); const mime = MIME[ext] ?? 'application/octet-stream'; const content = readFileSync(filePath).toString('base64'); map[urlKey] = { content, mime }; } return map; } // Only run as a script (not when imported by tests) const isMain = typeof process !== 'undefined' && process.argv[1] !== undefined && (process.argv[1].endsWith('embed-web-assets.ts') || process.argv[1].endsWith('embed-web-assets.js')); if (isMain) { const repoRoot = join(fileURLToPath(import.meta.url), '..', '..'); const webDir = join(repoRoot, 'dist', 'web'); const outFile = join(repoRoot, 'src', 'cli', 'playground', 'embedded-assets.ts'); console.log(`Embedding ${webDir} -> ${outFile}`); const map = generateAssetMap(webDir); const entries = Object.entries(map) .map( ([k, v]) => ` ${JSON.stringify(k)}: { content: ${JSON.stringify(v.content)}, mime: ${JSON.stringify(v.mime)} }` ) .join(',\n'); const output = [ '// AUTO-GENERATED by scripts/embed-web-assets.ts - do not edit manually.', '// Restored to empty stub by git checkout after binary compilation.', 'export type AssetEntry = { content: string; mime: string };', 'export type AssetMap = Record<string, AssetEntry>;', 'export const EMBEDDED_WEB_ASSETS: AssetMap = {', entries, '};', '', ].join('\n'); writeFileSync(outFile, output, 'utf8'); console.log(`Done. Embedded ${Object.keys(map).length} file(s).`); }