mihawk
Version:
A tiny & simple mock server tool, support json,js,cjs,ts(typescript).
171 lines (170 loc) • 7.85 kB
JavaScript
;
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;