UNPKG

mihawk

Version:

A tiny & simple mock server tool, support json,js,cjs,ts(typescript).

171 lines (170 loc) 7.85 kB
'use strict'; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatOptionsByConfig = exports.getRcData = exports.initRCfile = void 0; const path_1 = require("path"); const color_cc_1 = __importDefault(require("color-cc")); const cosmiconfig_1 = require("cosmiconfig"); const fs_extra_1 = require("fs-extra"); const deepmerge_1 = __importDefault(require("deepmerge")); const file_1 = require("../utils/file"); const consts_1 = require("../consts"); const print_1 = require("../utils/print"); const path_2 = require("../utils/path"); const is_1 = require("../utils/is"); function initRCfile(name, options = { fileType: 'json' }) { return __awaiter(this, void 0, void 0, function* () { const { fileType = 'json', overwrite = false, initConfig = {}, tsInfo = null } = options; const rcType = fileType || 'json'; const rcName = `${name}.${rcType}`; print_1.Printer.log(`init ${rcName} file..`); const rcFilePath = (0, path_1.join)(consts_1.CWD, `./${rcName}`); if ((0, fs_extra_1.existsSync)(rcFilePath)) { if (overwrite) { print_1.Printer.log(`Force Update file ${rcName}..`); } else { print_1.Printer.log(`${rcName} file already exists. Will skip it..`); return; } } let initContent = JSON.stringify(initConfig || {}, null, 2); switch (rcType) { case 'ts': { const { typeName, typeImportId } = tsInfo || {}; const hasTypeInfo = typeName && typeImportId; const importTypeCode = hasTypeInfo ? `import type { ${typeName} } from '${typeImportId}';` : ''; initContent = [ '"use strict";', '/**', ` * ${name}.ts`, ' */', importTypeCode, '', `const config: ${hasTypeInfo ? typeName : 'any'} = ${initContent};`, 'export default config;', '', ].join('\n'); break; } case 'js': { initContent = [ '"use strict";', '/**', ` * ${name}.js`, ' */', '', `module.exports = ${initContent};`, '', ].join('\n'); break; } case 'json': default: initConfig.$schema = `./node_modules/${consts_1.PKG_NAME}/assets/schema/root-config.json`; initContent = JSON.stringify(initConfig || {}, null, 2); break; } (0, file_1.writeFileSafeSync)(rcFilePath, initContent); }); } exports.initRCfile = initRCfile; function getRcData(name, options) { return __awaiter(this, void 0, void 0, function* () { const { initConfig = {} } = options || {}; const defConfig = Object.assign({}, initConfig); const rcNames = [`${name}.json`, `${name}.js`, `${name}.ts`]; try { if (rcNames.some(fileName => (0, fs_extra_1.existsSync)((0, path_1.join)(consts_1.CWD, fileName)))) { const explorer = (0, cosmiconfig_1.cosmiconfig)(name, { stopDir: consts_1.CWD, searchPlaces: rcNames, packageProp: name.replace(/^\.+/g, ''), }); const res = yield explorer.search(consts_1.CWD); const { config, filepath } = res || {}; print_1.Printer.log(color_cc_1.default.success(`load root-config file: ${color_cc_1.default.gray((0, path_1.basename)(filepath))}`)); print_1.Debugger.log('root-config: ', config); return config || defConfig; } else { print_1.Printer.log(color_cc_1.default.yellow(`Can't found rc-file(.${name}.js|json|ts). Will auto create & init it..`)); yield initRCfile(name, { fileType: 'json', initConfig: defConfig, overwrite: false }); return defConfig; } } catch (error) { print_1.Printer.error(color_cc_1.default.error('Load config file error..'), '\n', error); return defConfig; } }); } exports.getRcData = getRcData; function formatOptionsByConfig(config) { var _a; const options = (0, deepmerge_1.default)({}, Object.assign(Object.assign({}, consts_1.DEFAULT_OPTIONS), config)); ['_', '--', 'h', 'H', 'help', 'v', 'V', 'version'].forEach(key => delete options[key]); if (options.p !== undefined) { options.port = options.p; delete options.p; } if (options.d !== undefined) { options.mockDir = options.d || consts_1.MOCK_DIR_NAME; delete options.d; } if (options.w !== undefined) { options.watch = options.w; delete options.w; } const { mockDataFileType, mockLogicFileType } = options || {}; options.port = Number(options.port); options.mockDirPath = (0, path_2.absifyPath)(options.mockDir || consts_1.MOCK_DIR_NAME); options.mockDataDirPath = (0, path_1.join)(options.mockDirPath, consts_1.MOCK_DATA_DIR_NAME); const isTypesctiptMode = mockLogicFileType === 'ts' || mockLogicFileType === 'typescript'; options.isTypesctiptMode = isTypesctiptMode; if (isTypesctiptMode) { if (options.tsconfigPath) { options.tsconfigPath = (0, path_2.absifyPath)(options.tsconfigPath); } else { options.tsconfigPath = (0, path_1.join)(options.mockDirPath, 'tsconfig.json'); } } const dataFileExt = mockDataFileType; options.dataFileExt = dataFileExt; const useLogicFile = mockLogicFileType !== 'none'; options.useLogicFile = useLogicFile; const logicFileExt = (0, path_2.getLogicFileExt)(mockLogicFileType); options.logicFileExt = logicFileExt; if (useLogicFile) { options.middlewareFilePath = (0, path_1.join)(options.mockDirPath, `./middleware.${logicFileExt}`); } options.routesFilePath = (0, path_1.join)(options.mockDirPath, `./routes.${logicFileExt || dataFileExt}`); options.useHttps = !!options.https || (0, is_1.isObjStrict)(options.https); options.useWS = !!options.socketConfig; if (options.useWS) { if (typeof options.socketConfig !== 'object') { options.socketConfig = { host: options.host, port: options.port, secure: options.useHttps, stomp: false, }; } options.socketFilePath = (0, path_1.join)(options.mockDirPath, `./socket.${logicFileExt}`); } options.useRemoteData = typeof options.setJsonByRemote === 'object' && ((_a = options.setJsonByRemote) === null || _a === void 0 ? void 0 : _a.enable); return options; } exports.formatOptionsByConfig = formatOptionsByConfig;