@sap/adp-abap
Version:
abap service for all yeoman generators
179 lines • 6.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.stringifyParameters = exports.parseFlpParamString = exports.validateFlpParamString = void 0;
const genericErrorMessage = (error) => `Value cannot be parsed: ${error}! Please check the entered value and if needed create ticket for the application component in order to get the proper value.`;
function validateFlpParamString(paramString) {
if (!paramString) {
return true;
}
try {
parseFlpParamString(paramString);
}
catch (error) {
return error.message;
}
return true;
}
exports.validateFlpParamString = validateFlpParamString;
function parseFlpParamString(paramString) {
let result = {};
const modifiedParamString = addMissingAmpersands(paramString);
const params = modifiedParamString
.split("&")
.map((el) => el.trim())
.filter((el) => el !== "");
params.forEach((param) => {
const isMandatory = rules.isMandatoryParam(param);
if (!isMandatory) {
param = param.replace(/[()]/g, "");
}
const isEmptyParamCheck = rules.isEmptyParam(param);
if (isEmptyParamCheck.shouldApply) {
checkForDuplicatedKeys(result, isEmptyParamCheck.value);
const emptyParam = {};
emptyParam[isEmptyParamCheck.value] = {};
result = Object.assign(result, emptyParam);
}
else {
const paramParts = param
.split("=")
.map((el) => el.trim())
.filter((el) => el !== "");
if (paramParts.length <= 1 || paramParts.length > 3) {
throw new SyntaxError(genericErrorMessage("Invalid parameters string"));
}
result = Object.assign(result, construct(paramParts, isMandatory, result));
}
});
return result;
}
exports.parseFlpParamString = parseFlpParamString;
function addMissingAmpersands(value) {
return value.replace(/[)]\s*[(]/gm, ")&(");
}
function checkForDuplicatedKeys(parameters, key) {
Object.keys(parameters).forEach((existingKey) => {
if (existingKey === key) {
throw new Error(genericErrorMessage(`Duplicated parameter: '${key}'`));
}
});
}
function construct(parts, isMandatory, parameters) {
const resultObject = {};
const paramName = parts[0];
checkForDuplicatedKeys(parameters, paramName);
resultObject[paramName] = {
required: isMandatory
};
if (parts.length === 2) {
const shouldRenameCheck = rules.shouldRenameTo(parts[1]);
if (shouldRenameCheck.shouldApply) {
resultObject[paramName].renameTo = shouldRenameCheck.value;
return resultObject;
}
applyRules(resultObject[paramName], parts[1]);
return resultObject;
}
const secondParamPart = parts[1];
const thirdParamPart = parts[2];
applyRules(resultObject[paramName], secondParamPart);
const shouldRenameCheck = rules.shouldRenameTo(thirdParamPart);
if (shouldRenameCheck.shouldApply) {
resultObject[paramName].renameTo = shouldRenameCheck.value;
}
return resultObject;
}
function applyRules(resultObject, paramPartString) {
const shouldFilterDefaultValueCheck = rules.shouldHavеFiltertValue(paramPartString);
const isReferenceCheck = rules.isReference(paramPartString);
if (shouldFilterDefaultValueCheck.shouldApply && !isReferenceCheck.shouldApply) {
resultObject.filter = {
value: shouldFilterDefaultValueCheck.value,
format: "plain"
};
}
else if (!shouldFilterDefaultValueCheck.shouldApply && !isReferenceCheck.shouldApply) {
resultObject.defaultValue = {
value: paramPartString,
format: "plain"
};
}
else {
resultObject.defaultValue = {
value: isReferenceCheck.value,
format: "reference"
};
}
}
const defaultParamCheck = { shouldApply: false, value: undefined };
const rules = {
isEmptyParam: (paramString) => {
if (/^.+=\s*$/g.test(paramString)) {
return {
shouldApply: true,
value: paramString.replace(/=/g, "").trim()
};
}
return defaultParamCheck;
},
isMandatoryParam: (paramString) => {
return !(paramString.trim().startsWith("(") && paramString.trim().endsWith(")"));
},
shouldHavеFiltertValue: (paramString) => {
if (paramString.startsWith("<") && paramString.endsWith(">")) {
return {
shouldApply: true,
value: paramString.replace(/[<>]/g, "")
};
}
return defaultParamCheck;
},
shouldRenameTo: (paramString) => {
if (paramString.trim().startsWith(">")) {
return {
shouldApply: true,
value: paramString.trim().replace(/>/g, "")
};
}
return defaultParamCheck;
},
isReference: (paramString) => {
if (paramString.startsWith("%%") && paramString.endsWith("%%")) {
return {
shouldApply: true,
value: paramString.replace(/%/g, "")
};
}
return defaultParamCheck;
}
};
function stringifyParameters(parameters) {
const result = [];
for (const [key, options] of Object.entries(parameters)) {
let paramString = key;
if (JSON.stringify(options) === "{}") {
paramString = `(${paramString} = )`;
}
if (options.filter) {
paramString += `=<${options.filter.value}>`;
}
else if (options.defaultValue) {
if (options.defaultValue.format === "reference") {
paramString += `=%%${options.defaultValue.value}%%`;
}
else {
paramString += `=${options.defaultValue.value}`;
}
}
if (options.renameTo) {
paramString += `=>${options.renameTo}`;
}
if (options.required === false) {
paramString = `(${paramString})`;
}
result.push(paramString);
}
return result.join("&");
}
exports.stringifyParameters = stringifyParameters;
//# sourceMappingURL=FlpParameters.js.map