You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

256 lines
8.7 KiB

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function _react() {
const data = _interopRequireDefault(require("react"));
_react = function _react() {
return data;
};
return data;
}
function _umi() {
const data = require("umi");
_umi = function _umi() {
return data;
};
return data;
}
function _path() {
const data = require("path");
_path = function _path() {
return data;
};
return data;
}
function _fs() {
const data = require("fs");
_fs = function _fs() {
return data;
};
return data;
}
var _getModels = require("./getModels/getModels");
var _getUserLibDir = require("./getUserLibDir");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const Mustache = _umi().utils.Mustache,
lodash = _umi().utils.lodash,
winPath = _umi().utils.winPath;
var _default = api => {
const logger = api.logger;
function getModelDir() {
return api.config.singular ? 'model' : 'models';
}
function getSrcModelsPath() {
return (0, _path().join)(api.paths.absSrcPath, getModelDir());
}
function hasDvaDependency() {
const _api$pkg = api.pkg,
dependencies = _api$pkg.dependencies,
devDependencies = _api$pkg.devDependencies;
return (dependencies === null || dependencies === void 0 ? void 0 : dependencies.dva) || (devDependencies === null || devDependencies === void 0 ? void 0 : devDependencies.dva);
} // 配置
api.describe({
key: 'dva',
config: {
schema(joi) {
return joi.object({
immer: joi.boolean(),
hmr: joi.boolean(),
skipModelValidate: joi.boolean(),
extraModels: joi.array().items(joi.string())
});
}
}
});
function getAllModels() {
var _api$config$dva, _api$config$dva2;
const srcModelsPath = getSrcModelsPath();
const baseOpts = {
skipModelValidate: (_api$config$dva = api.config.dva) === null || _api$config$dva === void 0 ? void 0 : _api$config$dva.skipModelValidate,
extraModels: (_api$config$dva2 = api.config.dva) === null || _api$config$dva2 === void 0 ? void 0 : _api$config$dva2.extraModels
};
return lodash.uniq([...(0, _getModels.getModels)(_objectSpread({
base: srcModelsPath
}, baseOpts)), ...(0, _getModels.getModels)(_objectSpread({
base: api.paths.absPagesPath,
pattern: `**/${getModelDir()}/**/*.{ts,tsx,js,jsx}`
}, baseOpts)), ...(0, _getModels.getModels)(_objectSpread({
base: api.paths.absPagesPath,
pattern: `**/model.{ts,tsx,js,jsx}`
}, baseOpts))]);
}
let hasModels = false; // 初始检测一遍
api.onStart(() => {
hasModels = getAllModels().length > 0;
}); // 生成临时文件
api.onGenerateFiles({
fn() {
var _api$config$dva3, _api$config;
const models = getAllModels();
hasModels = models.length > 0;
logger.debug('dva models:');
logger.debug(models); // 没有 models 不生成文件
if (!hasModels) return; // dva.ts
const dvaTpl = (0, _fs().readFileSync)((0, _path().join)(__dirname, 'dva.tpl'), 'utf-8');
api.writeTmpFile({
path: 'plugin-dva/dva.ts',
content: Mustache.render(dvaTpl, {
ExtendDvaConfig: '',
EnhanceApp: '',
RegisterPlugins: [((_api$config$dva3 = api.config.dva) === null || _api$config$dva3 === void 0 ? void 0 : _api$config$dva3.immer) && `app.use(require('${winPath(require.resolve('dva-immer'))}')());`].filter(Boolean).join('\n'),
RegisterModels: models.map(path => {
// prettier-ignore
return `
app.model({ namespace: '${(0, _path().basename)(path, (0, _path().extname)(path))}', ...(require('${path}').default) });
`.trim();
}).join('\r\n'),
// use esm version
dvaLoadingPkgPath: winPath(require.resolve('dva-loading/dist/index.esm.js'))
})
}); // runtime.tsx
const runtimeTpl = (0, _fs().readFileSync)((0, _path().join)(__dirname, 'runtime.tpl'), 'utf-8');
api.writeTmpFile({
path: 'plugin-dva/runtime.tsx',
content: Mustache.render(runtimeTpl, {
SSR: !!((_api$config = api.config) === null || _api$config === void 0 ? void 0 : _api$config.ssr)
})
}); // exports.ts
const exportsTpl = (0, _fs().readFileSync)((0, _path().join)(__dirname, 'exports.tpl'), 'utf-8');
const dvaLibPath = winPath((0, _getUserLibDir.getUserLibDir)({
library: 'dva',
pkg: api.pkg,
cwd: api.cwd
}) || (0, _path().dirname)(require.resolve('dva/package.json')));
const dvaVersion = require((0, _path().join)(dvaLibPath, 'package.json')).version;
const exportMethods = dvaVersion.startsWith('2.6') ? ['connect', 'useDispatch', 'useStore', 'useSelector'] : ['connect'];
logger.debug(`dva lib path: ${dvaLibPath}`);
logger.debug(`dva version: ${dvaVersion}`);
logger.debug(`exported methods:`);
logger.debug(exportMethods);
api.writeTmpFile({
path: 'plugin-dva/exports.ts',
content: Mustache.render(exportsTpl, {
dvaLibPath,
exportMethods: exportMethods.join(', ')
})
}); // typings
const connectTpl = (0, _fs().readFileSync)((0, _path().join)(__dirname, 'connect.tpl'), 'utf-8');
api.writeTmpFile({
path: 'plugin-dva/connect.ts',
content: Mustache.render(connectTpl, {
dvaHeadExport: models.map(path => {
// prettier-ignore
return `export * from '${winPath((0, _path().dirname)(path) + "/" + (0, _path().basename)(path, (0, _path().extname)(path)))}';`;
}).join('\r\n'),
dvaLoadingModels: models.map(path => {
// prettier-ignore
return ` ${(0, _path().basename)(path, (0, _path().extname)(path))} ?: boolean;`;
}).join('\r\n')
})
});
},
// 要比 preset-built-in 靠前
// 在内部文件生成之前执行,这样 hasModels 设的值对其他函数才有效
stage: -1
}); // src/models 下的文件变化会触发临时文件生成
api.addTmpGenerateWatcherPaths(() => [getSrcModelsPath()]); // dva 优先读用户项目的依赖
api.addProjectFirstLibraries(() => [{
name: 'dva',
path: (0, _path().dirname)(require.resolve('dva/package.json'))
}]); // Babel Plugin for HMR
api.modifyBabelOpts(babelOpts => {
var _api$config$dva4;
const hmr = (_api$config$dva4 = api.config.dva) === null || _api$config$dva4 === void 0 ? void 0 : _api$config$dva4.hmr;
if (hmr) {
const hmrOpts = lodash.isPlainObject(hmr) ? hmr : {};
babelOpts.plugins.push([require.resolve('babel-plugin-dva-hmr'), hmrOpts]);
}
return babelOpts;
}); // Runtime Plugin
api.addRuntimePlugin(() => hasModels ? [(0, _path().join)(api.paths.absTmpPath, 'plugin-dva/runtime.tsx')] : []);
api.addRuntimePluginKey(() => hasModels ? ['dva'] : []); // 导出内容
api.addUmiExports(() => hasModels ? [{
exportAll: true,
source: '../plugin-dva/exports'
}, {
exportAll: true,
source: '../plugin-dva/connect'
}] : []);
api.registerCommand({
name: 'dva',
fn({
args
}) {
if (args._[0] === 'list' && args._[1] === 'model') {
const models = getAllModels();
console.log();
console.log(_umi().utils.chalk.bold(' Models in your project:'));
console.log();
models.forEach(model => {
console.log(` - ${(0, _path().relative)(api.cwd, model)}`);
});
console.log();
console.log(` Totally ${models.length}.`);
console.log();
}
}
});
};
exports.default = _default;