UNPKG

vitepress-theme-demoblock

Version:
113 lines (108 loc) 3.76 kB
import fs from 'fs'; import path from 'path'; import { globbySync } from 'globby'; import camelCase from 'camelcase'; import minimist from 'minimist'; import pico from 'picocolors'; import prettier from 'prettier'; import yaml from 'yaml'; import { fileURLToPath } from 'url'; const getDirname = (importMetaUrl) => path.dirname(fileURLToPath(importMetaUrl)); const __dirname = getDirname(import.meta.url); const resolve$1 = (...args) => path.resolve(__dirname, ...args); const prettierConfigPath = ".prettierrc"; const format = (content, userOptions = { parser: "javascript" }) => { const defaultOptionBuffer = fs.readFileSync(resolve$1("../../", prettierConfigPath)); const defaultOptions = yaml.parse(defaultOptionBuffer.toString()); const options = Object.assign({}, defaultOptions, userOptions); return prettier.format(content, options); }; const { red, yellow, cyan } = pico; const pkgName = cyan("[vitepress-theme-demoblock]"); const argv = minimist(process.argv.slice(2)); const cwd = process.cwd(); const resolve = (...args) => path.resolve(cwd, ...args); const docsDir = argv.docsDir || "docs"; const componentsDir = argv.componentsDir || "components"; if (!fs.existsSync(resolve(docsDir))) { console.log(red(`${pkgName} docsDir does not exist `)); process.exit(0); } const vitePressDir = `${docsDir}/.vitepress`; const outputPath = "theme/useComponents.js"; function importTemplate(path2, componentName) { return `import ${componentName} from '../${componentsDir}/${path2}'`; } function registerTemplate(path2, componentName) { return `app.component('${componentName}', ${componentName})`; } function componentTemplate(path2) { let componentName = camelCase(path2.slice(0, -4).replace(/[/\\]/g, "-"), { pascalCase: true }); if (componentName.includes("Index")) { const endIndex = componentName.indexOf("Index"); componentName = componentName.substring(0, endIndex); } return { import: importTemplate(path2, componentName), register: registerTemplate(path2, componentName) }; } function componentsTemplate(codeImports, codeRegisters) { return ` // Don't remove this file, because it registers the demo components. ${codeImports} export function useComponents(app) { ${codeRegisters} } `; } function registerComponents() { const dir = resolve(vitePressDir, componentsDir); console.log( `${pkgName} start to register components... docsDir is ${resolve(docsDir)}, componentsDir is ${resolve( dir )} ` ); let files = []; if (!fs.existsSync(dir)) { console.log( yellow(`${pkgName} componentsDir does not exist, only register built-in components. `) ); } else { files = globbySync("**/*.{vue,ts,tsx,js,jsx}", { cwd: dir }); } const codes = files.map((file) => componentTemplate(file)); const demoPath = "vitepress-theme-demoblock/dist/client"; codes.push({ import: `import Demo from '${demoPath}/components/Demo.vue'`, register: "app.component('Demo', Demo)" }); codes.push({ import: `import DemoBlock from '${demoPath}/components/DemoBlock.vue'`, register: "app.component('DemoBlock', DemoBlock)" }); codes.forEach((code) => { console.log(`${code.import}, ${code.register}`); }); const codeImports = codes.map((code) => code.import).join("\n"); const codeRegisters = codes.map((code) => code.register).join("\n"); const content = componentsTemplate(codeImports, codeRegisters); format(content, { parser: "babel" }).then((formattedContent) => { fs.writeFileSync(path.join(vitePressDir, outputPath), formattedContent); console.log(` ${pkgName} register components success. `); }).catch((e) => { console.error(` ${pkgName} format code error. `, e); }); } registerComponents();