@abaplint/core 2.85.23 → 2.85.26

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.
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SQLAsName = void 0;
4
+ const tokens_1 = require("../../1_lexer/tokens");
4
5
  const combi_1 = require("../combi");
5
6
  class SQLAsName extends combi_1.Expression {
6
7
  getRunnable() {
7
8
  // todo, below allows too much?
8
- return (0, combi_1.regex)(/^[&_!]?\*?\w*(\/\w+\/)?\d*[a-zA-Z_%\$][\w\*%\$\?]*(~\w+)?$/);
9
+ const field = (0, combi_1.regex)(/^[&_!]?\*?\w*(\/\w+\/)?\d*[a-zA-Z_%\$][\w\*%\$\?]*(~\w+)?$/);
10
+ return (0, combi_1.seq)(field, (0, combi_1.starPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.Dash), field)));
9
11
  }
10
12
  }
11
13
  exports.SQLAsName = SQLAsName;
@@ -16,9 +16,8 @@ class SQLCompare extends combi_1.Expression {
16
16
  const nul = (0, combi_1.seq)("IS", (0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)("NULL", (0, combi_1.ver)(version_1.Version.v753, "INITIAL")));
17
17
  const source = new _1.SQLSource();
18
18
  const sub = (0, combi_1.seq)((0, combi_1.optPrio)((0, combi_1.altPrio)("ALL", "ANY", "SOME")), subSelect);
19
- const builtin = (0, combi_1.ver)(version_1.Version.v751, (0, combi_1.seq)((0, combi_1.altPrio)("lower", "upper"), (0, combi_1.tok)(tokens_1.ParenLeftW), _1.SQLFieldName, (0, combi_1.tok)(tokens_1.WParenRightW)));
20
19
  const arith = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.plusPrio)((0, combi_1.seq)((0, combi_1.altPrio)("+", "-", "*", "/"), _1.SQLFieldName)));
21
- const rett = (0, combi_1.seq)((0, combi_1.altPrio)(builtin, (0, combi_1.seq)(_1.SQLFieldName, (0, combi_1.optPrio)(arith))), (0, combi_1.altPrio)((0, combi_1.seq)(_1.SQLCompareOperator, (0, combi_1.altPrio)(sub, source)), (0, combi_1.seq)((0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)(inn, like, between)), nul));
20
+ const rett = (0, combi_1.seq)((0, combi_1.altPrio)(_1.SQLFunction, (0, combi_1.seq)(_1.SQLFieldName, (0, combi_1.optPrio)(arith))), (0, combi_1.altPrio)((0, combi_1.seq)(_1.SQLCompareOperator, (0, combi_1.altPrio)(sub, source)), (0, combi_1.seq)((0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)(inn, like, between)), nul));
22
21
  const exists = (0, combi_1.seq)("EXISTS", subSelect);
23
22
  return (0, combi_1.altPrio)(exists, _1.Dynamic, rett);
24
23
  }
@@ -12,7 +12,7 @@ class SQLFieldList extends combi_1.Expression {
12
12
  getRunnable() {
13
13
  const comma = (0, combi_1.optPrio)((0, combi_1.ver)(version_1.Version.v740sp05, ","));
14
14
  const abap = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WAt), simple_field_chain_1.SimpleFieldChain));
15
- const as = (0, combi_1.seq)("AS", _1.Field);
15
+ const as = (0, combi_1.seq)("AS", _1.SQLAsName);
16
16
  const field = (0, combi_1.altPrio)(_1.SQLAggregation, _1.SQLCase, sql_function_1.SQLFunction, sql_path_1.SQLPath, _1.SQLFieldName, abap, _1.Constant);
17
17
  const sub = (0, combi_1.plusPrio)((0, combi_1.seq)((0, combi_1.altPrio)("+", "-", "*", "/", "&&"), (0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.WParenLeftW)), field, (0, combi_1.optPrio)((0, combi_1.tok)(tokens_1.WParenRightW))));
18
18
  const arith = (0, combi_1.ver)(version_1.Version.v740sp05, sub);
@@ -8,9 +8,13 @@ const combi_1 = require("../combi");
8
8
  const integer_1 = require("./integer");
9
9
  const sql_alias_field_1 = require("./sql_alias_field");
10
10
  const sql_field_name_1 = require("./sql_field_name");
11
+ const simple_source3_1 = require("./simple_source3");
12
+ const source_1 = require("./source");
11
13
  class SQLFunction extends combi_1.Expression {
12
14
  getRunnable() {
13
- const param = (0, combi_1.alt)(sql_field_name_1.SQLFieldName, sql_alias_field_1.SQLAliasField, SQLFunction, constant_1.Constant);
15
+ const paren = (0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), source_1.Source, (0, combi_1.tok)(tokens_1.WParenRightW));
16
+ const at = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WAt), (0, combi_1.alt)(simple_source3_1.SimpleSource3, paren)));
17
+ const param = (0, combi_1.alt)(sql_field_name_1.SQLFieldName, sql_alias_field_1.SQLAliasField, SQLFunction, constant_1.Constant, at);
14
18
  const castTypes = (0, combi_1.altPrio)((0, combi_1.seq)("CHAR", (0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)), "FLTP");
15
19
  const abs = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)("abs", (0, combi_1.tok)(tokens_1.ParenLeftW), param, (0, combi_1.tok)(tokens_1.WParenRightW)));
16
20
  const cast = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)("cast", (0, combi_1.tok)(tokens_1.ParenLeftW), param, "AS", castTypes, (0, combi_1.tok)(tokens_1.WParenRightW)));
@@ -20,10 +24,12 @@ class SQLFunction extends combi_1.Expression {
20
24
  const div = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)("div", (0, combi_1.tok)(tokens_1.ParenLeftW), param, ",", param, (0, combi_1.tok)(tokens_1.WParenRightW)));
21
25
  const floor = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)("floor", (0, combi_1.tok)(tokens_1.ParenLeftW), param, (0, combi_1.tok)(tokens_1.WParenRightW)));
22
26
  const length = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)("length", (0, combi_1.tok)(tokens_1.ParenLeftW), param, (0, combi_1.tok)(tokens_1.WParenRightW)));
27
+ const lower = (0, combi_1.ver)(version_1.Version.v751, (0, combi_1.seq)("lower", (0, combi_1.tok)(tokens_1.ParenLeftW), param, (0, combi_1.tok)(tokens_1.WParenRightW)));
23
28
  const mod = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)("mod", (0, combi_1.tok)(tokens_1.ParenLeftW), param, ",", param, (0, combi_1.tok)(tokens_1.WParenRightW)));
24
29
  const replace = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)("replace", (0, combi_1.tok)(tokens_1.ParenLeftW), param, ",", param, ",", param, (0, combi_1.tok)(tokens_1.WParenRightW)));
30
+ const upper = (0, combi_1.ver)(version_1.Version.v751, (0, combi_1.seq)("upper", (0, combi_1.tok)(tokens_1.ParenLeftW), param, (0, combi_1.tok)(tokens_1.WParenRightW)));
25
31
  const uuid = (0, combi_1.ver)(version_1.Version.v754, (0, combi_1.seq)("uuid", (0, combi_1.tok)(tokens_1.ParenLeftW), (0, combi_1.tok)(tokens_1.WParenRightW)));
26
- return (0, combi_1.altPrio)(uuid, abs, ceil, floor, cast, div, mod, coalesce, concat, replace, length);
32
+ return (0, combi_1.altPrio)(uuid, abs, ceil, floor, cast, div, mod, coalesce, concat, replace, length, lower, upper);
27
33
  }
28
34
  }
29
35
  exports.SQLFunction = SQLFunction;
@@ -131,6 +131,7 @@ class BuiltIn {
131
131
  ret.push(this.buildConstant("col_heading", new basic_1.IntegerType(), "1"));
132
132
  ret.push(this.buildConstant("col_key", new basic_1.IntegerType(), "4"));
133
133
  ret.push(this.buildConstant("col_negative", new basic_1.IntegerType(), "6"));
134
+ ret.push(this.buildConstant("col_group", new basic_1.IntegerType(), "7"));
134
135
  ret.push(this.buildConstant("col_normal", new basic_1.IntegerType(), "2"));
135
136
  ret.push(this.buildConstant("col_positive", new basic_1.IntegerType(), "5"));
136
137
  ret.push(this.buildConstant("col_total", new basic_1.IntegerType(), "3"));
@@ -72,8 +72,11 @@ class Source {
72
72
  case "SWITCH":
73
73
  {
74
74
  const foundType = this.determineType(node, scope, filename, targetType);
75
- new switch_body_1.SwitchBody().runSyntax(node.findDirectExpression(Expressions.SwitchBody), scope, filename);
76
- return foundType;
75
+ const bodyType = new switch_body_1.SwitchBody().runSyntax(node.findDirectExpression(Expressions.SwitchBody), scope, filename);
76
+ if (foundType === undefined) {
77
+ this.addIfInferred(node, scope, filename, bodyType);
78
+ }
79
+ return foundType ? foundType : bodyType;
77
80
  }
78
81
  case "COND":
79
82
  {
@@ -8,9 +8,18 @@ class SwitchBody {
8
8
  if (node === undefined) {
9
9
  return;
10
10
  }
11
+ const thenSource = node.findExpressionAfterToken("THEN");
12
+ if (!((thenSource === null || thenSource === void 0 ? void 0 : thenSource.get()) instanceof Expressions.Source)) {
13
+ throw new Error("SwitchBody, unexpected");
14
+ }
15
+ const type = new source_1.Source().runSyntax(thenSource, scope, filename);
11
16
  for (const s of node.findDirectExpressions(Expressions.Source)) {
17
+ if (s === thenSource) {
18
+ continue;
19
+ }
12
20
  new source_1.Source().runSyntax(s, scope, filename);
13
21
  }
22
+ return type;
14
23
  }
15
24
  }
16
25
  exports.SwitchBody = SwitchBody;
@@ -68,7 +68,7 @@ class Registry {
68
68
  }
69
69
  static abaplintVersion() {
70
70
  // magic, see build script "version.sh"
71
- return "2.85.23";
71
+ return "2.85.26";
72
72
  }
73
73
  getDDICReferences() {
74
74
  return this.references;
@@ -44,19 +44,21 @@ Current rules:
44
44
  * CONV is outlined
45
45
  * COND is outlined
46
46
  * REDUCE is outlined
47
+ * SWITCH is outlined
48
+ * APPEND expression is outlined
47
49
  * EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
48
50
  * CAST changed to ?=
49
51
  * LOOP AT method_call( ) is outlined
50
52
  * VALUE # with structure fields
51
53
  * VALUE # with internal table lines
52
- * Table Expressions[ index ] are outlined
54
+ * Table Expressions are outlined
53
55
  * SELECT INTO @DATA definitions are outlined
54
56
  * Some occurrences of string template formatting option ALPHA changed to function module call
55
57
  * SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
56
58
  * PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
57
59
  * RAISE EXCEPTION ... MESSAGE
58
- * APPEND expression is outlined
59
- * Moving with +=, -=, /=, *=, &&=
60
+ * Moving with +=, -=, /=, *=, &&= is expanded
61
+ * line_exists and line_index is downported to READ TABLE
60
62
 
61
63
  Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.`,
62
64
  tags: [_irule_1.RuleTag.Experimental, _irule_1.RuleTag.Downport, _irule_1.RuleTag.Quickfix],
@@ -192,6 +194,10 @@ Only one transformation is applied to a statement at a time, so multiple steps m
192
194
  if (found) {
193
195
  return found;
194
196
  }
197
+ found = this.outlineSwitch(high, lowFile, highSyntax);
198
+ if (found) {
199
+ return found;
200
+ }
195
201
  found = this.outlineCast(high, lowFile, highSyntax);
196
202
  if (found) {
197
203
  return found;
@@ -224,7 +230,11 @@ Only one transformation is applied to a statement at a time, so multiple steps m
224
230
  if (found) {
225
231
  return found;
226
232
  }
227
- // todo, line_exists() should be replaced before this call
233
+ found = this.replaceLineFunctions(high, lowFile, highSyntax);
234
+ if (found) {
235
+ return found;
236
+ }
237
+ // note: line_exists() must be replaced before this call
228
238
  found = this.replaceTableExpression(high, lowFile, highSyntax);
229
239
  if (found) {
230
240
  return found;
@@ -233,7 +243,6 @@ Only one transformation is applied to a statement at a time, so multiple steps m
233
243
  if (found) {
234
244
  return found;
235
245
  }
236
- // todo, add more rules here
237
246
  return undefined;
238
247
  }
239
248
  //////////////////////////////////////////
@@ -405,16 +414,11 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
405
414
  return undefined;
406
415
  }
407
416
  replaceTableExpression(node, lowFile, highSyntax) {
408
- var _a;
409
417
  for (const fieldChain of node.findAllExpressionsRecursive(Expressions.FieldChain)) {
410
418
  const tableExpression = fieldChain.findDirectExpression(Expressions.TableExpression);
411
419
  if (tableExpression === undefined) {
412
420
  continue;
413
421
  }
414
- if (tableExpression.getChildren().length > 3) {
415
- // for now, only support the INDEX scenario
416
- continue;
417
- }
418
422
  let pre = "";
419
423
  let startToken = undefined;
420
424
  for (const child of fieldChain.getChildren()) {
@@ -429,11 +433,24 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
429
433
  if (startToken === undefined) {
430
434
  continue;
431
435
  }
436
+ let condition = "";
437
+ for (const c of tableExpression.getChildren() || []) {
438
+ if (c.getFirstToken().getStr() === "[" || c.getFirstToken().getStr() === "]") {
439
+ continue;
440
+ }
441
+ else if (c.get() instanceof Expressions.ComponentChainSimple && condition === "") {
442
+ condition = "WITH KEY ";
443
+ }
444
+ else if (c.get() instanceof Expressions.Source && condition === "") {
445
+ condition = "INDEX ";
446
+ }
447
+ condition += c.concatTokens() + " ";
448
+ }
432
449
  const uniqueName = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
433
450
  const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
434
451
  const firstToken = node.getFirstToken();
435
452
  const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
436
- ${indentation}READ TABLE ${pre} INDEX ${(_a = tableExpression.findFirstExpression(Expressions.Source)) === null || _a === void 0 ? void 0 : _a.concatTokens()} INTO ${uniqueName}.
453
+ ${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
437
454
  ${indentation}IF sy-subrc <> 0.
438
455
  ${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
439
456
  ${indentation}ENDIF.
@@ -732,6 +749,67 @@ ${indentation} output = ${topTarget}.`;
732
749
  }
733
750
  return { body, end };
734
751
  }
752
+ outlineSwitch(node, lowFile, highSyntax) {
753
+ var _a, _b;
754
+ for (const i of node.findAllExpressionsRecursive(Expressions.Source)) {
755
+ const firstToken = i.getFirstToken();
756
+ if (firstToken.getStr().toUpperCase() !== "SWITCH") {
757
+ continue;
758
+ }
759
+ const type = this.findType(i, lowFile, highSyntax);
760
+ if (type === undefined) {
761
+ continue;
762
+ }
763
+ const uniqueName = this.uniqueName(firstToken.getStart(), lowFile.getFilename(), highSyntax);
764
+ const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
765
+ let body = "";
766
+ let name = "";
767
+ const switchBody = i.findDirectExpression(Expressions.SwitchBody);
768
+ if (switchBody === undefined) {
769
+ continue;
770
+ }
771
+ for (const l of ((_a = switchBody === null || switchBody === void 0 ? void 0 : switchBody.findDirectExpression(Expressions.Let)) === null || _a === void 0 ? void 0 : _a.findDirectExpressions(Expressions.InlineFieldDefinition)) || []) {
772
+ name = l.getFirstToken().getStr();
773
+ body += indentation + `DATA(${name}) = ${(_b = switchBody.findFirstExpression(Expressions.Source)) === null || _b === void 0 ? void 0 : _b.concatTokens()}.\n`;
774
+ }
775
+ body += `DATA ${uniqueName} TYPE ${type}.\n`;
776
+ let firstSource = false;
777
+ let inWhen = false;
778
+ for (const c of switchBody.getChildren()) {
779
+ if (c.get() instanceof Expressions.Source && firstSource === false) {
780
+ body += indentation + `CASE ${c.concatTokens()}.`;
781
+ firstSource = true;
782
+ }
783
+ else if (c instanceof nodes_1.TokenNode && c.concatTokens().toUpperCase() === "THEN") {
784
+ inWhen = true;
785
+ body += ".\n";
786
+ }
787
+ else if (c instanceof nodes_1.TokenNode && c.concatTokens().toUpperCase() === "WHEN") {
788
+ inWhen = false;
789
+ body += `\n${indentation} WHEN `;
790
+ }
791
+ else if (c instanceof nodes_1.TokenNode && c.concatTokens().toUpperCase() === "OR") {
792
+ body += ` OR `;
793
+ }
794
+ else if (c instanceof nodes_1.TokenNode && c.concatTokens().toUpperCase() === "ELSE") {
795
+ inWhen = true;
796
+ body += `\n${indentation} WHEN OTHERS.\n`;
797
+ }
798
+ else if (inWhen === false) {
799
+ body += c.concatTokens();
800
+ }
801
+ else {
802
+ body += indentation + " " + uniqueName + " = " + c.concatTokens() + ".";
803
+ }
804
+ }
805
+ body += "\n" + indentation + "ENDCASE.\n" + indentation;
806
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, node.getFirstToken().getStart(), body);
807
+ const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, firstToken.getStart(), i.getLastToken().getEnd(), uniqueName);
808
+ const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
809
+ return issue_1.Issue.atToken(lowFile, firstToken, "Downport SWITCH", this.getMetadata().key, this.conf.severity, fix);
810
+ }
811
+ return undefined;
812
+ }
735
813
  outlineReduce(node, lowFile, highSyntax) {
736
814
  var _a;
737
815
  for (const i of node.findAllExpressionsRecursive(Expressions.Source)) {
@@ -1089,6 +1167,58 @@ ${indentation} output = ${topTarget}.`;
1089
1167
  }
1090
1168
  return undefined;
1091
1169
  }
1170
+ findMethodCallExpression(node, token) {
1171
+ var _a;
1172
+ for (const m of node.findAllExpressions(Expressions.MethodCall)) {
1173
+ if ((_a = m.findDirectExpression(Expressions.MethodName)) === null || _a === void 0 ? void 0 : _a.getFirstToken().getStart().equals(token.getStart())) {
1174
+ return m;
1175
+ }
1176
+ }
1177
+ return undefined;
1178
+ }
1179
+ replaceLineFunctions(node, lowFile, highSyntax) {
1180
+ var _a, _b;
1181
+ const spag = highSyntax.spaghetti.lookupPosition(node.getFirstToken().getStart(), lowFile.getFilename());
1182
+ for (const r of (spag === null || spag === void 0 ? void 0 : spag.getData().references) || []) {
1183
+ const func = r.position.getName().toUpperCase();
1184
+ if (r.referenceType === _reference_1.ReferenceType.BuiltinMethodReference
1185
+ && (func === "LINE_EXISTS" || func === "LINE_INDEX")) {
1186
+ const token = r.position.getToken();
1187
+ const expression = this.findMethodCallExpression(node, token);
1188
+ if (expression === undefined) {
1189
+ continue;
1190
+ }
1191
+ let condition = "";
1192
+ for (const c of ((_a = expression === null || expression === void 0 ? void 0 : expression.findFirstExpression(Expressions.TableExpression)) === null || _a === void 0 ? void 0 : _a.getChildren()) || []) {
1193
+ if (c.getFirstToken().getStr() === "[" || c.getFirstToken().getStr() === "]") {
1194
+ continue;
1195
+ }
1196
+ else if (c.get() instanceof Expressions.ComponentChainSimple && condition === "") {
1197
+ condition = "WITH KEY ";
1198
+ }
1199
+ else if (c.get() instanceof Expressions.Source && condition === "") {
1200
+ condition = "INDEX ";
1201
+ }
1202
+ condition += c.concatTokens() + " ";
1203
+ }
1204
+ const tableName = (_b = expression === null || expression === void 0 ? void 0 : expression.findFirstExpression(Expressions.SourceField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
1205
+ const uniqueName = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1206
+ const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
1207
+ const sy = func === "LINE_EXISTS" ? "sy-subrc" : "sy-tabix";
1208
+ const code = `DATA ${uniqueName} LIKE sy-subrc.\n` +
1209
+ indentation + `READ TABLE ${tableName} ${condition}TRANSPORTING NO FIELDS.\n` +
1210
+ indentation + uniqueName + ` = ${sy}.\n` +
1211
+ indentation;
1212
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, node.getFirstToken().getStart(), code);
1213
+ const start = expression.getFirstToken().getStart();
1214
+ const end = expression.getLastToken().getEnd();
1215
+ const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, start, end, uniqueName + (func === "LINE_EXISTS" ? " = 0" : ""));
1216
+ const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
1217
+ return issue_1.Issue.atToken(lowFile, token, "Use BOOLC", this.getMetadata().key, this.conf.severity, fix);
1218
+ }
1219
+ }
1220
+ return undefined;
1221
+ }
1092
1222
  newToCreateObject(node, lowFile, highSyntax) {
1093
1223
  const source = node.findDirectExpression(Expressions.Source);
1094
1224
  let fix = undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/core",
3
- "version": "2.85.23",
3
+ "version": "2.85.26",
4
4
  "description": "abaplint - Core API",
5
5
  "main": "build/src/index.js",
6
6
  "typings": "build/abaplint.d.ts",
@@ -50,7 +50,7 @@
50
50
  "@types/mocha": "^9.1.0",
51
51
  "@types/node": "^17.0.21",
52
52
  "chai": "^4.3.6",
53
- "eslint": "^8.9.0",
53
+ "eslint": "^8.10.0",
54
54
  "mocha": "^9.2.1",
55
55
  "c8": "^7.11.0",
56
56
  "source-map-support": "^0.5.21",