myst-cli
Version:
Command line tools for MyST
48 lines (47 loc) • 2.12 kB
JavaScript
import fs from 'node:fs';
import { join } from 'node:path';
import { RuleId, TemplateKind } from 'myst-common';
import { createNpmLogger, makeExecutable, tic } from 'myst-cli-utils';
import MystTemplate from 'myst-templates';
import { selectors } from '../../store/index.js';
import { addWarningForFile } from '../../utils/addWarningForFile.js';
import { castSession } from '../../session/cache.js';
const DEFAULT_TEMPLATE = 'book-theme';
const DEFAULT_INSTALL_COMMAND = 'npm ci --ignore-scripts';
export async function getSiteTemplate(session, opts) {
const cache = castSession(session);
const state = cache.store.getState();
if (cache.$siteTemplate)
return cache.$siteTemplate;
const siteConfig = selectors.selectCurrentSiteConfig(state);
const file = selectors.selectCurrentSiteFile(state) ?? session.configFiles[0];
const mystTemplate = new MystTemplate(session, {
kind: TemplateKind.site,
template: opts?.template ?? siteConfig?.template ?? opts?.defaultTemplate ?? DEFAULT_TEMPLATE,
buildDir: session.buildPath(),
errorLogFn: (message) => {
addWarningForFile(session, file, message, 'error', {
ruleId: RuleId.validSiteConfig,
});
},
warningLogFn: (message) => {
addWarningForFile(session, file, message, 'warn', {
ruleId: RuleId.validSiteConfig,
});
},
validateFiles: opts?.template ? false : true,
});
await mystTemplate.ensureTemplateExistsOnPath();
cache.$siteTemplate = mystTemplate;
return mystTemplate;
}
export async function installSiteTemplate(session, mystTemplate) {
if (fs.existsSync(join(mystTemplate.templatePath, 'node_modules')))
return;
const toc = tic();
session.log.info('⤵️ Installing web libraries (can take up to 60 s)');
await makeExecutable(mystTemplate.getValidatedTemplateYml().build?.install ?? DEFAULT_INSTALL_COMMAND, createNpmLogger(session), {
cwd: mystTemplate.templatePath,
})();
session.log.info(toc('📦 Installed web libraries in %s'));
}