UNPKG

myst-cli

Version:
48 lines (47 loc) 2.12 kB
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')); }