From 3438e2b8186678ff41805b554545995f249eb0d7 Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Thu, 5 Dec 2024 16:08:41 +0100 Subject: [PATCH] fix: Improve module resolution This solves issues where some detections did not work properly due to the way dependencies were resolved. When using relative imports, the module resolution was working, but when for example importing a control from a test, the complete namespace is used, but the corresponding JS file was not found. This change ensures that JS files are resolved and also that the types for a framework library are loaded when it is linted. --- src/linter/ui5Types/SourceFileLinter.ts | 51 +----------------- src/linter/ui5Types/TypeLinter.ts | 7 ++- src/linter/ui5Types/host.ts | 41 ++++++++------ .../projects/sap.f/src/sap/f/NewControl.js | 12 +++++ .../projects/sap.f/test/sap/f/LinterTest.js | 11 ++-- test/lib/linter/snapshots/linter.ts.md | 26 ++++++++- test/lib/linter/snapshots/linter.ts.snap | Bin 21178 -> 21474 bytes 7 files changed, 76 insertions(+), 72 deletions(-) create mode 100644 test/fixtures/linter/projects/sap.f/src/sap/f/NewControl.js diff --git a/src/linter/ui5Types/SourceFileLinter.ts b/src/linter/ui5Types/SourceFileLinter.ts index ded0a3512..3438eda1e 100644 --- a/src/linter/ui5Types/SourceFileLinter.ts +++ b/src/linter/ui5Types/SourceFileLinter.ts @@ -1,4 +1,4 @@ -import ts, {SymbolFlags} from "typescript"; +import ts from "typescript"; import path from "node:path/posix"; import {getLogger} from "@ui5/logger"; import SourceFileReporter from "./SourceFileReporter.js"; @@ -282,54 +282,7 @@ export default class SourceFileLinter { !decl.getSourceFile().isDeclarationFile); // If the original raw render file is available, we can analyze it directly - if (originalDeclarations && originalDeclarations.length > 0) { - originalDeclarations.forEach((declaration) => this.analyzeControlRendererInternals(declaration)); - } else { - // When there's an ambient module, then we need special handling. - // In case we have the raw file & typescript definitions for it, their types - // are being merged, creating an ambient module. We need to find the original - // raw file in order to analyze the renderer. Such special case, is for example - // any openui5 library when we analyze the openui5 repo- we have the TS definitions - // loaded in the TS compiler via @sapui5/types, but we actually want to analyze the - // source files of those types. - let importModuleString = ""; - - // Get the import string module from the current source file, so we can filter later - const rendererSymbol = this.checker.getSymbolAtLocation(rendererMember.initializer); - const importedRenderModule = rendererSymbol?.getDeclarations()?.[0]?.parent; - - if (importedRenderModule && - ts.isImportDeclaration(importedRenderModule) && - ts.isStringLiteral(importedRenderModule.moduleSpecifier)) { - importModuleString = importedRenderModule.moduleSpecifier.text; - } - - // Find the correct raw source file - const exportSourceFile = this.program.getSourceFiles().find((sourceFile) => - sourceFile.fileName.includes(importModuleString)); - - // Extract the exports from the source file - const exportFileSymbol = exportSourceFile && this.checker.getSymbolAtLocation(exportSourceFile); - const moduleExportsSymbols = exportFileSymbol && this.checker.getExportsOfModule(exportFileSymbol); - - // Check all exports - moduleExportsSymbols?.forEach((exportSymbol) => { - // Note: getAliasedSymbol fails when called with a symbol that isn't an alias - let symbol = exportSymbol; - if (exportSymbol.flags & SymbolFlags.TypeAlias) { - // Export could be a "default", so we need to get the real reference of the export symbol - symbol = this.checker.getAliasedSymbol(exportSymbol); - } - - symbol?.getDeclarations()?.forEach((declaration) => { - if (ts.isVariableDeclaration(declaration) && declaration.initializer) { - this.analyzeControlRendererInternals(declaration.initializer); - } else if (ts.isExportAssignment(declaration) && declaration.expression) { - this.analyzeControlRendererInternals(declaration.expression); - } - }); - }); - } + originalDeclarations?.forEach((declaration) => this.analyzeControlRendererInternals(declaration)); } else { // Analyze renderer property when it's directly embedded in the renderer object // i.e. { renderer: {apiVersion: "2", render: () => {}} } diff --git a/src/linter/ui5Types/TypeLinter.ts b/src/linter/ui5Types/TypeLinter.ts index 5250e493c..e4b540db5 100644 --- a/src/linter/ui5Types/TypeLinter.ts +++ b/src/linter/ui5Types/TypeLinter.ts @@ -59,7 +59,12 @@ export default class TypeChecker { if (namespace) { // Map namespace used in imports (without /resources) to /resources paths this.#compilerOptions.paths = { - [`${namespace}/*`]: [`/resources/${namespace}/*`], + [`${namespace}/*`]: [ + // Enforce that the compiler also tries to resolve imports with a .js extension. + // With this mapping, the compiler still first tries to resolve the .ts, .tsx and .d.ts extensions + // but then falls back to .js + `/resources/${namespace}/*.js`, + ], }; } } diff --git a/src/linter/ui5Types/host.ts b/src/linter/ui5Types/host.ts index ffeffeb75..a469f9073 100644 --- a/src/linter/ui5Types/host.ts +++ b/src/linter/ui5Types/host.ts @@ -47,17 +47,26 @@ async function collectSapui5TypesFiles() { return typesFiles; } -function addSapui5TypesMappingToCompilerOptions(sapui5TypesFiles: string[], options: ts.CompilerOptions) { +function addSapui5TypesMappingToCompilerOptions( + sapui5TypesFiles: string[], options: ts.CompilerOptions, projectNamespace?: string +) { const paths = options.paths ?? (options.paths = {}); sapui5TypesFiles.forEach((fileName) => { - if (fileName === "sap.ui.core.d.ts") { - // No need to add a mapping for sap.ui.core, as it is loaded by default - return; - } + const dtsPath = `/types/@sapui5/types/types/${fileName}`; const libraryName = posixPath.basename(fileName, ".d.ts"); - const namespace = libraryName.replace(/\./g, "/") + "/*"; - const pathsEntry = paths[namespace] ?? (paths[namespace] = []); - pathsEntry.push(`/types/@sapui5/types/types/${fileName}`); + const libraryNamespace = libraryName.replace(/\./g, "/"); + if (libraryNamespace === "sap/ui/core" || libraryNamespace === projectNamespace) { + // Special cases: + // - sap.ui.core needs to be loaded by default as it provides general API that must always be available + // - When linting a framework library, the corresponding types should be loaded by default as they + // might not get loaded by the compiler otherwise, as the actual sources are available in the project. + options.types?.push(dtsPath); + } else { + // For other framework libraries we can add a paths mapping to load them on demand + const mappingNamespace = libraryNamespace + "/*"; + const pathsEntry = paths[mappingNamespace] ?? (paths[mappingNamespace] = []); + pathsEntry.push(dtsPath); + } }); } @@ -70,6 +79,9 @@ export async function createVirtualCompilerHost( ): Promise { const silly = log.isLevelEnabled("silly"); + options.typeRoots = ["/types"]; + options.types = []; + const typePathMappings = new Map(); addPathMappingForPackage("typescript", typePathMappings); @@ -85,16 +97,11 @@ export async function createVirtualCompilerHost( require.resolve("../../../resources/overrides/package.json") )); - options.typeRoots = ["/types"]; - options.types = [ - // Request compiler to only use sap.ui.core types by default - other types will be loaded on demand - // (see addSapui5TypesMappingToCompilerOptions) - ...typePackageDirs.filter((dir) => dir !== "/types/@sapui5/types/"), - "/types/@sapui5/types/types/sap.ui.core.d.ts", - ]; + // Add all types except @sapui5/types which will be handled below + options.types.push(...typePackageDirs.filter((dir) => dir !== "/types/@sapui5/types/")); - // Adds mappings for all other sapui5 types, so that they are only loaded once a module is imported - addSapui5TypesMappingToCompilerOptions(await collectSapui5TypesFiles(), options); + // Adds types / mappings for all @sapui5/types + addSapui5TypesMappingToCompilerOptions(await collectSapui5TypesFiles(), options, context.getNamespace()); // Create regex matching all path mapping keys const pathMappingRegex = new RegExp( diff --git a/test/fixtures/linter/projects/sap.f/src/sap/f/NewControl.js b/test/fixtures/linter/projects/sap.f/src/sap/f/NewControl.js new file mode 100644 index 000000000..efe886c0f --- /dev/null +++ b/test/fixtures/linter/projects/sap.f/src/sap/f/NewControl.js @@ -0,0 +1,12 @@ +sap.ui.define([ + "sap/ui/core/Control" +], function (Control) { + "use strict"; + // This control is used to test cases where a framework library contains a control + // for which no @sapui5/types exist. + // The control and usages of it should still be analyzed properly, e.g. when extending it + // and not defining a renderer. + return Control.extend("sap.f.NewControl", { + renderer: null + }); +}); diff --git a/test/fixtures/linter/projects/sap.f/test/sap/f/LinterTest.js b/test/fixtures/linter/projects/sap.f/test/sap/f/LinterTest.js index 40c6f6fb0..e802ec46a 100644 --- a/test/fixtures/linter/projects/sap.f/test/sap/f/LinterTest.js +++ b/test/fixtures/linter/projects/sap.f/test/sap/f/LinterTest.js @@ -3,15 +3,18 @@ sap.ui.require([ "sap/f/Avatar", "sap/m/DateTimeInput", - "sap/f/ProductSwitchRenderer" -], (Avatar, DateTimeInput, ProductSwitchRenderer) => { + "sap/f/ProductSwitchRenderer", + "sap/f/NewControl" +], (Avatar, DateTimeInput, ProductSwitchRenderer, NewControl) => { new Avatar(); new DateTimeInput(); Avatar.extend("CustomControl", { // Usage of render function without object is deprecated as no apiVersion is defined - // TODO detect: This is currently not detected as the module resolution is not working correctly. - // This needs to be solved in a separate change. renderer: ProductSwitchRenderer.render }); + + // This ensures that the renderer declaration is also checked for controls based on + // controls of a framework library for which no @sapui5/types exist (sap/f/NewControl). + const CustomNewControl = NewControl.extend("CustomNewControl"); }); diff --git a/test/lib/linter/snapshots/linter.ts.md b/test/lib/linter/snapshots/linter.ts.md index b0b54391b..8fae968a7 100644 --- a/test/lib/linter/snapshots/linter.ts.md +++ b/test/lib/linter/snapshots/linter.ts.md @@ -2085,6 +2085,14 @@ Generated by [AVA](https://avajs.dev). messages: [], warningCount: 0, }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'src/sap/f/NewControl.js', + messages: [], + warningCount: 0, + }, { coverageInfo: [], errorCount: 0, @@ -2127,10 +2135,18 @@ Generated by [AVA](https://avajs.dev). }, { coverageInfo: [], - errorCount: 2, + errorCount: 4, fatalErrorCount: 0, filePath: 'test/sap/f/LinterTest.js', messages: [ + { + column: 13, + line: 14, + message: 'Use of deprecated renderer detected. Define explicitly the {apiVersion: 2} parameter in the renderer object', + messageDetails: '"Renderer Object (https://ui5.sap.com/#/topic/c9ab34570cc14ea5ab72a6d1a4a03e3f)",', + ruleId: 'no-deprecated-api', + severity: 2, + }, { column: 2, line: 4, @@ -2147,6 +2163,14 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 27, + line: 19, + message: 'Control \'CustomNewControl\' is missing a renderer declaration', + messageDetails: 'Not defining a \'renderer\' for control \'CustomNewControl\' may lead to synchronous loading of the \'CustomNewControlRenderer\' module. If no renderer exists, set \'renderer: null\'. Otherwise, either import the renderer module and assign it to the \'renderer\' property or implement the renderer inline.', + ruleId: 'no-deprecated-control-renderer-declaration', + severity: 2, + }, ], warningCount: 0, }, diff --git a/test/lib/linter/snapshots/linter.ts.snap b/test/lib/linter/snapshots/linter.ts.snap index 566628c283b437e4d748f277b5fb0680aab7c473..0c5f2138377923a740f1326a6585dab9a3104fc9 100644 GIT binary patch literal 21474 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 JT8{1|0s!)uAU^;A literal 21178 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 h{eCS+@ILhOwH(2%4$^W2-vmeS{{VWV0