From 7331fc588f8e75d3d23226809dc75e0dbce9f8e0 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Wed, 13 May 2020 13:03:40 -0700 Subject: [PATCH 1/4] Non-relative reference in typesVersions parent --- packages/definitions-parser/src/lib/module-info.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/definitions-parser/src/lib/module-info.ts b/packages/definitions-parser/src/lib/module-info.ts index 6e9b5f1abf..8a76c2821a 100644 --- a/packages/definitions-parser/src/lib/module-info.ts +++ b/packages/definitions-parser/src/lib/module-info.ts @@ -266,7 +266,10 @@ function findReferencedFiles(src: ts.SourceFile, packageName: string, subDirecto /** boring/foo -> ./foo when subDirectory === '.'; ../foo when it's === 'x'; ../../foo when it's 'x/y' */ function convertToRelativeReference(name: string) { - const relative = "." + "/..".repeat(subDirectory === "." ? 0 : subDirectory.split("/").length); + let relative = "." + "/..".repeat(subDirectory === "." ? 0 : subDirectory.split("/").length); + if (baseDirectory && subDirectory.startsWith("..")) { + relative = relative.slice(0, -2) + baseDirectory; + } return relative + name.slice(packageName.length); } } From e3a6173585d9ee2ebf4ad462045906863840f1a1 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Wed, 26 Aug 2020 09:26:11 -0700 Subject: [PATCH 2/4] Add tests --- .../test/module-info.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/definitions-parser/test/module-info.test.ts b/packages/definitions-parser/test/module-info.test.ts index 62797f9276..fd92a87680 100644 --- a/packages/definitions-parser/test/module-info.test.ts +++ b/packages/definitions-parser/test/module-info.test.ts @@ -128,6 +128,26 @@ testo({ const i = getModuleInfo("fail", types); expect(i.dependencies).toEqual(new Set([])); }, + selfInTypesVersionsParent() { + const pkg = new Dir(undefined); + const ts20 = pkg.subdir("ts2.0"); + ts20.set( + "index.d.ts", + `/// +` + ); + ts20.set("component.d.ts", ""); + const ts10 = pkg.subdir("ts1.0"); + ts10.set( + "index.d.ts", + `import "mock/component"; +` + ); + const memFS = new InMemoryFS(ts20, "types/mock/ts2.0"); + const { types, tests } = allReferencedFiles(["index.d.ts"], memFS, "mock", "types/mock"); + expect(Array.from(types.keys())).toEqual(["index.d.ts", "../ts1.0/index.d.ts", "../ts2.0/component.d.ts"]); + expect(Array.from(tests.keys())).toEqual([]); + }, getTestDependenciesWorks() { const { types, tests } = getBoringReferences(); const i = getModuleInfo("boring", types); From 95b2ae891f5275c181696f8b98808e50c86351fb Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Thu, 27 Aug 2020 08:13:36 -0700 Subject: [PATCH 3/4] Normalize ../${baseDirectory}/ for seenReferences --- .../definitions-parser/src/lib/module-info.ts | 17 ++++++++--------- .../definitions-parser/test/module-info.test.ts | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/definitions-parser/src/lib/module-info.ts b/packages/definitions-parser/src/lib/module-info.ts index 8a76c2821a..a2fee4fdc3 100644 --- a/packages/definitions-parser/src/lib/module-info.ts +++ b/packages/definitions-parser/src/lib/module-info.ts @@ -155,12 +155,12 @@ export function allReferencedFiles( return { types, tests }; function recur({ text, exact }: Reference): void { - if (seenReferences.has(text)) { + const resolvedFilename = exact ? text : resolveModule(text, fs); + if (seenReferences.has(resolvedFilename)) { return; } - seenReferences.add(text); + seenReferences.add(resolvedFilename); - const resolvedFilename = exact ? text : resolveModule(text, fs); // tslint:disable-next-line:non-literal-fs-path -- Not a reference to the fs package if (fs.exists(resolvedFilename)) { const src = createSourceFile(resolvedFilename, readFileAndThrowOnBOM(resolvedFilename, fs)); @@ -241,16 +241,15 @@ function findReferencedFiles(src: ts.SourceFile, packageName: string, subDirecto function addReference(ref: Reference): void { // `path.normalize` may add windows slashes - const full = normalizeSlashes( + let full = normalizeSlashes( path.normalize(joinPaths(subDirectory, assertNoWindowsSlashes(src.fileName, ref.text))) ); // allow files in typesVersions directories (i.e. 'ts3.1') to reference files in parent directory if (full.startsWith("../" + packageName + "/")) { - ref.text = full.slice(packageName.length + 4); - refs.push(ref); - return; - } - if ( + full = full.slice(packageName.length + 4); + } else if (baseDirectory && full.startsWith("../" + baseDirectory + "/")) { + full = full.slice(baseDirectory.length + 4); + } else if ( full.startsWith("..") && (baseDirectory === "" || path.normalize(joinPaths(baseDirectory, full)).startsWith("..")) ) { diff --git a/packages/definitions-parser/test/module-info.test.ts b/packages/definitions-parser/test/module-info.test.ts index fd92a87680..0d99dc513f 100644 --- a/packages/definitions-parser/test/module-info.test.ts +++ b/packages/definitions-parser/test/module-info.test.ts @@ -145,7 +145,7 @@ testo({ ); const memFS = new InMemoryFS(ts20, "types/mock/ts2.0"); const { types, tests } = allReferencedFiles(["index.d.ts"], memFS, "mock", "types/mock"); - expect(Array.from(types.keys())).toEqual(["index.d.ts", "../ts1.0/index.d.ts", "../ts2.0/component.d.ts"]); + expect(Array.from(types.keys())).toEqual(["index.d.ts", "../ts1.0/index.d.ts", "component.d.ts"]); expect(Array.from(tests.keys())).toEqual([]); }, getTestDependenciesWorks() { From 9cca10856971de322e132b5f76bfc7a918c39694 Mon Sep 17 00:00:00 2001 From: Jack Bates Date: Thu, 27 Aug 2020 08:21:28 -0700 Subject: [PATCH 4/4] Cosmetic --- packages/definitions-parser/src/lib/module-info.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/definitions-parser/src/lib/module-info.ts b/packages/definitions-parser/src/lib/module-info.ts index a2fee4fdc3..9a4002a623 100644 --- a/packages/definitions-parser/src/lib/module-info.ts +++ b/packages/definitions-parser/src/lib/module-info.ts @@ -265,9 +265,12 @@ function findReferencedFiles(src: ts.SourceFile, packageName: string, subDirecto /** boring/foo -> ./foo when subDirectory === '.'; ../foo when it's === 'x'; ../../foo when it's 'x/y' */ function convertToRelativeReference(name: string) { - let relative = "." + "/..".repeat(subDirectory === "." ? 0 : subDirectory.split("/").length); - if (baseDirectory && subDirectory.startsWith("..")) { - relative = relative.slice(0, -2) + baseDirectory; + let relative = "."; + if (subDirectory !== ".") { + relative += "/..".repeat(subDirectory.split("/").length); + if (baseDirectory && subDirectory.startsWith("..")) { + relative = relative.slice(0, -2) + baseDirectory; + } } return relative + name.slice(packageName.length); }