apipost-runtime8
Version:
apipost-runtime 新版本 for apipost8 支持单接口http请求、自动化测试, 使用全新的参数结构
993 lines (912 loc) • 197 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var lodash = require('lodash');
var jsonBigint = require('json-bigint');
var apipostTools = require('apipost-tools');
var expMock = require('exp-mock');
var uuid = require('uuid');
var postmanCollection = require('postman-collection');
var jsonpath = require('jsonpath');
var fileType = require('file-type');
var isImage = require('is-image');
var contentDisposition = require('content-disposition');
var urlJoin = require('@apipost/url-join');
var isSvg = require('is-svg');
var mime = require('mime');
var apipostMock = require('apipost-mock');
var atomicSleep = require('atomic-sleep');
var stripJsonComments = require('strip-json-comments');
var toughCookie = require('tough-cookie');
var minimatch$1 = require('minimatch');
var fs = require('fs');
var os = require('os');
var child_process = require('child_process');
var buffer = require('buffer/');
var path = require('path');
var msgpack5 = require('msgpack5');
var pmRuntime = require('pm-runtime');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var lodash__default = /*#__PURE__*/_interopDefaultLegacy(lodash);
var jsonBigint__default = /*#__PURE__*/_interopDefaultLegacy(jsonBigint);
var apipostTools__default = /*#__PURE__*/_interopDefaultLegacy(apipostTools);
var expMock__default = /*#__PURE__*/_interopDefaultLegacy(expMock);
var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid);
var postmanCollection__default = /*#__PURE__*/_interopDefaultLegacy(postmanCollection);
var jsonpath__default = /*#__PURE__*/_interopDefaultLegacy(jsonpath);
var fileType__default = /*#__PURE__*/_interopDefaultLegacy(fileType);
var isImage__default = /*#__PURE__*/_interopDefaultLegacy(isImage);
var contentDisposition__default = /*#__PURE__*/_interopDefaultLegacy(contentDisposition);
var urlJoin__default = /*#__PURE__*/_interopDefaultLegacy(urlJoin);
var isSvg__default = /*#__PURE__*/_interopDefaultLegacy(isSvg);
var mime__default = /*#__PURE__*/_interopDefaultLegacy(mime);
var apipostMock__default = /*#__PURE__*/_interopDefaultLegacy(apipostMock);
var atomicSleep__default = /*#__PURE__*/_interopDefaultLegacy(atomicSleep);
var stripJsonComments__default = /*#__PURE__*/_interopDefaultLegacy(stripJsonComments);
var toughCookie__default = /*#__PURE__*/_interopDefaultLegacy(toughCookie);
var minimatch__default = /*#__PURE__*/_interopDefaultLegacy(minimatch$1);
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
var child_process__default = /*#__PURE__*/_interopDefaultLegacy(child_process);
var buffer__default = /*#__PURE__*/_interopDefaultLegacy(buffer);
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
var msgpack5__default = /*#__PURE__*/_interopDefaultLegacy(msgpack5);
var pmRuntime__default = /*#__PURE__*/_interopDefaultLegacy(pmRuntime);
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
// @ts-check
// 一些公共方法
const Url = postmanCollection__default["default"].Url,
JSONbig$1 = jsonBigint__default["default"]({ storeAsString: true }),
{ minimatch } = minimatch__default["default"],
{ v4: uuidv4$1 } = uuid__default["default"],
Buffer$1 = buffer__default["default"].Buffer;
// sleep 延迟方法
const sleepDelay$1 = function (ms) {
atomicSleep__default["default"](ms);
};
// 根据测试条件返回布尔值
const returnBoolean$1 = function (exp, compare, value) {
let bool = false;
if (exp === "") {
// fix bug
return compare == "null";
}
switch (compare) {
case "eq":
bool = exp == value;
break;
case "uneq":
bool = exp != value;
break;
case "gt":
bool = lodash__default["default"].gt(Number(exp), Number(value));
break;
case "gte":
bool = lodash__default["default"].gte(Number(exp), Number(value));
break;
case "lt":
bool = lodash__default["default"].lt(Number(exp), Number(value));
break;
case "lte":
bool = lodash__default["default"].lte(Number(exp), Number(value));
break;
case "includes":
bool = lodash__default["default"].includes(exp, value) || lodash__default["default"].includes(exp, Number(value));
break;
case "unincludes":
bool = !lodash__default["default"].includes(exp, value) && !lodash__default["default"].includes(exp, Number(value));
break;
case "null":
bool = lodash__default["default"].isEmpty(exp);
break;
case "notnull":
bool = !lodash__default["default"].isEmpty(exp);
break;
case "exist":
bool = !lodash__default["default"].isUndefined(exp);
break;
case "notexist":
bool = lodash__default["default"].isUndefined(exp);
break;
case "regularmatch":
try {
bool = new RegExp(
String(value).substring(1, String(value).length - 1)
).test(exp);
} catch (e) { }
break;
case "belongscollection":
bool = lodash__default["default"].split(value, ",").indexOf(exp) > -1;
break;
case "notbelongscollection":
bool = lodash__default["default"].split(value, ",").indexOf(exp) == -1;
break;
}
return bool;
};
// 获取某接口的 所有父target
const getParentTargetIDs = function (collection, target_id, type, parent_ids) {
if (lodash__default["default"].isArray(collection)) {
const item = lodash__default["default"].find(
collection,
lodash__default["default"].matchesProperty(type == "sample" ? "sample_id" : "target_id", target_id)
);
if (item) {
if (parent_ids.includes(item.parent_id)) {
//出现死循环,不要继续了。
return;
}
if (item?.type != "sample") {
parent_ids.push(item.parent_id);
}
getParentTargetIDs(collection, item.parent_id, null, parent_ids);
}
}
};
// 获取某接口的详细信息
const getItemFromCollection = function (collection, target_id) {
return lodash__default["default"].find(collection, lodash__default["default"].matchesProperty("target_id", target_id));
};
// 获取某接口用例的详细信息
const getItemSampleFromCollection = function (collection, target_id) {
const item = lodash__default["default"].find(collection, lodash__default["default"].matchesProperty("sample_id", target_id));
if (lodash__default["default"].isObject(item)) {
// @ts-ignore
let old_target_id = item?.target_id; //记录原始target_id
// @ts-ignore
if (item?.sample_id && item?.target_id != item?.sample_id) {
// @ts-ignore
item.target_id = item.sample_id; //确保有target_id
}
// @ts-ignore
if (old_target_id && old_target_id != item?.sample_id) { //确保没有死循环
// @ts-ignore
item.parent_id = old_target_id;
}
return item;
} else {
return item;
}
};
// 强制跳出
function breakNestedLoop$1(emitRuntimeEvent, msg = { action: "stop", msg: "Stop with an error" }) {
lodash__default["default"].isFunction(emitRuntimeEvent) && emitRuntimeEvent(msg);
throw new Error();
}
// 转换pm request为输出的request
function pmRequest2EchoRequest$1(pmRequest, requestJson, postmanJSON, history) {
const cloneRequest = lodash__default["default"].assign(lodash__default["default"].cloneDeep(pmRequest), {
name: requestJson?.name,
project_id: requestJson?.project_id,
});
// 请求体类型
cloneRequest.mode = lodash__default["default"].get(requestJson, "request.body.mode");
// 其他请求参数
try {
cloneRequest.paths =
lodash__default["default"].fromPairs(
(lodash__default["default"].get(postmanJSON, "url.variable") || []).map((item) => [
item.key,
item.value,
])
) || {};
} catch (e) { }
try {
const allRequestHeaders = lodash__default["default"].mapValues(lodash__default["default"].keyBy(lodash__default["default"].get(history, 'execution.data[0].request.headers') || {}, 'key'), 'value');
if (!lodash__default["default"].isEmpty(allRequestHeaders) && lodash__default["default"].isObject(allRequestHeaders)) {
cloneRequest.headers = allRequestHeaders;
} else {
cloneRequest.headers = lodash__default["default"].reduce(
cloneRequest.headers?.toJSON(),
(obj, item) => {
obj[item.key] = item.value;
return obj;
},
{}
);
}
} catch (e) { }
try {
cloneRequest.querys = cloneRequest.url?.query?.toObject();
cloneRequest.url = String(cloneRequest.url);
} catch (e) { }
try {
cloneRequest.body = lodash__default["default"].get(
pmRequest,
`body.${lodash__default["default"].get(pmRequest, "body.mode")}`
);
if (cloneRequest.mode == "msgpack") {
const msgpack = msgpack5__default["default"]();
try {
cloneRequest.body = JSON.stringify(
msgpack.decode(Buffer$1.from(lodash__default["default"].values(cloneRequest.body)))
);
} catch (e) { }
}
try {
cloneRequest.body = cloneRequest.body.toObject();
} catch (e) { }
} catch (e) { }
try {
cloneRequest.uri = pmRequest?.url.toJSON();
lodash__default["default"].forEach(cloneRequest.uri, function (value, key) {
if (key == "query") {
cloneRequest.uri[key] = value.toObject();
} else if (key == "host") {
cloneRequest.uri[key] = lodash__default["default"].join(value, ".");
} else if (key == "path") {
cloneRequest.uri[key] = lodash__default["default"].join(value, "/");
} else {
if (lodash__default["default"].isArray(value)) {
cloneRequest.uri[key] = lodash__default["default"].join(value, "");
}
}
});
} catch (e) { }
// 获取cookies
cloneRequest.cookies = {};
try {
const cookiesString = cloneRequest.headers?.cookie;
if (!lodash__default["default"].isEmpty(cookiesString) && lodash__default["default"].isString(cookiesString)) {
lodash__default["default"].forEach(lodash__default["default"].split(cookiesString, ";"), (cookie) => {
const { key, value } = toughCookie__default["default"].Cookie.parse(cookie).toJSON();
cloneRequest.cookies[key] = value;
});
}
} catch (e) { }
return cloneRequest;
}
// 转换pm response为输出的response iterationResult
async function pmResponse2EchoResponse$1(response, history) {
const cloneResponse = lodash__default["default"].cloneDeep(response);
lodash__default["default"].unset(cloneResponse, "_details");
// 响应体
try {
lodash__default["default"].assign(cloneResponse, {
body: String(cloneResponse.stream),
});
} catch (e) { }
// 判断适合什么格式输出
try {
let fitForShow = "Monaco";
let mimeType = {
ext: "json",
mime: "application/json",
};
if (isSvg__default["default"](cloneResponse.body)) {
lodash__default["default"].assign(mimeType, {
ext: "svg",
mime: "image/svg+xml",
});
fitForShow = "Image";
} else {
const fileType = await fileType__default["default"].fromBuffer(cloneResponse.stream);
if (lodash__default["default"].isObject(fileType)) {
lodash__default["default"].assign(mimeType, fileType);
if (isImage__default["default"](`test.${mimeType?.ext}`)) {
fitForShow = "Image";
} else if (mimeType?.ext == "pdf") {
fitForShow = "Pdf";
} else if (mimeType?.ext == "xml") {
fitForShow = "Monaco";
} else {
fitForShow = "Other";
}
} else {
const contentType =
getCaseInsensitive(cloneResponse?.headers || {}, "content-type") ||
"";
if (!lodash__default["default"].isEmpty(contentType)) {
mimeType = {
ext: mime__default["default"].getExtension(contentType),
mime: mime__default["default"].getType(mime__default["default"].getExtension(contentType)),
};
} else {
const ext = apipostTools__default["default"].isJson(cloneResponse.body)
? "json"
: apipostTools__default["default"].isJsonp(cloneResponse.body)
? "jsonp"
: "html";
mimeType = {
ext: ext,
mime: mime__default["default"].getType(ext) || "application/jsonp",
};
}
}
}
lodash__default["default"].assign(cloneResponse, {
mimeType,
fitForShow,
});
} catch (e) { }
// 响应头对象
const responseHeader = {};
try {
lodash__default["default"].assign(
responseHeader,
lodash__default["default"].reduce(
response.headers?.toJSON(),
(obj, item) => {
if (obj[item.key]) {
if (!Array.isArray(obj[item.key])) {
obj[item.key] = [obj[item.key]];
}
obj[item.key].push(item.value);
} else {
obj[item.key] = item.value;
}
return obj;
},
{}
)
);
} catch (e) { }
// 响应头
try {
lodash__default["default"].assign(cloneResponse, {
headers: responseHeader,
});
} catch (e) { }
// 缓存文件名
let cacheFileName = `${cloneResponse?.id}.${cloneResponse?.mimeType?.ext}`;
try {
cacheFileName = lodash__default["default"].get(
contentDisposition__default["default"].parse(
getCaseInsensitive(responseHeader || {}, "content-disposition")
),
"parameters.filename"
);
if (lodash__default["default"].isString(cacheFileName)) {
try {
cacheFileName = decodeURIComponent(cacheFileName);
} catch (e) { }
}
} catch (e) { }
cloneResponse.filename = cacheFileName;
// cookie
cloneResponse.cookies = {};
cloneResponse.arrCookies = [];
let cookieArrs = getCaseInsensitive(responseHeader || {}, "set-cookie");
if (lodash__default["default"].isString(cookieArrs)) {
cookieArrs = [cookieArrs];
}
try {
lodash__default["default"].forEach(cookieArrs, (cookie) => {
const cookieJson = toughCookie__default["default"].Cookie.parse(cookie).toJSON();
lodash__default["default"].assign(cookieJson, {
name: cookieJson?.key,
cookie_id: apipostTools__default["default"].snowflakeId(`cookie_id_${uuidv4$1()}`),
});
cloneResponse.arrCookies.push(cookieJson);
const { key, value } = cookieJson;
cloneResponse.cookies[key] = value;
});
} catch (e) { }
const requestStart =
lodash__default["default"].get(history, "execution.data.0.timings.requestStart") || Date.now();
lodash__default["default"].assign(cloneResponse, {
proxy: lodash__default["default"].get(history, "execution.data.0.request.proxy") || {},
timings: lodash__default["default"].mapKeys(
lodash__default["default"].get(history, "execution.data.0.timings.offset") || {},
(value, key) => lodash__default["default"].snakeCase(key)
),
requestStart,
response_at: requestStart,
});
return cloneResponse;
}
// 不区分大小写的 _.get
function getCaseInsensitive(object, keyToFind) {
try {
// 先将要查找的键转换成小写
const lowerKey = keyToFind.toLowerCase();
if (!lodash__default["default"].isObject(object)) {
return undefined;
}
// 在对象的所有键中查找
for (const key in object) {
if (key.toLowerCase() === lowerKey) {
return object[key];
}
}
} catch (e) { }
// 如果没有找到,返回undefined
return undefined;
}
// 避免重复编码的 encodeURIComponent
function encodeURIComponentUnique(str) {
if (lodash__default["default"].startsWith(str, '{{') && lodash__default["default"].endsWith(str, '}}')) {
return str;
} else {
try {
if (decodeURIComponent(str) == str) {
return encodeURIComponent(str);
}
return str;
} catch (e) {
return encodeURIComponent(str);
}
}
}
// 将 apipost json 转为postman 2.1 collaction 的 event
function convert2PostmanEvent$1(request, listen, database_configs, env, dynamic_option) {
const sysScript = [
"(async function(){",
"const response = {};",
`
const splitCookieString = (input)=> {
let index = input.indexOf('=');
if (index === -1) {
return [input];
}
return [input.slice(0, index), input.slice(index + 1)];
}
`,
"let lodashv4 = require('lodash');",
"let { mockExp } = require('exp-mock');",
"let Mock = require('mockjs');",
"let xml2json = xml2Json;",
"let JSON5 = require('json5');",
"let aTools = require('apipost-tools');",
"let jsonpath = require('jsonpath');",
`let _envTmpVariablesData = ${JSON.stringify(env)}`,
`let _dynamicValueOptions = ${JSON.stringify(dynamic_option)}`,
"let $ = {}; $.md5 = function(str){return CryptoJS.MD5(str).toString()};$.ajax = pm.ajaxSendRequest;",
`pm.environment.getPreUrl = function(){return _.get(_envTmpVariablesData, "env_pre_url");}`,
`pm.environment.getName = function(){return _.get(_envTmpVariablesData, "env_name");}`,
"pm.environment.getCollection = function(){return pm.environment.toObject();}",
`pm.variables.getPreUrl = function(){return _.get(_envTmpVariablesData, "env_pre_url");}`,
`pm.variables.getName = function(){return _.get(_envTmpVariablesData, "env_name");}`,
"pm.variables.getCollection = function(){return pm.environment.toObject();}",
"pm.environment.delete = pm.environment.unset;",
"pm.variables.delete = pm.variables.unset;",
"pm.globals.delete = pm.globals.unset;",
"pm.Visualizing = pm.visualizer.set", // 兼容旧版本的可视化
`
let _requestTmpBodyObject = request?.data
try{
_requestTmpBodyObject = JSON.stringify(JSON5.parse(request?.data));
}catch(e){}
try{
let _requestTmpVariablesData = ${JSON.stringify({ name: request?.name })}
_.assign(request, {
request_headers: pm.request?.headers?.toObject(),
request_bodys: _requestTmpBodyObject,
request_querys: pm.request?.url?.query?.toObject(),
request_variables: pm.request?.url?.variables?.toObject(),
mode: "${lodash__default["default"].get(request, "request.body.mode")}",
contentType: pm.request?.headers?.get('content-type'),
id: "${request?.sample_id || request?.target_id}",
name: _.get(_requestTmpVariablesData, "name") || "HTTP request",
url: String(pm.request?.url),
uri: pm.request?.url
});
}catch(e){}
// 获取最终请求body
try{
pm.getFinalRequestRawBody = () => {
let requestBody = pm.variables.replaceIn(request.request_bodys);
if(lodashv4.isString(requestBody)){
const regex = /{{([^}]+)}}/g;
const matches = requestBody.match(regex);
if (!lodashv4.isEmpty(matches)) {
lodashv4.forEach(matches, (match) => {
try {
const tmpVal = mockExp(match, _dynamicValueOptions?.all_vars || {}, _dynamicValueOptions?.lang || 'en', _dynamicValueOptions?.custom_functions || {});
if (tmpVal != match && !lodashv4.isUndefined(tmpVal)) {
requestBody = lodashv4.replace(requestBody, match, tmpVal);
}
} catch (e) { }
})
}
pm.setRequestBody(requestBody);
}
return requestBody;
}
}catch(e){
pm.getFinalRequestRawBody = () => {}
}
// 变量替换(含动态值)
try{
pm.mock = (str) => {
if(lodashv4.isString(str)){
const regex = /{{([^}]+)}}/g;
const matches = str.match(regex);
if (!lodashv4.isEmpty(matches)) {
lodashv4.forEach(matches, (match) => {
try {
const tmpVal = mockExp(match, _dynamicValueOptions?.all_vars || {}, _dynamicValueOptions?.lang || 'en', _dynamicValueOptions?.custom_functions || {});
if (tmpVal != match && !lodashv4.isUndefined(tmpVal)) {
str = lodashv4.replace(str, match, tmpVal);
}
} catch (e) { }
})
}
}
return str;
}
}catch(e){
pm.mock = (str) => {return str}
}
`,
"if(_.isObject(pm.response)){",
"try{",
"_.set(response, 'headers', pm.response.headers?.toObject());",
"}catch(e){}",
`try{ // 设置cookie
response.cookies = {};
const responseCookies = lodashv4.get(pm.response.headers.toObject(), 'set-cookie');
lodashv4.forEach(lodashv4.isArray(responseCookies)?responseCookies:[responseCookies], (cookieStr) => {
let cookieArr = splitCookieString(lodashv4.head(lodashv4.split(cookieStr, ';')));
let cookieValue = lodashv4.join(lodashv4.tail(cookieArr),'');
if(cookieArr[0] && cookieValue){
try{
_.set(response.cookies, cookieArr[0], decodeURIComponent(cookieValue))
}catch(e){
_.set(response.cookies, cookieArr[0], cookieValue)
}
}
})
}catch(e){}
`,
"_.set(pm, 'response.raw.responseText', pm.response.text());",
"_.set(response, 'raw.responseText', pm.response.text());",
"try{",
"_.set(response, 'json', pm.response.json());",
"_.set(response, 'raw.json', pm.response.json());",
"}catch(e){_.set(response, 'raw.json', {})}",
"_.set(response, 'raw.status', pm.response.code);",
"_.set(response, 'raw.responseTime', pm.response.responseTime);",
" pm.response.setBody = function (body) {",
" if (typeof body !== 'string') {",
" body = JSON.stringify(body);",
" }",
" if (typeof body === 'string') {",
" const originalText = _.cloneDeep(pm.response.text());",
" try {",
" const originalJson = _.cloneDeep(pm.response.json());",
" pm.response.originalJson = function () {",
" return originalJson;",
" };",
" }",
" catch (e) {",
" pm.response.originalJson = function () {",
" return null;",
" };",
" }",
" pm.response.originalText = function () {",
" return originalText;",
" };",
" pm.response.stream = Buffer.from(body);",
` pm.variables.set("_pm.response.setBody", body);`,
" }",
" };",
"",
" pm.response.setCode = function (code) {",
" if (typeof code === 'number') {",
" pm.response.originalCode = function () {",
" return pm.response.code;",
" };",
"",
" pm.response.code = code;",
` pm.variables.set("_pm.response.code", code);`,
" }",
" };",
"}",
"pm.execute = async function(file, args, extra, option){}",
"const apipost = postman;",
"const apt = fox = ea = echoapi = insomnia = pm;", // TODO 兼容旧版本apipost的语法、增加更多三方库
`
// Compatible with tc
const expect = pm.expect;
const assert = pm.assert;
assert.equal = (source, dist) => { return source === dist }
const tc = {};
try {
// global
tc.loadModule = require;
tc.info = {};
tc.delay = sleep;
// Ignored library
tc.exec = () => { console.warn("The tc.exec script syntax of Thunder client is not supported.") }
tc.runRequest = () => { console.warn("The tc.runRequest script syntax of Thunder client is not supported, Please use pm.sendRequest() instead.") }
tc.skipRequest = () => { console.warn("The tc.skipRequest script syntax of Thunder client is not supported.") }
tc.chartHTML = () => { console.warn("The tc.chartHTML script syntax of Thunder client is not supported.") }
tc.retryRequest = () => { console.warn("The tc.retryRequest script syntax of Thunder client is not supported.") }
tc.runRequest = () => { console.warn("The tc.runRequest script syntax of Thunder client is not supported.") }
tc.setCookie = () => { console.warn("The tc.setCookie script syntax of Thunder client is not supported.") }
tc.clearCookies = () => { console.warn("The tc.clearCookies script syntax of Thunder client is not supported.") }
tc.getCookies = () => { console.warn("The tc.getCookies script syntax of Thunder client is not supported.") }
tc.readFile = () => { console.warn("The tc.readFile script syntax of Thunder client is not supported.") }
tc.loadFromPath = () => { console.warn("The tc.loadFromPath script syntax of Thunder client is not supported.") }
// test
tc.test = (name, func) => {
if (lodashv4.isFunction(func)) {
if(!lodashv4.isUndefined(func())){
try{
pm.test(name, func)
}catch(e){}
}else{
pm.test(name, pm.expect(func()).to.equal(true))
}
} else {
pm.test(name, pm.expect(lodashv4.toInteger(func) > 0 ? true : false).to.equal(true))
}
}
// var
tc.setVar = (key, value) => { pm.environment.set(key, value) };
tc.getVar = (key) => { return pm.environment.get(key) };
// Param
tc.setParam = (key, value) => { pm.setRequestQuery(key, value) };
// request
tc.request = lodashv4.cloneDeep(request);
tc.request.body = {};
tc.request.name = request.name;
tc.request.id = request.id;
tc.request.name = request.name;
tc.request.setHeader = (key, value) => { pm.setRequestHeader(key, value) };
tc.request.getHeader = (key) => { return pm.request.headers.get(key) };
tc.request.setBody = (key, value) => { pm.setRequestBody(key, value) };
// response
if (lodashv4.isObject(pm.response)) {
tc.response = lodashv4.cloneDeep(response);
tc.response.size = pm.response.responseSize;
tc.response.status = pm.response.code;
tc.response.time = pm.response.responseTime;
tc.response.text = response?.raw?.responseText;
tc.response.contentType = lodashv4.get(response, 'headers.content-type');
tc.response.cookies = lodashv4.toPairs(lodashv4.get(tc, 'response.cookies')).map(([key, value]) => ({ key, value }));
tc.response.headers = lodashv4.cloneDeep(lodashv4.cloneDeep(pm.response.headers.toJSON()));
tc.response.getHeader = (key) => { return lodashv4.get(response.headers, lodashv4.toLower(key)) };
tc.response.getBinary = () => { console.warn("The tc.getBinary script syntax of Thunder client is not supported.") }
}
} catch (e) {
console.warn("Thunder Client script has an issue; please check manually. EchoAPI is fully compatible with Postman.")
}
`, // 兼容 thuner client
];
const pmEvent = {
prerequest: [],
test: [],
};
const eventMap = {
pre_tasks: "prerequest",
post_tasks: "test",
};
lodash__default["default"].forEach(lodash__default["default"].keys(eventMap), function (type) {
let exec = lodash__default["default"].join(sysScript, "\n");
lodash__default["default"].forEach(
lodash__default["default"].get(request, `request.${type}`),
/** @param {TaskScriptObject} item */
function (item) {
if (lodash__default["default"].isObject(item)) {
if (item.enabled > 0) {
let randomCursor = `_${item.type}_${lodash__default["default"].random(
1,
99999999,
false
)}`;
switch (item.type) {
case "customScript": // done
if (!lodash__default["default"].isEmpty(item?.data) && lodash__default["default"].isString(item?.data) && item?.data != 'undefined') {
if (item?.language == "python") ; else {
exec = `${exec}
${lodash__default["default"].trim(item?.data)}
`;
}
}
break;
case "database": // done
let dbconfig = database_configs[item.data?.connectionId] || {};
if (!lodash__default["default"].isEmpty(dbconfig)) {
dbconfig = JSON.stringify(dbconfig, null, "\t");
exec = `${exec}
! await (async function(){
const dbData${randomCursor} = ${JSON.stringify(item.data || { query: '' })}
const query${randomCursor} = pm.variables.replaceIn(_.get(dbData${randomCursor}, "query"));
const method${randomCursor} = pm.variables.replaceIn(_.get(dbData${randomCursor}, "method") || "");
try{
let dbResult${randomCursor}List = [];
if(${item.data?.isConsoleOutput} > 0){
console.log(query${randomCursor}, dbResult${randomCursor}List)
}
if(_.isObject(dbResult${randomCursor}List)){
_.forEach(${JSON.stringify(item.data?.variables || [])}, function(item) {
let extra_value = jsonpath.value(dbResult${randomCursor}List, _.trim(item?.pattern));
pm[item?.type].set(item?.name, extra_value);
});
}else{
if(!_.isObject(dbResult${randomCursor}List)){
_.forEach(${JSON.stringify(item.data?.variables || [])}, function(item) {
let extra_value = dbResult${randomCursor}List;
pm[item?.type].set(item?.name, extra_value);
});
}
}
}catch(e){
console.error(query${randomCursor}, String(e?.message || e))
};
})();`;
}
break;
case "wait": // done
const timeout = lodash__default["default"].toInteger(item?.data);
if (timeout > 0) {
exec = `${exec}\n
sleep(${timeout});
`;
}
break;
case "assert": //done
exec = `${exec}
!(function(){
let assertObjectData${randomCursor} = ${JSON.stringify(item)};
let responseData${randomCursor} = '';
let expertData${randomCursor} = null;
let expertExpression${randomCursor} = '';
let expertValue${randomCursor} = null;
if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseJson'){
try{
responseData${randomCursor} = pm.response.json();
}catch(e){
responseData${randomCursor} = xml2Json(pm.response.text())
}
expertData${randomCursor} = jsonpath.value(responseData${randomCursor}, _.get(assertObjectData${randomCursor}, "data.expression.path"));
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseXml'){
try{
responseData${randomCursor} = pm.response.text();
var xpath${randomCursor} = require('xpath');
var dom${randomCursor} = require('xmldom').DOMParser;
expertData${randomCursor} = String(xpath${randomCursor}.select(_.get(assertObjectData${randomCursor}, "data.expression.path"), new dom${randomCursor}().parseFromString(responseData${randomCursor}, 'text/xml')));
}catch(e){}
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseText'){
expertData${randomCursor} = pm.response.text();
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseHeader'){
expertData${randomCursor} = pm.response.headers.get(_.get(assertObjectData${randomCursor}, "data.expression.path"));
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseCookie'){
expertData${randomCursor} = _.get(response.cookies, _.get(assertObjectData${randomCursor}, "data.expression.path"));
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseCode'){
expertData${randomCursor} = pm.response.code;
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseTime'){
expertData${randomCursor} = pm.response.responseTime;
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'responseSize'){
expertData${randomCursor} = pm.response.responseSize;
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'tempVars'){
expertData${randomCursor} = pm.variables.get(_.get(assertObjectData${randomCursor}, "data.expression.path"));
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'envVars'){
expertData${randomCursor} = pm.environment.get(_.get(assertObjectData${randomCursor}, "data.expression.path"));
}else if(_.get(assertObjectData${randomCursor}, "data.type") == 'globalVars'){
expertData${randomCursor} = pm.globals.get(_.get(assertObjectData${randomCursor}, "data.expression.path"));
}
expertValue${randomCursor} = pm.variables.replaceIn(_.get(assertObjectData${randomCursor}, "data.expression.compareValue"));
if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "eq"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.eql(String(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "uneq"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.not.eql(String(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "lt"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(lodashv4.toNumber(${"expertData" + randomCursor})).to.be.below(lodashv4.toNumber(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "lte"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(lodashv4.toNumber(${"expertData" + randomCursor})).to.be.at.most(lodashv4.toNumber(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "gt"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(lodashv4.toNumber(${"expertData" + randomCursor})).to.be.above(lodashv4.toNumber(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "gte"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(lodashv4.toNumber(${"expertData" + randomCursor})).to.be.at.least(lodashv4.toNumber(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "includes"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.include(String(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "unincludes"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.not.include(String(${"expertValue" + randomCursor}));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "null"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(${"expertData" + randomCursor}).to.be.empty;
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "notnull"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.not.be.empty;
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "exist"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(${"expertData" + randomCursor}).to.exist;
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "notexist"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(${"expertData" + randomCursor}).to.not.exist;
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "regularmatch"){
expertExpression${randomCursor} = null;
if(!lodashv4.isEmpty(expertValue${randomCursor})){
expertValue${randomCursor} = new RegExp(lodashv4.trim(expertValue${randomCursor}, '/'));
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(${"expertData" + randomCursor}).to.match(expertValue${randomCursor});
});
}
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "belongscollection"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.be.oneOf(lodashv4.split(expertValue${randomCursor}, ","));
});
}else if(_.get(assertObjectData${randomCursor}, "data.expression.compareType") == "notbelongscollection"){
expertExpression${randomCursor} = null;
pm.test(_.get(assertObjectData${randomCursor}, "name"), function () {
pm.expect(String(${"expertData" + randomCursor})).to.not.be.oneOf(lodashv4.split(expertValue${randomCursor}, ","));
});
}
})();
`;
break;
case "pickVars": //done
const varTypeMap = {
tempVars: "variables",
envVars: "environment",
globalVars: "globals",
};
exec = `${exec}\n
!(function(){
`;
switch (item.data?.source) {
case "responseJson":
exec = `${exec}\n
let varSource${randomCursor} = '';
try{
varSource${randomCursor} = pm.response.json();
}catch(e){
varSource${randomCursor} = xml2Json(pm.response.text())
}
`;
break;
case "responseXml":
case "responseText":
exec = `${exec}\n
let varSource${randomCursor} = pm.response.text();
`;
break;
case "responseHeader":
exec = `${exec}\n
let varSource${randomCursor} = pm.response.headers;
`;
break;
case "responseCookie":
exec = `${exec}\n
let varSource${randomCursor} = response.cookies;
`;
break;
case "responseCode":
exec = `${exec}\n
let varSource${randomCursor} = pm.response.code;
`;
break;
case "responseTime":
exec = `${exec}\n
let varSource${randomCursor} = pm.response.responseTime;
`;
break;
case "responseSize":
exec = `${exec}\n
let varSource${randomCursor} = pm.response.responseSize;
`;