@docfy/ember-vite
Version:
Vite plugin for Docfy Ember integration with @embroider/vite
77 lines (76 loc) • 2.78 kB
JavaScript
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;
}
};
}