UNPKG

@n1k1t/mock-server

Version:

Powerful util to setup mocks over HTTP APIs

82 lines 3.76 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractHttpIncommingContext = exports.serializePayload = exports.parsePayload = exports.extractPayloadType = void 0; const http_1 = require("http"); const querystring_1 = require("querystring"); const fast_xml_parser_1 = require("fast-xml-parser"); const url_1 = require("url"); const body_parser_1 = __importDefault(require("body-parser")); const lodash_1 = __importDefault(require("lodash")); const utils_1 = require("../../../utils"); const xmlParser = new fast_xml_parser_1.XMLParser({ ignoreAttributes: false, }); const xmlBuilder = new fast_xml_parser_1.XMLBuilder({ ignoreAttributes: false, }); const parseQuerySearch = (queryString) => Object.entries((0, querystring_1.parse)(queryString)).reduce((acc, [key, value]) => { const valueAsJson = lodash_1.default.flatten([value]).map(arrValue => { const parsingArrayValueAsJsonResult = (0, utils_1.parseJsonSafe)(arrValue ?? ''); return parsingArrayValueAsJsonResult.status === 'OK' ? parsingArrayValueAsJsonResult.result : arrValue; }); return lodash_1.default.set(acc, key, valueAsJson?.length === 1 ? valueAsJson[0] : valueAsJson); }, {}); const extractPayloadType = (headers) => { const contentTypeKey = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type'); const contextType = lodash_1.default.flatten([lodash_1.default.get(headers, contentTypeKey ?? '', '')]).join(',').toLowerCase(); if (contextType.includes('application/json')) { return 'json'; } if (contextType.includes('/xml')) { return 'xml'; } return null; }; exports.extractPayloadType = extractPayloadType; const parsePayload = (type, payload) => { if (type === 'json') { const parsed = (0, utils_1.parseJsonSafe)(payload.toString()); return parsed.status === 'OK' ? parsed.result : undefined; } if (type === 'xml') { return xmlParser.parse(payload) ?? undefined; } return undefined; }; exports.parsePayload = parsePayload; const serializePayload = (type, payload) => { if (type === 'json') { return Buffer.from(JSON.stringify(payload)); } if (type === 'xml') { return Buffer.from(xmlBuilder.build(payload ?? {})); } return undefined; }; exports.serializePayload = serializePayload; const extractHttpIncommingContext = async (request) => { const { pathname, query: rawQuery } = (0, url_1.parse)(request.url ?? ''); const type = (0, exports.extractPayloadType)(request.headers) ?? 'plain'; const query = parseQuerySearch(rawQuery ?? ''); const headers = Object .entries(request.headers) .map(([name, values]) => [name.toLowerCase(), lodash_1.default.flatten([values]).map((value) => String(value)).sort().join(',')]) .reduce((acc, [name, value]) => lodash_1.default.set(acc, name, value), {}); const dataRaw = await new Promise((resolve, reject) => body_parser_1.default.raw({ limit: '10mb', type: '*/*' })(request, new http_1.ServerResponse(request), (error) => error ? reject(error) : resolve(Buffer.isBuffer(lodash_1.default.get(request, 'body')) ? lodash_1.default.get(request, 'body') : null))); return { type, method: String(request.method ?? 'GET').toUpperCase(), path: pathname ?? '/', headers, query, data: dataRaw ? (0, exports.parsePayload)(type, dataRaw) : undefined, dataRaw: dataRaw ?? undefined, }; }; exports.extractHttpIncommingContext = extractHttpIncommingContext; //# sourceMappingURL=utils.js.map