/** * 用于生成前端模版项目 * 在构建 platform-core 库时, 会将生成的模版工程文件一起发布, 这样前端项目可直接使用 * 另外当模版发生变化时, 也可以自动在每个前端项目中同步 */ const fs = require('fs'); const json5 = require('json5'); const { mkdir, rm, cp, replaceAll } = require('./.bin/util.js'); const sourceDir = './'; const targetDir = './template-project/'; function parseJson5(src) { return json5.parse(fs.readFileSync(src).toString()); } function generatePackageJsonFile() { const packageJson = parseJson5('./package.json'); delete packageJson['//files']; delete packageJson['files']; delete packageJson['//main']; delete packageJson['main']; delete packageJson['//types']; delete packageJson['types']; delete packageJson['//bin']; delete packageJson['bin']; delete packageJson.scripts['lib']; delete packageJson.scripts['check']; delete packageJson.scripts['template']; packageJson.dependencies['platform-core'] = packageJson.version; const names = []; for (const name in packageJson.dependencies) { names.push(name); } names.sort((o1, o2) => { if (o1 > o2) { return 1; } else if (o1 == o2) { return 0; } else { return -1; } }); const dependencies = {}; for (const name of names) { dependencies[name] = packageJson.dependencies[name]; } packageJson.dependencies = dependencies; fs.writeFileSync(targetDir + 'package.json', JSON.stringify(packageJson, null, ' ')); } function generateTsconfigJsonFile() { const tsconfigJson = parseJson5('./tsconfig.json'); delete tsconfigJson['include']; delete tsconfigJson.compilerOptions['declaration']; delete tsconfigJson.compilerOptions['declarationDir']; delete tsconfigJson.compilerOptions['declarationMap']; fs.writeFileSync(targetDir + 'tsconfig.json', JSON.stringify(tsconfigJson, null, ' ')); } rm('./template-project'); mkdir('./template-project'); cp('./src', targetDir + 'src'); rm(targetDir + 'src/platform'); cp('./public', targetDir + 'public'); replaceAll(targetDir + 'src/boostrap.ts', { '@/platform': 'platform-core', '// ': '', '//': '' }); replaceAll(targetDir + 'src/shims-vue.d.ts', { '@/platform': 'platform-core' }); replaceAll(targetDir + 'src/App.vue', { '@/platform': 'platform-core' }); cp(sourceDir + '.browserslistrc', targetDir + '.browserslistrc'); cp(sourceDir + '.editorconfig', targetDir + '.editorconfig'); cp(sourceDir + '.eslintrc.cjs', targetDir + '.eslintrc.cjs'); cp(sourceDir + '.gitignore', targetDir + '.gitignore'); cp(sourceDir + '.npmignore', targetDir + '.npmignore'); cp(sourceDir + '.npmrc', targetDir + '.npmrc'); cp(sourceDir + '.prettierignore', targetDir + '.prettierignore'); cp(sourceDir + '.prettierrc.json', targetDir + '.prettierrc.json'); cp(sourceDir + 'babel.config.cjs', targetDir + 'babel.config.cjs'); cp(sourceDir + 'frontend-register.json', targetDir + 'frontend-register.json'); cp(sourceDir + 'nodemon.json', targetDir + 'nodemon.json'); cp(sourceDir + 'postcss.config.cjs', targetDir + 'postcss.config.cjs'); cp(sourceDir + 'tailwind.config.cjs', targetDir + 'tailwind.config.cjs'); cp(sourceDir + 'util-components-generator.cjs', targetDir + 'util-components-generator.cjs'); cp(sourceDir + 'util-frontend-register.cjs', targetDir + 'util-frontend-register.cjs'); cp(sourceDir + 'vuepress.client.ts', targetDir + 'vuepress.client.ts'); cp(sourceDir + 'vuepress.config.ts', targetDir + 'vuepress.config.ts'); cp(sourceDir + 'webpack.config.common.cjs', targetDir + 'webpack.config.common.cjs'); cp(sourceDir + 'webpack.config.mf.cjs', targetDir + 'webpack.config.mf.cjs'); cp(sourceDir + 'webpack.env.build.cjs', targetDir + 'webpack.env.build.cjs'); cp(sourceDir + 'webpack.env.prod.cjs', targetDir + 'webpack.env.prod.cjs'); cp(sourceDir + 'webpack.env.serve.cjs', targetDir + 'webpack.env.serve.cjs'); generatePackageJsonFile(); generateTsconfigJsonFile(); console.info('tempate project generated!');