Skip to content

Commit 4a27d6e

Browse files
authored
Parse the same files as the compiler (#92)
* Parse the same files as the compiler * Wait for promises * Use .toThrow() * Add tests
1 parent 4305da4 commit 4a27d6e

3 files changed

Lines changed: 45 additions & 13 deletions

File tree

packages/definitions-parser/src/lib/definition-parser.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,12 @@ function getTypingDataForSingleTypesVersion(
263263
): TypingDataFromIndividualTypeScriptVersion {
264264
const tsconfig = fs.readJson("tsconfig.json") as TsConfig;
265265
checkFilesFromTsConfig(packageName, tsconfig, fs.debugPath());
266-
const { types, tests } = allReferencedFiles(tsconfig.files!, fs, packageName, packageDirectory);
266+
const { types, tests, hasNonRelativeImports } = allReferencedFiles(
267+
tsconfig.files!,
268+
fs,
269+
packageName,
270+
packageDirectory
271+
);
267272
const usedFiles = new Set([...types.keys(), ...tests.keys(), "tsconfig.json", "tslint.json"]);
268273
const otherFiles =
269274
ls.indexOf(unusedFilesName) > -1
@@ -288,6 +293,16 @@ function getTypingDataForSingleTypesVersion(
288293
filter(getTestDependencies(packageName, types, tests.keys(), dependenciesSet, fs), m => !declaredModulesSet.has(m))
289294
);
290295

296+
const { paths } = tsconfig.compilerOptions;
297+
if (directoryVersion && hasNonRelativeImports && !(paths && `${packageName}/*` in paths)) {
298+
const mapping = JSON.stringify([`${packageName}/v${formatTypingVersion(directoryVersion)}/*`]);
299+
throw new Error(
300+
`${packageName}: Older version ${formatTypingVersion(
301+
directoryVersion
302+
)} must have a "paths" entry of "${packageName}/*": ${mapping}`
303+
);
304+
}
305+
291306
const { dependencies, pathMappings } = calculateDependencies(
292307
packageName,
293308
tsconfig,

packages/definitions-parser/src/lib/module-info.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,13 @@ export function allReferencedFiles(
147147
fs: FS,
148148
packageName: string,
149149
baseDirectory: string
150-
): { types: Map<string, ts.SourceFile>; tests: Map<string, ts.SourceFile> } {
150+
): { types: Map<string, ts.SourceFile>; tests: Map<string, ts.SourceFile>; hasNonRelativeImports: boolean } {
151151
const seenReferences = new Set<string>();
152152
const types = new Map<string, ts.SourceFile>();
153153
const tests = new Map<string, ts.SourceFile>();
154+
let hasNonRelativeImports = false;
154155
entryFilenames.forEach(text => recur({ text, exact: true }));
155-
return { types, tests };
156+
return { types, tests, hasNonRelativeImports };
156157

157158
function recur({ text, exact }: Reference): void {
158159
const resolvedFilename = exact ? text : resolveModule(text, fs);
@@ -170,13 +171,14 @@ export function allReferencedFiles(
170171
tests.set(resolvedFilename, src);
171172
}
172173

173-
const refs = findReferencedFiles(
174+
const { refs, hasNonRelativeImports: result } = findReferencedFiles(
174175
src,
175176
packageName,
176177
path.dirname(resolvedFilename),
177178
normalizeSlashes(path.relative(baseDirectory, fs.debugPath()))
178179
);
179180
refs.forEach(recur);
181+
hasNonRelativeImports = hasNonRelativeImports || result;
180182
}
181183
}
182184
}
@@ -215,6 +217,7 @@ interface Reference {
215217
*/
216218
function findReferencedFiles(src: ts.SourceFile, packageName: string, subDirectory: string, baseDirectory: string) {
217219
const refs: Reference[] = [];
220+
let hasNonRelativeImports = false;
218221

219222
for (const ref of src.referencedFiles) {
220223
// Any <reference path="foo"> is assumed to be local
@@ -235,9 +238,10 @@ function findReferencedFiles(src: ts.SourceFile, packageName: string, subDirecto
235238
}
236239
if (ref.startsWith(packageName + "/")) {
237240
addReference({ text: convertToRelativeReference(ref), exact: false });
241+
hasNonRelativeImports = true;
238242
}
239243
}
240-
return refs;
244+
return { refs, hasNonRelativeImports };
241245

242246
function addReference(ref: Reference): void {
243247
// `path.normalize` may add windows slashes

packages/definitions-parser/test/definition-parser.test.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,27 +67,40 @@ describe(getTypingInfo, () => {
6767
const dt = createMockDT();
6868
dt.addOldVersionOfPackage("jquery", "3");
6969

70-
expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).rejects.toMatchObject({
71-
message:
72-
"The latest version of the 'jquery' package is 3.3, so the subdirectory 'v3' is not allowed; " +
70+
return expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).rejects.toThrow(
71+
"The latest version of the 'jquery' package is 3.3, so the subdirectory 'v3' is not allowed; " +
7372
"since it applies to any 3.* version, up to and including 3.3."
74-
});
73+
);
7574
});
7675

7776
it("throws if a directory exists for the latest minor version", () => {
7877
const dt = createMockDT();
7978
dt.addOldVersionOfPackage("jquery", "3.3");
8079

81-
expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).rejects.toMatchObject({
82-
message: "The latest version of the 'jquery' package is 3.3, so the subdirectory 'v3.3' is not allowed."
83-
});
80+
return expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).rejects.toThrow(
81+
"The latest version of the 'jquery' package is 3.3, so the subdirectory 'v3.3' is not allowed."
82+
);
8483
});
8584

8685
it("does not throw when a minor version is older than the latest", () => {
8786
const dt = createMockDT();
8887
dt.addOldVersionOfPackage("jquery", "3.0");
8988

90-
expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).resolves.toBeDefined();
89+
return expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).resolves.toBeDefined();
90+
});
91+
92+
it("checks that older versions with non-relative imports have wildcard path mappings", () => {
93+
const dt = createMockDT();
94+
const jquery = dt.pkgDir("jquery");
95+
jquery.set(
96+
"JQuery.d.ts",
97+
`import "jquery/component";
98+
`
99+
);
100+
dt.addOldVersionOfPackage("jquery", "1");
101+
return expect(getTypingInfo("jquery", dt.pkgFS("jquery"))).rejects.toThrow(
102+
'jquery: Older version 1 must have a "paths" entry of "jquery/*": ["jquery/v1/*"]'
103+
);
91104
});
92105
});
93106
});

0 commit comments

Comments
 (0)