front-template/scripts/safe-init.cjs
2025-01-07 15:29:05 +08:00

114 lines
2.1 KiB
JavaScript

const { resolve } = require('path')
const { gray, green } = require('kolorist')
const { createConsola } = require('consola')
const { existsSync, lstatSync } = require('fs')
const { removeSync, emptyDirSync } = require('fs-extra')
function slash(path) {
return path.replace(/\\/g, '/')
}
function r(dir) {
return slash(resolve(__dirname, '../', dir))
}
const entrys = [
'src/components',
'src/api',
'mock',
'layouts/default.vue',
'src/pages/index.vue',
'src/pages/about.md',
'src/pages/echarts.vue',
'src/stores',
'locales/简体中文',
'locales/English',
]
const resolvedEntrys = entrys.map((entry) => r(entry))
/**
* 安全初始化
* @param {import('plop').NodePlopAPI} plop
*/
function safeInit(plop) {
const logger = createConsola().withTag('safe:init')
logger.warn('实验性功能')
plop.setGenerator('controller', {
description: '安全初始化',
prompts: [
{
name: 'yes',
type: 'confirm',
message: '是否安全的初始化?',
default: false,
},
{
name: 'cleanStyles',
type: 'confirm',
message: '是否清理 styles?',
default: false,
},
],
actions(answer) {
if (!answer.yes) {
return []
}
if (answer.cleanStyles) {
resolvedEntrys.push(r('src/styles'))
}
console.log()
// 这里不用异步是因为 plop action 只支持同步
resolvedEntrys.forEach((e) => {
if (!existsSync(e)) {
return
}
const entry = lstatSync(e)
if (entry.isFile()) {
removeSync(e)
logClean(e)
return
}
if (entry.isDirectory()) {
emptyDirSync(e)
logClean(e)
}
})
return [
{
type: 'add',
force: true,
path: '../src/pages/index.vue',
templateFile: './template/page.hbs',
data: {
name: 'index',
isMarkdown: false,
},
},
{
type: 'add',
force: true,
path: '../src/layouts/default.vue',
templateFile: './template/layout.hbs',
data: {
name: 'default',
},
},
]
},
})
}
function logClean(path) {
console.log(`${green('√ clean')} ${gray(path)}`)
}
module.exports = safeInit