UNPKG

create-mori

Version:

Quickly create project templates to support the required repositories as much as possible

91 lines (90 loc) 3.42 kB
import fsExtra from 'fs-extra/esm'; import fs from 'node:fs'; import path from 'node:path'; import { BuildTool, Framework, Router, Store } from './constant.js'; import { processJs, processJson, processWrite, resolveInject, } from './utils.js'; export const createTemplate = (config, root, templatePath) => { // 获取templates目录下的所有模板文件夹 const templates = fs.readdirSync(templatePath); const projectName = config.projectName; delete config.projectName; const templateName = genTemplateName(config); const templateDir = path.resolve(templatePath, templateName); // 校验所要复制模板是否存在 const finalTemplate = templates.find((t) => { return t === templateName; }); if (!finalTemplate) { return { success: false, message: `⚠️ Error: Mori has not yet provided the template ${templateName}, or encountered an unexpected error. We hope to receive your feedback.\n 🔖 New Issue: https://github.com/Mori-Yang/create-mori/issues/new?template=Blank+issue`, }; } // 遍历templatePath下的所有文件,如果文件名包含lock、node_modules、dist则跳过,否则copy fs.readdirSync(templateDir).forEach((file) => { fsExtra.copySync(path.resolve(templateDir, file), path.resolve(root, file), { filter: () => !shouldSkip(file, templatePath), }); }); // rewrite package.json if (config.specifiedTemplate) { return { success: true }; } const packageJson = fsExtra.readJsonSync(path.resolve(root, 'package.json')); packageJson.name = projectName; fsExtra.writeJsonSync(path.resolve(root, 'package.json'), packageJson, { spaces: 4, }); // inject code injectCode(config, root, templatePath); return { success: true }; }; function genTemplateName(config) { let templateName = ''; if (config.specifiedTemplate) { return config.specifiedTemplate; } Object.keys(config).forEach((k) => { switch (k) { case 'buildTool': templateName += `-${BuildTool.Text[config[k]]}`; break; case 'framework': templateName += `-${Framework.Text[config[k]]}`; break; case 'store': templateName += `-${Store.Text[config[k]]}` .split(' ') .join('_'); break; case 'router': templateName += `-${Router.Text[config[k]] .split(' ') .join('_')}`; break; } }); templateName = templateName.slice(1); return templateName.toLowerCase(); } function shouldSkip(src, templatePath) { src = src.replace(templatePath, ''); if (src.includes('lock') || src.includes('node_modules') || src.includes('dist')) { return true; } return false; } function injectCode(config, root, templatePath) { const { useTailwindcss } = config; if (useTailwindcss) { const resolved = resolveInject(path.resolve(templatePath, 'share-templates', 'tailwindcss', 'inject.json')); if (!resolved) return; const { injectJson, write, injectJs } = resolved; processJson(injectJson, root); processWrite(write, root); processJs(injectJs, root); } }