UNPKG

@merkur/cli

Version:

Merkur is tiny and extensible library for creating front-end microservices.

85 lines (70 loc) 2.34 kB
import fs from 'node:fs/promises'; import path from 'node:path'; import chalk from 'chalk'; import { createLogger } from '../logger.mjs'; export function memoryStaticPlugin({ definition, cliConfig, context }) { const logger = createLogger('memoryStaticPlugin', cliConfig); let manifest = {}; let manifestHash = ''; return { name: 'memoryStaticPlugin', setup(build) { const { projectFolder, buildFolder } = cliConfig; logger.debug(`Setup plugin for "${chalk.cyan(definition.name)}" task.`); build.onEnd(async (result) => { if (result.errors.length) { return; } await generateManifest(result); await saveGeneratedFileToMemory(result); }); async function generateManifest(result) { const pathToOutDir = path.resolve( projectFolder, definition?.build?.outdir, ); result.outputFiles.map((file) => { const key = file.path.replace(pathToOutDir, '').replace('/', ''); manifest[key] = key; }); let newManifestHash = JSON.stringify(manifest); if (newManifestHash !== manifestHash) { try { await createFolderStructure(pathToOutDir); await fs.writeFile( `${pathToOutDir}/manifest.json`, JSON.stringify(manifest), ); manifestHash = newManifestHash; logger.debug( `Create manifest for ${definition.name} to ${definition?.build?.outdir} folder.`, ); } catch (error) { logger.error(error); } } } async function saveGeneratedFileToMemory(result) { result.outputFiles.map((file) => { const key = file.path.replace( path.resolve(projectFolder, buildFolder), '', ); const size = Math.round( (result?.metafile?.outputs?.[`${path.normalize(buildFolder)}${key}`] ?.bytes ?? 0) / 1024, ); logger.debug(`Save file "${key}", size ${size} [kB] to memory.`); context.memory[key] = file; }); } }, }; } async function createFolderStructure(dir) { try { await fs.access(dir, fs.constants.R_OK); } catch { await fs.mkdir(dir, { recursive: true }); } }