From d38e3563f79edc49fa6d2bf2c027bd8bd5315c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20O=C3=9Fwald?= Date: Fri, 22 Mar 2024 09:45:42 +0100 Subject: [PATCH] fix: Update list of deprecated libs (#42) - Sort entries - Remove non-existent sap.dragonfly - Fix typo for sap.landvisz - Add missing sap.sac.grid - Add removed internal sap.fe libs Co-authored-by: Max Reichmann --- src/linter/json/ManifestLinter.ts | 9 ++- .../rules/NoDeprecatedApi/manifest.json | 13 ++-- .../rules/snapshots/NoDeprecatedApi.ts.md | 58 +++++++++++++----- .../rules/snapshots/NoDeprecatedApi.ts.snap | Bin 5730 -> 5923 bytes 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/linter/json/ManifestLinter.ts b/src/linter/json/ManifestLinter.ts index b93104ff2..a0cab52bb 100644 --- a/src/linter/json/ManifestLinter.ts +++ b/src/linter/json/ManifestLinter.ts @@ -20,19 +20,22 @@ interface locType { const deprecatedLibraries: string[] = [ "sap.ca.scfld.md", "sap.ca.ui", - "sap.dragonfly", - "sap.landviz", + "sap.fe.common", // Internal, removed in 1.110 + "sap.fe.plugins", // Internal, removed in 1.102 + "sap.fe.semantics", // Internal, removed in 1.104 + "sap.landvisz", // Removed in 1.120 "sap.makit", "sap.me", + "sap.sac.grid", // Removed in 1.114 "sap.ui.commons", "sap.ui.suite", "sap.ui.ux3", "sap.ui.vtm", "sap.uiext.inbox", "sap.webanalytics.core", - "sap.zen.dsh", "sap.zen.commons", "sap.zen.crosstab", + "sap.zen.dsh", ]; const deprecatedComponents: string[] = [ diff --git a/test/fixtures/linter/rules/NoDeprecatedApi/manifest.json b/test/fixtures/linter/rules/NoDeprecatedApi/manifest.json index d948cbe38..3236d55b2 100644 --- a/test/fixtures/linter/rules/NoDeprecatedApi/manifest.json +++ b/test/fixtures/linter/rules/NoDeprecatedApi/manifest.json @@ -43,22 +43,25 @@ "minUI5Version": "1.119.0", "libs": { "sap.ui.core": {}, - "sap.m": {}, + "sap.m": {}, "sap.ca.scfld.md": {}, "sap.ca.ui": {}, - "sap.dragonfly": {}, - "sap.landviz": {}, + "sap.fe.common": {}, + "sap.fe.plugins": {}, + "sap.fe.semantics": {}, + "sap.landvisz": {}, "sap.makit": {}, "sap.me": {}, + "sap.sac.grid": {}, "sap.ui.commons": {}, "sap.ui.suite": {}, "sap.ui.ux3": {}, "sap.ui.vtm": {}, "sap.uiext.inbox": {}, "sap.webanalytics.core": {}, - "sap.zen.dsh": {}, "sap.zen.commons": {}, - "sap.zen.crosstab": {} + "sap.zen.crosstab": {}, + "sap.zen.dsh": {} }, "components": { "sap.zen.dsh.fioriwrapper": {} diff --git a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md index b8dc00165..12c97140b 100644 --- a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md +++ b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md @@ -795,7 +795,7 @@ Generated by [AVA](https://avajs.dev). [ { coverageInfo: [], - errorCount: 20, + errorCount: 23, fatalErrorCount: 0, filePath: 'manifest.json', messages: [ @@ -819,7 +819,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 49, - message: 'Use of deprecated library \'sap.dragonfly\'', + message: 'Use of deprecated library \'sap.fe.common\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -827,7 +827,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 50, - message: 'Use of deprecated library \'sap.landviz\'', + message: 'Use of deprecated library \'sap.fe.plugins\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -835,7 +835,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 51, - message: 'Use of deprecated library \'sap.makit\'', + message: 'Use of deprecated library \'sap.fe.semantics\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -843,7 +843,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 52, - message: 'Use of deprecated library \'sap.me\'', + message: 'Use of deprecated library \'sap.landvisz\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -851,7 +851,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 53, - message: 'Use of deprecated library \'sap.ui.commons\'', + message: 'Use of deprecated library \'sap.makit\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -859,7 +859,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 54, - message: 'Use of deprecated library \'sap.ui.suite\'', + message: 'Use of deprecated library \'sap.me\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -867,7 +867,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 55, - message: 'Use of deprecated library \'sap.ui.ux3\'', + message: 'Use of deprecated library \'sap.sac.grid\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -875,7 +875,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 56, - message: 'Use of deprecated library \'sap.ui.vtm\'', + message: 'Use of deprecated library \'sap.ui.commons\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -883,7 +883,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 57, - message: 'Use of deprecated library \'sap.uiext.inbox\'', + message: 'Use of deprecated library \'sap.ui.suite\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -891,7 +891,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 58, - message: 'Use of deprecated library \'sap.webanalytics.core\'', + message: 'Use of deprecated library \'sap.ui.ux3\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -899,7 +899,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 59, - message: 'Use of deprecated library \'sap.zen.dsh\'', + message: 'Use of deprecated library \'sap.ui.vtm\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -907,7 +907,7 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 60, - message: 'Use of deprecated library \'sap.zen.commons\'', + message: 'Use of deprecated library \'sap.uiext.inbox\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, }, @@ -915,6 +915,22 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 61, + message: 'Use of deprecated library \'sap.webanalytics.core\'', + ruleId: 'ui5-linter-no-deprecated-library', + severity: 2, + }, + { + column: 17, + fatal: undefined, + line: 62, + message: 'Use of deprecated library \'sap.zen.commons\'', + ruleId: 'ui5-linter-no-deprecated-library', + severity: 2, + }, + { + column: 17, + fatal: undefined, + line: 63, message: 'Use of deprecated library \'sap.zen.crosstab\'', ruleId: 'ui5-linter-no-deprecated-library', severity: 2, @@ -923,6 +939,14 @@ Generated by [AVA](https://avajs.dev). column: 17, fatal: undefined, line: 64, + message: 'Use of deprecated library \'sap.zen.dsh\'', + ruleId: 'ui5-linter-no-deprecated-library', + severity: 2, + }, + { + column: 17, + fatal: undefined, + line: 67, message: 'Use of deprecated component \'sap.zen.dsh.fioriwrapper\'', ruleId: 'ui5-linter-no-deprecated-component', severity: 2, @@ -930,7 +954,7 @@ Generated by [AVA](https://avajs.dev). { column: 13, fatal: undefined, - line: 76, + line: 79, message: 'Use of deprecated property \'sap.ui5/resources/js\'', ruleId: 'ui5-linter-no-deprecated-api', severity: 2, @@ -938,7 +962,7 @@ Generated by [AVA](https://avajs.dev). { column: 21, fatal: undefined, - line: 89, + line: 92, message: 'Use of deprecated property \'sap.ui5/models/odata-v4/settings/synchronizationMode\' of sap.ui.model.odata.v4.ODataModel', ruleId: 'ui5-linter-no-deprecated-api', severity: 2, @@ -946,7 +970,7 @@ Generated by [AVA](https://avajs.dev). { column: 21, fatal: undefined, - line: 95, + line: 98, message: 'Use of deprecated property \'sap.ui5/models/odata-v4-via-dataSource/settings/synchronizationMode\' of sap.ui.model.odata.v4.ODataModel', ruleId: 'ui5-linter-no-deprecated-api', severity: 2, @@ -954,7 +978,7 @@ Generated by [AVA](https://avajs.dev). { column: 17, fatal: undefined, - line: 99, + line: 102, message: 'Use of deprecated model type \'sap.ui5/models/odata/type="sap.ui.model.odata.ODataModel"\'', ruleId: 'ui5-linter-no-deprecated-api', severity: 2, diff --git a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap index 0051e45c0d10f89d3fa6a50c0f4e5747a1edd6f7..212108067fda9b3c8de9df2a754d62632b21e375 100644 GIT binary patch literal 5923 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