UNPKG

abapmerge

Version:

Merge ABAP INCLUDEs into single file

204 lines 8.4 kB
"use strict"; 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