vue-cli-plugin-mocker
Version:
@vue/cli plugin for mock data
60 lines (59 loc) • 2.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("../index");
/**
* VUE Generator 扩展
* @param api GeneratorAPI 实例
* @param opts 插件配置选项
* @param preset 当前使用预设
*/
exports.default = (api, opts, preset) => {
const mergeOpts = { ...index_1.mockerOptions, ...opts };
if (!mergeOpts.registry) {
delete mergeOpts.registry;
}
const { mock } = mergeOpts;
/* 保存插件配置 */
const vue = {
pluginOptions: {
mocker: { ...mergeOpts, mock: mock && Object.keys(mock).length > 0 ? mock : {} },
},
};
api.extendPackage({
vue,
/* 启动脚本 */
scripts: {
'start:mock': 'cross-env MOCK=true vue-cli-service serve',
},
devDependencies: {
mockjs: '^1.1.0',
},
});
const { dir, demo } = mergeOpts;
const isTs = api.hasPlugin('typescript');
const data = { isTs };
/* 渲染模板 */
if (demo) {
/* template/mock 目录下文件名称 */
const tpl = ['demo'];
const ext = isTs ? 'ts' : 'js';
const sourceTpl = tpl.reduce((pre, name) => {
return {
...pre,
[`${dir}/${name}.${ext}`]: `template/mock/${name}.ejs`,
};
}, {});
api.render(sourceTpl, data, {});
}
/* readme.md 添加 mock 启动说明 */
api.postProcessFiles((files) => {
const readme = String(files['README.md']) || '';
const lines = readme.split(/\r?\n/g);
const serveIndex = lines.findIndex((line) => line.match(/yarn build/));
if (serveIndex > 0) {
const insertPos = serveIndex - 2;
lines.splice(insertPos, 0, '### Compiles with mocker and hot-reloads for development', '```', 'yarn start:mock', '```', '');
files['README.md'] = lines.join('\n');
}
});
};