UNPKG

@analogjs/platform

Version:

The fullstack meta-framework for Angular

160 lines 15.3 kB
import { normalizePath } from 'vite'; import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; import fg from 'fast-glob'; export function contentPlugin({ highlighter, markedOptions, shikiOptions, prismOptions, } = { highlighter: 'prism', markedOptions: { mangle: true }, }, options) { const cache = new Map(); let markedHighlighter; const workspaceRoot = normalizePath(options?.workspaceRoot ?? process.cwd()); let config; let root; return [ { name: 'analogjs-content-frontmatter', async transform(code, id) { // Transform only the frontmatter into a JSON object for lists if (!id.includes('analog-content-list=true')) { return; } const cachedContent = cache.get(id); // There's no reason to run `readFileSync` and frontmatter parsing if the // `transform` hook is called with the same code. In such cases, we can simply // return the cached attributes, which is faster than repeatedly reading files // synchronously during the build process. if (cachedContent?.code === code) { return `export default ${cachedContent.attributes}`; } const fm = await import('front-matter'); // The `default` property will be available in CommonJS environment, for instance, // when running unit tests. It's safe to retrieve `default` first, since we still // fallback to the original implementation. const frontmatter = fm.default || fm; const fileContents = readFileSync(id.split('?')[0], 'utf8'); const { attributes } = frontmatter(fileContents); const content = { code, attributes: JSON.stringify(attributes), }; cache.set(id, content); return `export default ${content.attributes}`; }, }, { name: 'analogjs-content-file', enforce: 'post', async load(id) { if (!id.includes('analog-content-file=true')) { return; } if (!markedHighlighter) { if (highlighter === 'shiki') { const { getShikiHighlighter } = await import('./content/shiki/index.js'); markedHighlighter = getShikiHighlighter(shikiOptions); } else { const { getPrismHighlighter } = await import('./content/prism/index.js'); markedHighlighter = getPrismHighlighter(); const langs = [ 'bash', 'css', 'javascript', 'json', 'markup', 'typescript', ]; if (Array.isArray(prismOptions?.additionalLangs) && prismOptions?.additionalLangs?.length > 0) { langs.push(...prismOptions.additionalLangs); } const loadLanguages = await import('prismjs/components/index.js'); loadLanguages.default(langs); } } const fm = await import('front-matter'); // The `default` property will be available in CommonJS environment, for instance, // when running unit tests. It's safe to retrieve `default` first, since we still // fallback to the original implementation. const frontmatterFn = fm.default || fm; const fileContents = readFileSync(id.split('?')[0], 'utf8'); const { body, frontmatter } = frontmatterFn(fileContents); // parse markdown and highlight const { MarkedSetupService } = await import('./content/marked/marked-setup.service.js'); const markedSetupService = new MarkedSetupService(markedOptions, markedHighlighter); const mdContent = (await markedSetupService .getMarkedInstance() .parse(body)); return `export default ${JSON.stringify(`---\n${frontmatter}\n---\n\n${mdContent}`)}`; }, }, { name: 'analog-content-glob-routes', config(_config) { config = _config; root = normalizePath(resolve(workspaceRoot, config.root || '.') || '.'); }, transform(code) { if (code.includes('ANALOG_CONTENT_FILE_LIST') && code.includes('ANALOG_AGX_FILES')) { const contentFilesList = fg.sync([ `${root}/src/content/**/*.md`, `${root}/src/content/**/*.agx`, ...(options?.additionalContentDirs || [])?.map((glob) => `${workspaceRoot}${glob}/**/*.{md,agx}`), ], { dot: true }); const eagerImports = []; contentFilesList.forEach((module, index) => { eagerImports.push(`import { default as analog_module_${index} } from "${module}?analog-content-list=true";`); }); let result = code.replace('let ANALOG_CONTENT_FILE_LIST = {};', ` let ANALOG_CONTENT_FILE_LIST = {${contentFilesList.map((module, index) => `"${module.replace(root, '')}": analog_module_${index}`)}}; `); const agxFiles = fg.sync([ `${root}/src/content/**/*.agx`, ...(options?.additionalContentDirs || [])?.map((glob) => `${workspaceRoot}${glob}/**/*.agx`), ], { dot: true, }); result = result.replace('let ANALOG_AGX_FILES = {};', ` let ANALOG_AGX_FILES = {${agxFiles.map((module) => `"${module.replace(root, '')}": () => import('${module}')`)}}; `); if (!code.includes('analog_module_')) { result = `${eagerImports.join('\n')}\n${result}`; } return { code: result, map: { mappings: '' }, }; } return; }, }, { name: 'analogjs-invalidate-content-dirs', configureServer(server) { function invalidateContent(path) { if (path.includes(normalizePath(`/content/`))) { server.moduleGraph.fileToModulesMap.forEach((mods) => { mods.forEach((mod) => { if (mod.id?.includes('analogjs') && mod.id?.includes('content')) { server.moduleGraph.invalidateModule(mod); mod.importers.forEach((imp) => { server.moduleGraph.invalidateModule(imp); }); } }); }); server.ws.send({ type: 'full-reload', }); } } server.watcher.on('add', invalidateContent); server.watcher.on('unlink', invalidateContent); }, }, ]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGF0Zm9ybS9zcmMvbGliL2NvbnRlbnQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFvQjNCLE1BQU0sVUFBVSxhQUFhLENBQzNCLEVBQ0UsV0FBVyxFQUNYLGFBQWEsRUFDYixZQUFZLEVBQ1osWUFBWSxNQUNZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Q0FDaEMsRUFDRCxPQUFpQjtJQUVqQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUV6QyxJQUFJLGlCQUEyQyxDQUFDO0lBQ2hELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLElBQUksTUFBa0IsQ0FBQztJQUN2QixJQUFJLElBQVksQ0FBQztJQUVqQixPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsOEJBQThCO1lBQ3BDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3RCLDhEQUE4RDtnQkFDOUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO29CQUM3QyxPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEMseUVBQXlFO2dCQUN6RSw4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