UNPKG

@docfy/ember-vite

Version:

Vite plugin for Docfy Ember integration with @embroider/vite

77 lines (76 loc) 2.78 kB
import fs from 'fs'; import debugFactory from 'debug'; const debug = debugFactory('@docfy/ember-vite-plugin:virtual-modules'); const VIRTUAL_MODULE_PREFIX = '\0virtual:'; const VIRTUAL_MODULES = { 'virtual:docfy-output': `${VIRTUAL_MODULE_PREFIX}docfy-output`, }; export function createVirtualModules() { let docfyResult = null; let isInvalidated = false; return { resolveId(id) { if (id in VIRTUAL_MODULES) { debug('Resolving virtual module', { id }); return VIRTUAL_MODULES[id]; } return null; }, load(id) { switch (id) { case VIRTUAL_MODULES['virtual:docfy-output']: debug('Loading virtual:docfy-output', { hasResult: !!docfyResult }); if (!docfyResult) { // Return empty structure when no result is available yet return `export default ${JSON.stringify({ nested: { name: '/', pages: [], children: [] } })};`; } return `export default ${JSON.stringify({ nested: docfyResult.nestedPageMetadata })};`; default: return null; } }, updateResult(result) { debug('Updating Docfy result', { contentCount: result.content.length, staticAssetsCount: result.staticAssets.length }); docfyResult = result; isInvalidated = false; }, generateAssets(context) { if (!docfyResult) { debug('No Docfy result available for asset generation'); return; } // Generate JSON files for public consumption const urlsAsset = { type: 'asset', fileName: 'docfy-urls.json', source: JSON.stringify(docfyResult.content.map(page => page.meta.url)) }; context.emitFile(urlsAsset); // Copy static assets docfyResult.staticAssets.forEach(asset => { const staticAsset = { type: 'asset', fileName: asset.toPath, source: fs.readFileSync(asset.fromPath) }; context.emitFile(staticAsset); }); debug('Generated assets', { urls: true, staticAssets: docfyResult.staticAssets.length }); }, invalidate() { debug('Invalidating virtual modules'); isInvalidated = true; docfyResult = null; } }; }