@nimbella/postman-api
Version:
Postman Collection to Nimbella Project: Take your APIs seamlessly into Serverless world with this API
189 lines (188 loc) • 7.33 kB
JavaScript
;
/*
* Copyright (c) 2019 - present Nimbella Corp.
*
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getUnitTests = exports.getGlobalValidations = exports.getMethodValidations = exports.pmToEnvVars = exports.getEnvVars = exports.getFailureSuite = exports.getSuccessSuite = void 0;
const tslib_1 = require("tslib");
const path_1 = require("path");
const fs_1 = require("fs");
const acorn_1 = require("acorn");
const recast_1 = require("recast");
const utils_1 = require("../../utils");
const writer_1 = require("../../writer");
const stub_gen_1 = require("../stub/stub-gen");
const logger_1 = tslib_1.__importDefault(require("../../logger"));
const Handlebars = require("handlebars");
const successSuite = fs_1.readFileSync(path_1.join(__dirname, 'templates', 'success.hbs'));
const successTmpl = Handlebars.compile(successSuite.toString());
const failureSuite = fs_1.readFileSync(path_1.join(__dirname, 'templates', 'fail.hbs'));
const failureTmpl = Handlebars.compile(failureSuite.toString());
function getSuccessSuite(request, response, variables) {
const isPostRequest = request.method.toLowerCase() === 'post';
const responseTime = 500;
const propTypes = [];
const propChildKeys = [];
const envVars = variables.members;
const headers = response ? response.headers.members : [];
const mandatoryProps = response && utils_1.isJson(response.body) ?
Object.keys(JSON.parse(response.body)) :
[];
const res = successTmpl({
isPostRequest,
headers,
responseTime,
propTypes,
propChildKeys,
envVars,
mandatoryProps,
});
return res;
}
exports.getSuccessSuite = getSuccessSuite;
function getFailureSuite() {
const res = failureTmpl({});
return res;
}
exports.getFailureSuite = getFailureSuite;
function getEnvVars(collection = undefined, scripts = undefined) {
const envVars = [];
if (collection) {
collection.variables.members.forEach((e) => {
envVars.push(e.key, e.value, e.description);
});
}
if (scripts && scripts.length > 0) {
scripts
.filter((s) => s.startsWith('pm.environment.set('))
.forEach((e) => {
const kv = e
.replace(/"/g, '')
.replace('pm.environment.set(', '')
.replace(');', '')
.split(',');
envVars.push({ key: kv[0], value: kv[1], description: '' });
});
}
return envVars;
}
exports.getEnvVars = getEnvVars;
function pmToEnvVars(script) {
return script
.replace(/['")]/g, '')
.replace('pm.environment.', 'process.env.')
.replace('postman.setEnvironmentVariable(', 'process.env.')
.replace(',', '=')
.replace('get(', '')
.replace('set(', '')
.replace(/process.env.\b\w+\b/g, l => l.toUpperCase())
.replace('PROCESS.ENV', 'process.env')
.replace('globals.get', 'console.log');
}
exports.pmToEnvVars = pmToEnvVars;
function extractFunctionBody(scripts) {
const ast = acorn_1.Parser.parse(scripts.join('\n'));
let outScript = '';
try {
scripts
.filter((s) => s.startsWith('pm.globals.set('))
.forEach((e) => {
const name = e
.replace('"', '')
.replace(/'/g, '')
.replace('pm.globals.set(', '')
.split(',')[0];
ast.body
.filter((s) => s.type === 'FunctionDeclaration')
.forEach((element) => {
if (element.id.name === name) {
outScript += recast_1.print(element).code;
}
});
});
}
catch (error) {
logger_1.default.error(error);
}
return outScript;
}
function getMethodValidations(scripts = []) {
const globalTests = scripts.filter((s) => s.includes('pm.globals.set('));
let tests = scripts.filter((s) => !s.includes('pm.globals.set('));
if (globalTests.length > 0) {
const consolidatedScript = scripts.join('\n');
const globalFunc = extractFunctionBody(scripts);
tests = consolidatedScript.replace(globalFunc, '').split('\n');
}
tests.forEach((s, i, a) => {
if (s.includes('pm.environment.toObject()')) {
a[i] = a[i].replace(/pm.environment.toObject()/g, 'process.env');
}
if (a[i].includes('pm.environment.') ||
a[i].includes('postman.setEnvironmentVariable.')) {
a[i] = pmToEnvVars(a[i]);
}
if (a[i].includes('pm.variables.')) {
a[i] = a[i].replace(/pm.variables/g, 'nimbella.redis()');
}
});
return tests;
}
exports.getMethodValidations = getMethodValidations;
function getGlobalValidations(scripts) {
const script = extractFunctionBody(scripts);
const outScriptArray = script.split('\n');
outScriptArray.forEach((e, i, a) => {
if (a[i].includes('pm.environment.') ||
a[i].includes('postman.setEnvironmentVariable.')) {
a[i] = pmToEnvVars(e);
}
});
return outScriptArray.join('\n');
}
exports.getGlobalValidations = getGlobalValidations;
async function getUnitTests(item, location, packageName, actionName) {
const tests = item.events.members.filter((i) => i.listen === 'test');
if (tests.length > 0) {
const scripts = tests[0].script.exec || [];
scripts.forEach(async (e, i, a) => {
if (a[i].includes('pm.environment.toObject()')) {
a[i] = a[i].replace(/pm.environment.toObject()/g, 'process.env');
}
if (a[i].includes('globals.get')) {
const includeScript = await stub_gen_1.getIncludeFile(['validations']);
writer_1.writeFile({
location: path_1.join(location, 'packages', packageName, actionName),
name: '',
ext: 'include',
verbose: true,
}, includeScript.content);
}
if (a[i].includes('pm.environment.') ||
a[i].includes('postman.setEnvironmentVariable.')) {
a[i] = pmToEnvVars(a[i]);
}
if (a[i].includes('pm.variables.')) {
a[i] = a[i].replace(/pm.variables/g, 'nimbella.redis()');
}
a[i] = a[i]
.replace(/pm./g, '')
.replace(/postman./g, '')
.replace('setNextRequest', 'console.log')
.replace('stopWorkflow', 'console.log')
.replace('globals.get', 'console.log');
});
return scripts;
}
return [];
}
exports.getUnitTests = getUnitTests;