Skip to content

Commit

Permalink
(fix) check path aliases
Browse files Browse the repository at this point in the history
If a path alias starts with "/", it is recognized as an absolute path by the paths library. Therefore virtual svelte files with such paths were resolved with the normal tsSys. This fix adds an additional check for the path aliases.
sveltejs#468
  • Loading branch information
Simon Holthausen committed Aug 21, 2020
1 parent 873ec27 commit 953e116
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 2 deletions.
16 changes: 15 additions & 1 deletion packages/language-server/src/plugins/typescript/module-loader.ts
Expand Up @@ -67,6 +67,7 @@ export function createSvelteModuleLoader(
) {
const svelteSys = createSvelteSys(getSnapshot);
const moduleCache = new ModuleResolutionCache();
const pathAliases = getPathAliases(compilerOptions.paths);

return {
fileExists: svelteSys.fileExists,
Expand Down Expand Up @@ -98,7 +99,7 @@ export function createSvelteModuleLoader(
): ts.ResolvedModule | undefined {
// In the normal case, delegate to ts.resolveModuleName.
// In the relative-imported.svelte case, delegate to our own svelte module loader.
if (isAbsolute(name) || !isSvelteFilePath(name)) {
if (isAbsolutePath(name) || !isSvelteFilePath(name)) {
return ts.resolveModuleName(name, containingFile, compilerOptions, ts.sys)
.resolvedModule;
}
Expand All @@ -122,4 +123,17 @@ export function createSvelteModuleLoader(
};
return resolvedSvelteModule;
}

function isAbsolutePath(path: string) {
return isAbsolute(path) && !pathAliases.some((p) => path.startsWith(p));
}

function getPathAliases(paths: ts.MapLike<string[]> | undefined) {
return Object.keys(paths || {}).map((key) => {
if (key.endsWith('*')) {
key = key.substr(0, key.length - 1);
}
return key;
});
}
}
Expand Up @@ -23,7 +23,7 @@ describe('createSvelteModuleLoader', () => {
const svelteSys = <any>'svelteSys';
sinon.stub(svS, 'createSvelteSys').returns(svelteSys);

const compilerOptions: ts.CompilerOptions = { strict: true };
const compilerOptions: ts.CompilerOptions = { strict: true, paths: { '/@/*': [] } };
const moduleResolver = createSvelteModuleLoader(getSvelteSnapshotStub, compilerOptions);

return {
Expand Down Expand Up @@ -55,6 +55,26 @@ describe('createSvelteModuleLoader', () => {
]);
});

it('uses tsSys for normal files part of TS aliases', async () => {
const resolvedModule: ts.ResolvedModuleFull = {
extension: ts.Extension.Ts,
resolvedFileName: 'filename.ts',
};
const { resolveStub, moduleResolver, compilerOptions } = setup(resolvedModule);
const result = moduleResolver.resolveModuleNames(
['/@/normal'],
'C:/somerepo/somefile.svelte',
);

assert.deepStrictEqual(result, [resolvedModule]);
assert.deepStrictEqual(resolveStub.getCall(0).args, [
'/@/normal',
'C:/somerepo/somefile.svelte',
compilerOptions,
ts.sys,
]);
});

it('uses svelte module loader for virtual svelte files', async () => {
const resolvedModule: ts.ResolvedModuleFull = {
extension: ts.Extension.Ts,
Expand Down Expand Up @@ -87,6 +107,38 @@ describe('createSvelteModuleLoader', () => {
assert.deepStrictEqual(getSvelteSnapshotStub.getCall(0).args, ['filename.svelte']);
});

it('uses svelte module loader for virtual svelte files with TS path aliases', async () => {
const resolvedModule: ts.ResolvedModuleFull = {
extension: ts.Extension.Ts,
resolvedFileName: 'filename.svelte.ts',
};
const {
resolveStub,
svelteSys,
moduleResolver,
compilerOptions,
getSvelteSnapshotStub,
} = setup(resolvedModule);
const result = moduleResolver.resolveModuleNames(
['/@/svelte.svelte'],
'C:/somerepo/somefile.svelte',
);

assert.deepStrictEqual(result, [
<ts.ResolvedModuleFull>{
extension: ts.Extension.Jsx,
resolvedFileName: 'filename.svelte',
},
]);
assert.deepStrictEqual(resolveStub.getCall(0).args, [
'/@/svelte.svelte',
'C:/somerepo/somefile.svelte',
compilerOptions,
svelteSys,
]);
assert.deepStrictEqual(getSvelteSnapshotStub.getCall(0).args, ['filename.svelte']);
});

it('uses cache if module was already resolved before', async () => {
const resolvedModule: ts.ResolvedModuleFull = {
extension: ts.Extension.Ts,
Expand Down

0 comments on commit 953e116

Please sign in to comment.