openapi-ts-mock-generator
Version:
typescript mock data generator based openapi
299 lines • 12.7 kB
JavaScript
;
function _array_like_to_array(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
return arr2;
}
function _array_with_holes(arr) {
if (Array.isArray(arr)) return arr;
}
function _array_without_holes(arr) {
if (Array.isArray(arr)) return _array_like_to_array(arr);
}
function _iterable_to_array(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _iterable_to_array_limit(arr, i) {
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
if (_i == null) return;
var _arr = [];
var _n = true;
var _d = false;
var _s, _e;
try {
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally{
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally{
if (_d) throw _e;
}
}
return _arr;
}
function _non_iterable_rest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _non_iterable_spread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _sliced_to_array(arr, i) {
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
}
function _to_consumable_array(arr) {
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
}
function _unsupported_iterable_to_array(o, minLen) {
if (!o) return;
if (typeof o === "string") return _array_like_to_array(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(n);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
}
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = function(target, all) {
for(var name in all)__defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = function(to, from, except, desc) {
if (from && typeof from === "object" || typeof from === "function") {
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
var _loop = function() {
var key = _step.value;
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: function() {
return from[key];
},
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
};
for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally{
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return to;
};
var __toESM = function(mod, isNodeMode, target) {
return target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod);
};
var __toCommonJS = function(mod) {
return __copyProps(__defProp({}, "__esModule", {
value: true
}), mod);
};
// src/generators/handler-generator.ts
var handler_generator_exports = {};
__export(handler_generator_exports, {
extractResponseNames: function() {
return extractResponseNames;
},
generateHandlerName: function() {
return generateHandlerName;
},
generateHandlers: function() {
return generateHandlers;
},
generateHandlersForTag: function() {
return generateHandlersForTag;
}
});
module.exports = __toCommonJS(handler_generator_exports);
// src/core/config.ts
var import_faker = require("@faker-js/faker");
var FAKER_SEED = 1;
var faker = new import_faker.Faker({
locale: [
import_faker.ko
]
});
faker.seed(FAKER_SEED);
var GEN_COMMENT = "/* Do not edit this file. */\n/* This file generated by openapi-ts-mock-generator. */\n\n";
// src/utils/file-utils.ts
var import_fs = require("fs");
var path = __toESM(require("path"));
var ensureDir = function(dirPath) {
if (!(0, import_fs.existsSync)(dirPath)) {
(0, import_fs.mkdirSync)(dirPath, {
recursive: true
});
}
};
var clearDirectory = function(dirPath) {
if ((0, import_fs.existsSync)(dirPath)) {
(0, import_fs.readdirSync)(dirPath).forEach(function(file) {
(0, import_fs.rmSync)(path.join(dirPath, file));
});
}
};
var safeWriteFile = function(filePath, content) {
var dir = path.dirname(filePath);
ensureDir(dir);
(0, import_fs.writeFileSync)(filePath, content);
};
// src/generators/handler-generator.ts
var import_change_case_all = require("change-case-all");
var path2 = __toESM(require("path"));
var generateHandlers = function(paths, options) {
var firstTags = Array.from(new Set(paths.map(function(path3) {
return path3.tags[0];
})));
var handlersPerTag = firstTags.reduce(function(acc, tag) {
acc[tag] = [];
return acc;
}, {});
paths.forEach(function(path3) {
var handler = generateSingleHandler(path3, options);
handlersPerTag[path3.tags[0]].push(handler);
});
writeHandlerFiles(handlersPerTag, options);
};
var generateSingleHandler = function(path3, options) {
var codeBaseArray = [
" http.".concat(path3.method, "(`${handlerUrl}").concat(path3.pathname, "`, () => {")
];
if (path3.responses.length === 1) {
var _res_schema;
var res = path3.responses[0];
if (((_res_schema = res.schema) === null || _res_schema === void 0 ? void 0 : _res_schema.type) === "ref") {
var schemaName = (0, import_change_case_all.pascalCase)(res.schema.value.$ref.replace("#/components/schemas/", ""));
codeBaseArray.push(" // Schema is ".concat(schemaName));
}
var outputResName = "get".concat((0, import_change_case_all.pascalCase)(path3.operationId)).concat(res.statusCode);
codeBaseArray.push(" return HttpResponse.json(".concat(outputResName, "(), {"));
codeBaseArray.push(" status: ".concat(res.statusCode, ","));
codeBaseArray.push(" })");
} else if (path3.responses.length > 1) {
codeBaseArray.push(" const responses = [");
path3.responses.forEach(function(res) {
var _res_schema;
var schemaName = ((_res_schema = res.schema) === null || _res_schema === void 0 ? void 0 : _res_schema.type) === "ref" ? (0, import_change_case_all.pascalCase)(res.schema.value.$ref.replace("#/components/schemas/", "")) : "";
var schemaComment = schemaName ? " // Schema is ".concat(schemaName) : "";
var outputResName = "get".concat((0, import_change_case_all.pascalCase)(path3.operationId)).concat(res.statusCode);
codeBaseArray.push(" [".concat(outputResName, "(), { status: ").concat(res.statusCode, " }],").concat(schemaComment));
});
codeBaseArray.push(" ]");
codeBaseArray.push(" const randomIndex = Math.floor(Math.random() * responses.length)");
codeBaseArray.push(" return HttpResponse.json(...responses[randomIndex])");
} else {
codeBaseArray.push(" return HttpResponse.json()");
}
codeBaseArray.push(" }),");
return codeBaseArray.join("\n");
};
var writeHandlerFiles = function(handlersPerTag, options) {
var directory = path2.join(options.baseDir, "handlers");
ensureDir(directory);
if (options.clear) {
clearDirectory(directory);
}
Object.entries(handlersPerTag).forEach(function(param) {
var _param = _sliced_to_array(param, 2), tag = _param[0], handlers = _param[1];
var content = generateHandlerFileContent(tag, handlers, options);
var fileName2 = path2.join(directory, "".concat(tag, ".ts"));
safeWriteFile(fileName2, content);
console.log("Generated Handler ".concat(fileName2));
});
var mockHandlersContent = generateMockHandlersFile(handlersPerTag, options);
var _options_baseDir;
var fileName = path2.join((_options_baseDir = options.baseDir) !== null && _options_baseDir !== void 0 ? _options_baseDir : "", "mockHandlers.ts");
safeWriteFile(fileName, mockHandlersContent);
console.log("Generated mock handlers ".concat(fileName));
};
var generateHandlerFileContent = function(tag, handlers, options) {
var importMSW = "import { http, HttpResponse } from 'msw'";
var responseNames = handlers.reduce(function(acc, handler) {
var matched = handler.match(/get[A-Z]\w+/g);
if (matched === null) return acc;
return _to_consumable_array(acc).concat(_to_consumable_array(matched));
}, []).join(", ");
var importResponses = responseNames.length > 0 ? "import { ".concat(responseNames, ' } from "../response"\n') : "";
var handlerUrl = 'const handlerUrl = "'.concat(options.handlerUrl, '"');
var handlerName = (0, import_change_case_all.camelCase)(tag);
var mockHandlers = [
"".concat(importMSW),
"".concat(importResponses),
"".concat(handlerUrl),
"",
"export const ".concat(handlerName, "Handlers = ["),
"".concat(handlers.join("\n\n")),
"]"
].join("\n");
return GEN_COMMENT + mockHandlers;
};
var generateMockHandlersFile = function(handlersPerTag, options) {
var handlersImport = Object.keys(handlersPerTag).map(function(tag) {
var handlerName = "".concat((0, import_change_case_all.camelCase)(tag), "Handlers");
return "import { ".concat(handlerName, ' } from "./handlers/').concat(tag, '"');
}).join("\n");
var handlersArrayItem = Object.keys(handlersPerTag).map(function(tag) {
var handlerName = "".concat((0, import_change_case_all.camelCase)(tag), "Handlers");
return " ...".concat(handlerName, ",");
}).join("\n");
var mockHandlers = [
"".concat(handlersImport),
"",
"export const handlers = [",
"".concat(handlersArrayItem),
"]"
].join("\n");
return GEN_COMMENT + mockHandlers;
};
var generateHandlersForTag = function(paths, tag, options) {
return paths.filter(function(path3) {
return path3.tags.includes(tag);
}).map(function(path3) {
return generateSingleHandler(path3, options);
});
};
var extractResponseNames = function(handlers) {
return handlers.reduce(function(acc, handler) {
var matched = handler.match(/get[A-Z]\w+/g);
if (matched === null) return acc;
return _to_consumable_array(acc).concat(_to_consumable_array(matched));
}, []);
};
var generateHandlerName = function(tag) {
return "".concat((0, import_change_case_all.camelCase)(tag), "Handlers");
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
extractResponseNames: extractResponseNames,
generateHandlerName: generateHandlerName,
generateHandlers: generateHandlers,
generateHandlersForTag: generateHandlersForTag
});
//# sourceMappingURL=handler-generator.js.map