@abaplint/cli 2.93.5 → 2.93.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/cli",
3
- "version": "2.93.5",
3
+ "version": "2.93.8",
4
4
  "description": "abaplint - Command Line Interface",
5
5
  "bin": {
6
6
  "abaplint": "./abaplint"
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "homepage": "https://abaplint.org",
41
41
  "devDependencies": {
42
- "@abaplint/core": "^2.93.5",
42
+ "@abaplint/core": "^2.93.8",
43
43
  "@types/chai": "^4.3.3",
44
44
  "@types/glob": "^7.2.0",
45
45
  "@types/minimist": "^1.2.2",
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApackDependencyProvider = void 0;
4
- const xml_js_1 = require("xml-js");
5
- class ApackDependencyProvider {
6
- static fromManifest(manifestContents) {
7
- var _a, _b;
8
- if (!manifestContents || !manifestContents.length) {
9
- return [];
10
- }
11
- const result = [];
12
- const manifest = (0, xml_js_1.xml2js)(manifestContents, { compact: true });
13
- let apackDependencies = (_b = (_a = manifest["asx:abap"]["asx:values"]["DATA"]) === null || _a === void 0 ? void 0 : _a["DEPENDENCIES"]) === null || _b === void 0 ? void 0 : _b.item;
14
- if (!apackDependencies) {
15
- return [];
16
- }
17
- else if (!apackDependencies.length) {
18
- apackDependencies = [apackDependencies];
19
- }
20
- for (const dependency of apackDependencies) {
21
- result.push({
22
- files: "/src/**/*.*",
23
- url: dependency["GIT_URL"]["_text"],
24
- });
25
- }
26
- return result;
27
- }
28
- }
29
- exports.ApackDependencyProvider = ApackDependencyProvider;
30
- //# sourceMappingURL=apack_dependency_provider.js.map
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CompressedFile = void 0;
4
- const core_1 = require("@abaplint/core");
5
- const zlib = require("zlib");
6
- class CompressedFile extends core_1.AbstractFile {
7
- constructor(filename, compressed) {
8
- super(filename);
9
- this.compressed = compressed;
10
- }
11
- getRaw() {
12
- return this.decompress(this.compressed);
13
- }
14
- getRawRows() {
15
- return this.decompress(this.compressed).split("\n");
16
- }
17
- decompress(compressed) {
18
- return zlib.inflateSync(Buffer.from(compressed, "base64")).toString("utf8");
19
- }
20
- }
21
- exports.CompressedFile = CompressedFile;
22
- //# sourceMappingURL=compressed_file.js.map
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FileOperations = void 0;
4
- const fs = require("fs");
5
- const path = require("path");
6
- const zlib = require("zlib");
7
- const glob = require("glob");
8
- const core_1 = require("@abaplint/core");
9
- const compressed_file_1 = require("./compressed_file");
10
- class FileOperations {
11
- static deleteFolderRecursive(dir) {
12
- if (fs.existsSync(dir) === false) {
13
- return;
14
- }
15
- fs.rmSync(dir, { recursive: true });
16
- }
17
- static loadFileNames(arg, error = true) {
18
- const files = glob.sync(arg, { nosort: true, nodir: true });
19
- if (files.length === 0 && error) {
20
- throw "Error: No files found";
21
- }
22
- return files;
23
- }
24
- static async loadFiles(compress, input, bar) {
25
- const files = [];
26
- bar.set(input.length, "Reading files");
27
- for (const filename of input) {
28
- bar.tick("Reading files - " + path.basename(filename));
29
- const base = filename.split("/").reverse()[0];
30
- if (base.split(".").length <= 2) {
31
- continue; // not a abapGit file
32
- }
33
- // note that readFileSync is typically faster than async readFile,
34
- // https://medium.com/@adamhooper/node-synchronous-code-runs-faster-than-asynchronous-code-b0553d5cf54e
35
- const raw = fs.readFileSync(filename, "utf8");
36
- if (compress === true) {
37
- // todo, util.promisify(zlib.deflate) does not seem to work?
38
- files.push(new compressed_file_1.CompressedFile(filename, zlib.deflateSync(raw).toString("base64")));
39
- }
40
- else {
41
- files.push(new core_1.MemoryFile(filename, raw));
42
- }
43
- }
44
- return files;
45
- }
46
- }
47
- exports.FileOperations = FileOperations;
48
- //# sourceMappingURL=file_operations.js.map
@@ -1,110 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApplyFixes = void 0;
4
- /* eslint-disable max-len */
5
- const core_1 = require("@abaplint/core");
6
- class ApplyFixes {
7
- constructor() {
8
- this.changedFiles = new Set();
9
- }
10
- // Strategy:
11
- // Execute one rule at a time and apply fixes for that rule
12
- // Some rules are quite expensive to initialize(like downport),
13
- // so running all rules every time is expensive.
14
- async applyFixes(reg, fs, quiet) {
15
- let iteration = 0;
16
- this.changedFiles.clear();
17
- const MAX_ITERATIONS = 50000;
18
- const objects = new core_1.RulesRunner(reg).objectsToCheck(reg.getObjects());
19
- const rules = reg.getConfig().getEnabledRules();
20
- while (iteration <= MAX_ITERATIONS) {
21
- let changed = 0;
22
- for (const rule of rules) {
23
- while (iteration <= MAX_ITERATIONS) {
24
- const before = Date.now();
25
- rule.initialize(reg);
26
- const issues = [];
27
- for (const obj of objects) {
28
- issues.push(...rule.run(obj));
29
- }
30
- iteration++;
31
- const appliedCount = this.applyList(issues, reg).length;
32
- const runtime = Date.now() - before;
33
- if (quiet !== true) {
34
- process.stderr.write(`\tIteration ${iteration}, ${appliedCount} fixes applied, ${runtime}ms, \trule ${rule.getMetadata().key}\n`);
35
- }
36
- if (appliedCount > 0) {
37
- changed += appliedCount;
38
- const before = Date.now();
39
- reg.parse();
40
- const runtime = Date.now() - before;
41
- if (quiet !== true) {
42
- process.stderr.write(`\tParse, ${runtime}ms\n`);
43
- }
44
- }
45
- else {
46
- break;
47
- }
48
- }
49
- }
50
- if (changed === 0) {
51
- break;
52
- }
53
- }
54
- this.writeChangesToFS(fs, reg);
55
- }
56
- ///////////////////////////////////////////////////
57
- writeChangesToFS(fs, reg) {
58
- for (const filename of this.changedFiles.values()) {
59
- const file = reg.getFileByName(filename);
60
- if (file === undefined) {
61
- continue;
62
- }
63
- fs.writeFileSync(file.getFilename(), file.getRaw());
64
- }
65
- }
66
- possibleOverlap(edit, list) {
67
- // only checks if the edits have changes in the same rows
68
- for (const e of list) {
69
- for (const file1 of Object.keys(e)) {
70
- for (const file2 of Object.keys(edit)) {
71
- if (file1 === file2) {
72
- for (const list1 of e[file1]) {
73
- for (const list2 of edit[file2]) {
74
- if (list2.range.start.getRow() <= list1.range.start.getRow()
75
- && list2.range.end.getRow() >= list1.range.start.getRow()) {
76
- return true;
77
- }
78
- if (list2.range.start.getRow() <= list1.range.start.getRow()
79
- && list2.range.end.getRow() >= list1.range.end.getRow()) {
80
- return true;
81
- }
82
- }
83
- }
84
- }
85
- }
86
- }
87
- }
88
- return false;
89
- }
90
- applyList(issues, reg) {
91
- const edits = [];
92
- for (const i of issues) {
93
- const edit = i.getFix();
94
- if (edit === undefined) {
95
- continue;
96
- }
97
- else if (this.possibleOverlap(edit, edits) === true) {
98
- continue;
99
- }
100
- edits.push(edit);
101
- }
102
- const changed = (0, core_1.applyEditList)(reg, edits);
103
- for (const filename of changed) {
104
- this.changedFiles.add(filename);
105
- }
106
- return changed;
107
- }
108
- }
109
- exports.ApplyFixes = ApplyFixes;
110
- //# sourceMappingURL=fixes.js.map
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Formatter = void 0;
4
- const Formatters = require(".");
5
- class Formatter {
6
- static format(issues, format, fileCount) {
7
- // todo, this can be done more generic, move to artifacts.ts?
8
- switch (format) {
9
- case "total":
10
- return new Formatters.Total().output(issues, fileCount);
11
- case "json":
12
- return new Formatters.Json().output(issues, fileCount);
13
- case "junit":
14
- return new Formatters.Junit().output(issues, fileCount);
15
- case "codeframe":
16
- return new Formatters.CodeFrame().output(issues, fileCount);
17
- default:
18
- return new Formatters.Standard().output(issues, fileCount);
19
- }
20
- }
21
- }
22
- exports.Formatter = Formatter;
23
- //# sourceMappingURL=_format.js.map
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=_iformatter.js.map
@@ -1,74 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeFrame = void 0;
4
- const total_1 = require("./total");
5
- const fs = require("fs");
6
- const chalk_1 = require("chalk");
7
- function issueSort(a, b) {
8
- return a.filename.localeCompare(b.filename)
9
- || (a.row - b.row)
10
- || (a.col - b.col);
11
- }
12
- class CodeFrame {
13
- constructor() {
14
- this.currentFilename = "";
15
- this.currentFileLinesCount = 0;
16
- this.fileContent = [];
17
- }
18
- output(issues, fileCount) {
19
- const builtIssues = this.convertAllIssues(issues).sort(issueSort); // Make sure it is sorted by filename for caching to work
20
- return [
21
- ...builtIssues.map(i => this.renderIssue(i)),
22
- (issues.length > 0 ? chalk_1.default.red(new total_1.Total().output(issues, fileCount)) : chalk_1.default.green(new total_1.Total().output(issues, fileCount))),
23
- ].join("\n");
24
- }
25
- convertAllIssues(issues) {
26
- return issues.map(i => this.convertIssue(i));
27
- }
28
- cacheFile(filename) {
29
- if (filename !== this.currentFilename) {
30
- this.currentFilename = filename;
31
- this.fileContent = fs.readFileSync(filename, "utf8").split(/\r?\n/);
32
- this.currentFileLinesCount = this.fileContent.length;
33
- }
34
- }
35
- renderIssue(issue) {
36
- this.cacheFile(issue.filename);
37
- const frameSize = 1;
38
- const lineFrom = Math.max(issue.row - frameSize, 1);
39
- const lineTo = Math.min(issue.row + frameSize, this.currentFileLinesCount);
40
- const issueLineIndex = issue.row - 1;
41
- const padSize = Math.ceil(Math.log10(lineTo)) + 4;
42
- const code = [];
43
- for (let lineIndex = lineFrom - 1; lineIndex < lineTo; lineIndex++) {
44
- const prefix = `${ /*(lineIndex === issueLineIndex) ? ">" :*/" "}${lineIndex + 1} |`.padStart(padSize);
45
- code.push(prefix + this.fileContent[lineIndex]);
46
- if (lineIndex === issueLineIndex) {
47
- code.push("|".padStart(padSize) + " ".repeat(issue.col - 1) + "^");
48
- }
49
- }
50
- const severityStr = issue.severity === "E"
51
- ? chalk_1.default.red(issue.severity)
52
- : chalk_1.default.yellow(issue.severity);
53
- return `[${severityStr}] ${issue.description} (${issue.issueKey}) @ ${issue.location}`
54
- + "\n"
55
- + code.map(str => chalk_1.default.grey(str)).join("\n")
56
- + "\n";
57
- }
58
- renderLocation(issue) {
59
- return issue.getFilename() + "[" + issue.getStart().getRow() + ", " + issue.getStart().getCol() + "]";
60
- }
61
- convertIssue(issue) {
62
- return {
63
- location: this.renderLocation(issue),
64
- description: issue.getMessage(),
65
- issueKey: issue.getKey(),
66
- filename: issue.getFilename(),
67
- severity: issue.getSeverity().toString().charAt(0),
68
- row: issue.getStart().getRow(),
69
- col: issue.getStart().getCol(),
70
- };
71
- }
72
- }
73
- exports.CodeFrame = CodeFrame;
74
- //# sourceMappingURL=codeframe.js.map
@@ -1,22 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./json"), exports);
18
- __exportStar(require("./junit"), exports);
19
- __exportStar(require("./standard"), exports);
20
- __exportStar(require("./total"), exports);
21
- __exportStar(require("./codeframe"), exports);
22
- //# sourceMappingURL=index.js.map
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Json = void 0;
4
- class Json {
5
- output(issues, _fileCount) {
6
- const out = [];
7
- for (const issue of issues) {
8
- const single = {
9
- description: issue.getMessage(),
10
- key: issue.getKey(),
11
- file: issue.getFilename(),
12
- start: {
13
- row: issue.getStart().getRow(),
14
- col: issue.getStart().getCol(),
15
- },
16
- end: {
17
- row: issue.getEnd().getRow(),
18
- col: issue.getEnd().getCol(),
19
- },
20
- severity: issue.getSeverity(),
21
- };
22
- out.push(single);
23
- }
24
- return JSON.stringify(out) + "\n";
25
- }
26
- }
27
- exports.Json = Json;
28
- //# sourceMappingURL=json.js.map
@@ -1,91 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Junit = void 0;
4
- const xml_js_1 = require("xml-js");
5
- const fs = require("fs");
6
- class Junit {
7
- constructor() {
8
- this.currentFilename = "";
9
- this.currentFileLinesCount = 0;
10
- this.fileContent = [];
11
- }
12
- output(issues, _fileCount) {
13
- const outputObj = {
14
- _declaration: {
15
- _attributes: {
16
- version: "1.0",
17
- encoding: "UTF-8",
18
- },
19
- },
20
- testsuites: {
21
- testsuite: {
22
- _attributes: {
23
- name: "abaplint",
24
- tests: issues.length || 1,
25
- failures: issues.length,
26
- errors: 0,
27
- skipped: 0,
28
- },
29
- testcase: [],
30
- },
31
- },
32
- };
33
- if (issues.length > 0) {
34
- for (const issue of issues) {
35
- outputObj.testsuites.testsuite.testcase.push({
36
- _attributes: {
37
- classname: issue.getFilename().split(".")[0],
38
- file: issue.getFilename(),
39
- name: `${issue.getFilename()}: [${issue.getStart().getRow()}, ${issue.getStart().getCol()}] - ${issue.getKey()}`,
40
- },
41
- failure: {
42
- _attributes: {
43
- message: this.formatFailureMessage(issue.getMessage()),
44
- type: issue.getSeverity().toString(),
45
- },
46
- _cdata: `${this.renderIssue(issue)}`,
47
- },
48
- });
49
- }
50
- }
51
- else {
52
- outputObj.testsuites.testsuite.testcase.push({
53
- _attributes: {
54
- classname: "none",
55
- name: "OK",
56
- },
57
- });
58
- }
59
- const xml = (0, xml_js_1.js2xml)(outputObj, { compact: true, spaces: 2 });
60
- return xml;
61
- }
62
- cacheFile(filename) {
63
- if (filename !== this.currentFilename) {
64
- this.currentFilename = filename;
65
- this.fileContent = fs.readFileSync(filename, "utf8").split(/\r?\n/);
66
- this.currentFileLinesCount = this.fileContent.length;
67
- }
68
- }
69
- renderIssue(issue) {
70
- this.cacheFile(issue.getFilename());
71
- const frameSize = 1;
72
- const lineFrom = Math.max(issue.getStart().getRow() - frameSize, 1);
73
- const lineTo = Math.min(issue.getStart().getRow() + frameSize, this.currentFileLinesCount);
74
- const issueLineIndex = issue.getStart().getRow() - 1;
75
- const padSize = Math.ceil(Math.log10(lineTo)) + 4;
76
- const code = [];
77
- for (let lineIndex = lineFrom - 1; lineIndex < lineTo; lineIndex++) {
78
- const prefix = `${lineIndex + 1} | `.padStart(padSize, "0");
79
- code.push(prefix + this.fileContent[lineIndex]);
80
- if (lineIndex === issueLineIndex) {
81
- code.push("| ".padStart(padSize) + " ".repeat(issue.getStart().getCol() - 1) + "^");
82
- }
83
- }
84
- return code.map(str => str).join("\n");
85
- }
86
- formatFailureMessage(message) {
87
- return message.replace("<", "").replace(">", "");
88
- }
89
- }
90
- exports.Junit = Junit;
91
- //# sourceMappingURL=junit.js.map
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Standard = void 0;
4
- const total_1 = require("./total");
5
- class Standard {
6
- output(issues, fileCount) {
7
- const tuples = [];
8
- for (const issue of issues) {
9
- tuples.push(this.build(issue));
10
- }
11
- tuples.sort((a, b) => {
12
- const nameCompare = a.rawFilename.localeCompare(b.rawFilename);
13
- if (nameCompare === 0) {
14
- const rowCompare = a.startPos.getRow() - b.startPos.getRow();
15
- if (rowCompare === 0) {
16
- return a.startPos.getCol() - b.startPos.getCol();
17
- }
18
- else {
19
- return rowCompare;
20
- }
21
- }
22
- else {
23
- return nameCompare;
24
- }
25
- });
26
- const result = this.columns(tuples);
27
- return result + new total_1.Total().output(issues, fileCount);
28
- }
29
- columns(issues) {
30
- let max = 0;
31
- issues.forEach((tuple) => { if (max < tuple.filename.length) {
32
- max = tuple.filename.length;
33
- } });
34
- let result = "";
35
- issues.forEach((issue) => {
36
- result = result +
37
- this.pad(issue.filename, max - issue.filename.length) +
38
- issue.description +
39
- ` [${issue.severity.charAt(0)}]\n`; //E/W/I
40
- });
41
- return result;
42
- }
43
- pad(input, length) {
44
- let output = input;
45
- for (let i = 0; i < length; i++) {
46
- output = output + " ";
47
- }
48
- return output + " - ";
49
- }
50
- build(issue) {
51
- return {
52
- filename: issue.getFilename() + "[" + issue.getStart().getRow() + ", " + issue.getStart().getCol() + "]",
53
- description: issue.getMessage() + " (" + issue.getKey() + ")",
54
- startPos: issue.getStart(),
55
- rawFilename: issue.getFilename(),
56
- severity: issue.getSeverity().toString(),
57
- };
58
- }
59
- }
60
- exports.Standard = Standard;
61
- //# sourceMappingURL=standard.js.map
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Total = void 0;
4
- class Total {
5
- output(issues, fileCount) {
6
- return "abaplint: " + issues.length + " issue(s) found, " + fileCount + " file(s) analyzed\n";
7
- }
8
- }
9
- exports.Total = Total;
10
- //# sourceMappingURL=total.js.map
@@ -1,20 +0,0 @@
1
- import { Issue, IRegistry } from "@abaplint/core";
2
- export declare const GENERIC_ERROR = "generic_error";
3
- export declare type Arguments = {
4
- configFilename?: string;
5
- format: string;
6
- compress?: boolean;
7
- parsingPerformance?: boolean;
8
- showHelp?: boolean;
9
- showVersion?: boolean;
10
- outputDefaultConfig?: boolean;
11
- runFix?: boolean;
12
- runRename?: boolean;
13
- outFormat?: string;
14
- outFile?: string;
15
- };
16
- export declare function run(arg: Arguments): Promise<{
17
- output: string;
18
- issues: Issue[];
19
- reg: IRegistry | undefined;
20
- }>;