@nokecy/umi-plugin-widget
Version:
widget
102 lines (88 loc) • 2.73 kB
text/typescript
import { IApi, utils } from 'umi';
import { basename, dirname, extname, join, relative } from 'path';
import { getWidgets } from './getWidgets';
import { readFileSync } from 'fs';
const { Mustache, lodash, winPath } = utils;
const erpCommon_DIR = 'plugin-abp-widget'; // plugin-init-state 插件创建临时文件的专有文件夹
export default function (api: IApi) {
function getSrcModelsPath() {
return join(api.paths.absSrcPath!, '_widgets');
}
function getAllInitStates() {
const srcModelsPath = getSrcModelsPath();
const baseOpts = {
skipModelValidate: api.config.dva?.skipModelValidate,
extraModels: api.config.dva?.extraModels,
};
return lodash.uniq([
...getWidgets({
base: srcModelsPath,
cwd: api.cwd,
...baseOpts,
}),
...getWidgets({
base: api.paths.absPagesPath!,
cwd: api.cwd,
pattern: `**/${"_widgets"}/*.{ts,tsx,js,jsx}`,
...baseOpts,
}),
...getWidgets({
base: api.paths.absPagesPath!,
cwd: api.cwd,
pattern: `**/widget.{ts,tsx,js,jsx}`,
...baseOpts,
}),
]);
}
api.describe({
key: "abpwidget",
enableBy: api.EnableBy.register,
})
let hasModels = false;
api.onStart(() => {
hasModels = getAllInitStates().length > 0;
});
api.onGenerateFiles(() => {
const models = getAllInitStates();
hasModels = models.length > 0;
// if (!hasModels) return;
const dvaTpl = readFileSync(join(__dirname, 'widget.tpl'), 'utf-8');
api.writeTmpFile({
path: `${erpCommon_DIR}/widget.ts`,
content: Mustache.render(dvaTpl, {
RegisterModelImports: models
.map((path, index) => {
const modelName = `${lodash.upperFirst(
lodash.camelCase(basename(path, extname(path))),
)}`;
return `import ${modelName} from '${path}';`;
})
.join('\r\n'),
RegisterModels: models
.map((path, index) => {
// prettier-ignore
const modelName = `${lodash.upperFirst(
lodash.camelCase(basename(path, extname(path))),
)}`;
return `export { ${modelName} }`.trim();
})
.join('\r\n'),
Datas: models
.map((path, index) => {
// prettier-ignore
const modelName = `${lodash.upperFirst(
lodash.camelCase(basename(path, extname(path))),
)}`;
return `"${modelName}" : ${modelName} ,`.trim();
})
.join('\r\n'),
})
});
});
api.addUmiExports(() => [
{
exportAll: true,
source: `../${erpCommon_DIR}/widget`,
},
]);
}