"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;