abapmerge
Version:
Merge ABAP INCLUDEs into single file
204 lines • 8.4 kB
JavaScript
;
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var file_list_1 = __importDefault(require("./file_list"));
var pragma_1 = __importDefault(require("./pragma"));
var class_list_1 = __importDefault(require("./class_list"));
var abapmerge_marker_1 = __importDefault(require("./abapmerge_marker"));
var collect_statements_1 = require("./collect_statements");
var Merge = /** @class */ (function () {
function Merge() {
}
Merge.merge = function (files, main, options) {
this.files = files;
if (!options)
options = {};
if (options.skipFUGR) {
this.files = this.skipFUGR(this.files);
}
this.files = pragma_1.default.process(this.files);
this.classes = new class_list_1.default(this.files);
var result = this.analyze(main, this.files.fileByName(main).getContents(), options.newReportName);
this.files.validateAllFilesUsed(options.allowUnused);
if (options.appendAbapmergeMarker) {
result += new abapmerge_marker_1.default().render();
}
return result;
};
Merge.skipFUGR = function (files) {
var filesWithoutFugrs = __spreadArray([], __read(files), false).filter(function (f) { return !f.getFilename().match(/\.fugr\./); });
return new file_list_1.default(filesWithoutFugrs);
};
Merge.analyze = function (main, contents, newReportName) {
var e_1, _a;
var output = "";
var lines = collect_statements_1.CollectStatements.collect(contents).split("\n");
var lineNo = 0;
if (main !== null) {
while (lineNo < lines.length) {
var line = lines[lineNo++];
var regexReportClause = /(^\s*REPORT\s+)([\w/]+)(\s+[^.*]*\.|\s*\.)/im;
var reportClauseMatches = line.match(regexReportClause);
var isMainReport = reportClauseMatches &&
reportClauseMatches[2].toLowerCase() === main.toLowerCase().replace(/#/g, "/");
if (reportClauseMatches) {
if (newReportName) {
line = line.replace(regexReportClause, "$1".concat(newReportName, "$3"));
}
}
output += line + "\n";
if (isMainReport) {
break;
}
}
while (lineNo < lines.length) {
var line = lines[lineNo];
if (!line.match(/^((\*.*)|(\s*))$/im)) {
var classLines = this.classes.getResult().split("\n");
classLines.pop();
// insert the class source code in the array at lineNo, this way they are analyzed later
lines = [].concat(lines.slice(0, lineNo), classLines, lines.slice(lineNo, lines.length));
break;
}
output += line + "\n";
++lineNo;
}
}
for (; lineNo < lines.length; ++lineNo) {
var line = lines[lineNo];
var includes = this.matchIncludeStatement(line);
if (includes) {
try {
for (var includes_1 = (e_1 = void 0, __values(includes)), includes_1_1 = includes_1.next(); !includes_1_1.done; includes_1_1 = includes_1.next()) {
var include = includes_1_1.value;
output = output +
this.comment(include) +
this.analyze(null, this.files.fileByName(include).getContents()) +
"\n";
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (includes_1_1 && !includes_1_1.done && (_a = includes_1.return)) _a.call(includes_1);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
output += line + "\n";
}
}
return output.replace(/\n{3}|\n{2}$/g, "\n");
};
/** returns INCLUDE names if found in current line */
Merge.matchIncludeStatement = function (line) {
var e_2, _a, e_3, _b;
var include = line.match(/^\s*INCLUDE\s+(z\w+)\s*\./i);
if (!include) {
// try namespaced
include = line.match(/^\s*INCLUDE\s+(\/\w+\/\w+)\s*\./i);
if (include) {
include[1] = include[1].replace(/\//g, "#");
}
}
if (!include) {
// try chained
var moo = line.matchAll(/^\s*INCLUDE\s*:\s+(z\w+)(?:,\s*(z\w+))*\s*\./gi);
var found = [];
try {
for (var moo_1 = __values(moo), moo_1_1 = moo_1.next(); !moo_1_1.done; moo_1_1 = moo_1.next()) {
var m = moo_1_1.value;
for (var i = 1; i < 10; i++) {
var element = m[i];
if (element === undefined) {
return found;
}
found.push(element);
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (moo_1_1 && !moo_1_1.done && (_a = moo_1.return)) _a.call(moo_1);
}
finally { if (e_2) throw e_2.error; }
}
}
if (!include) {
// try chained namespaced
var moo = line.matchAll(/^\s*INCLUDE\s*:\s+(\/\w+\/\w+)(?:,\s*(\/\w+\/\w+))*\s*\./gi);
var found = [];
try {
for (var moo_2 = __values(moo), moo_2_1 = moo_2.next(); !moo_2_1.done; moo_2_1 = moo_2.next()) {
var m = moo_2_1.value;
for (var i = 1; i < 10; i++) {
var element = m[i];
if (element === undefined) {
return found;
}
found.push(element);
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (moo_2_1 && !moo_2_1.done && (_b = moo_2.return)) _b.call(moo_2);
}
finally { if (e_3) throw e_3.error; }
}
}
if (include === null) {
return undefined;
}
return [include[1]];
};
Merge.comment = function (name) {
return "****************************************************\n" +
"* abapmerge - " + name.toUpperCase() + "\n" +
"****************************************************\n";
};
return Merge;
}());
exports.default = Merge;
//# sourceMappingURL=merge.js.map