@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
JavaScript
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
;