UNPKG

@ng-doc/builder

Version:

<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>

84 lines 3.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.contentBuilder = contentBuilder; const builder_1 = require("@ng-doc/builder"); const rxjs_1 = require("rxjs"); const operators_1 = require("rxjs/operators"); const classes_1 = require("../../../classes"); const helpers_1 = require("../../../helpers"); const core_1 = require("../../core"); const on_dependencies_change_1 = require("../../core/triggers/on-dependencies-change"); /** * * @param config */ function contentBuilder(config) { const { tag, context, metadata, cacheId, mainFilePath, getContent, getKeywords } = config; const dependencies = new classes_1.ObservableSet(); let usedKeywords = new Set(); let keywords = new Map(); let removeKeywords = () => { }; const cacheStrategy = { id: cacheId, action: 'restore', files: () => [metadata.path, mainFilePath, ...dependencies.asArray()], getData: () => ({ dependencies: dependencies.asArray(), keywords: Array.from(keywords), usedKeywords: Array.from(usedKeywords), }), onCacheLoad: (data) => { dependencies.add(...data.dependencies); keywords = new Map(data.keywords); usedKeywords = new Set(data.usedKeywords); }, toCache: (content) => content, fromCache: (content) => content, }; const builder = (0, rxjs_1.of)(void 0).pipe((0, core_1.runBuild)(tag, async () => { try { // Triggering the touch of the keywords before the build to trigger dependent builders // This is needed because keywords can be changed after the build (0, core_1.touchKeywords)(...keywords.keys()); removeKeywords(); dependencies.clear(); usedKeywords.clear(); const { content, anchors, error } = await helpers_1.UTILS.processHtml(await getContent(dependencies), { headings: context.config.guide?.anchorHeadings, route: metadata.absoluteRoute(), lightTheme: config.context.config.shiki?.themes.light, darkTheme: config.context.config.shiki?.themes.dark, }); if (error) { throw new Error(`Error while processing html (${metadata.path})`, { cause: error, }); } removeKeywords = core_1.keywordsStore.add(...new Map(getKeywords(anchors))); const postProcessed = await helpers_1.UTILS.postProcessHtml(content); usedKeywords = new Set(postProcessed.usedKeywords); return postProcessed.content; } catch (cause) { throw new Error(`Error while building entry (${metadata.path})`, { cause, }); } }, cacheStrategy)); return (0, builder_1.createBuilder)([ (0, builder_1.createMainTrigger)((0, core_1.watchFile)(mainFilePath, 'update'), (0, on_dependencies_change_1.onDependenciesChange)(dependencies)), (0, builder_1.createSecondaryTrigger)((0, builder_1.onKeywordsTouch)(usedKeywords.has.bind(usedKeywords), keywords.has.bind(keywords))), ], () => builder).pipe((0, operators_1.tap)((state) => { if ((0, builder_1.isBuilderDone)(state)) { if (keywords.size) { removeKeywords = core_1.keywordsStore.add(...keywords); // Touching the keywords after the build run all builders that depend on // the new keywords that might have been added !state.fromCache && (0, core_1.touchKeywords)(...keywords.keys()); } } }), (0, rxjs_1.finalize)(() => { removeKeywords(); })); } //# sourceMappingURL=content.builder.js.map