vitepress-theme-demoblock
Version:
vitepress-theme-demoblock
113 lines (108 loc) • 3.76 kB
JavaScript
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();