Skip to content

Commit 19d8d7f

Browse files
committed
fix(gls-utils): #1055 - move file test, refactor for fixtures
1 parent 4408bec commit 19d8d7f

File tree

11 files changed

+167
-130
lines changed

11 files changed

+167
-130
lines changed

packages/graphql-language-service-interface/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
},
1515
"license": "MIT",
1616
"files": [
17-
"dist"
17+
"dist",
18+
"esm"
1819
],
1920
"keywords": [
2021
"graphql"

packages/graphql-language-service-parser/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
},
1515
"license": "MIT",
1616
"files": [
17-
"dist"
17+
"dist",
18+
"esm"
1819
],
1920
"keywords": [
2021
"graphql"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
example: true,
3+
};

packages/graphql-language-service-utils/src/__tests__/__fixtures__/invalid.fake

Whitespace-only changes.

packages/graphql-language-service-utils/src/__tests__/__fixtures__/noextension

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"name": "example"
3+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import path from 'path';
2+
3+
import {
4+
getFileExtension,
5+
getPathWithoutExtension,
6+
resolveFile,
7+
requireFile,
8+
} from '../file';
9+
10+
describe('getFileExtension', () => {
11+
it('should resolve an extension', () => {
12+
const extension = getFileExtension('example/example.txt');
13+
expect(extension).toEqual('txt');
14+
});
15+
it('should resolve null when no extension is present', () => {
16+
const extension = getFileExtension('example/example');
17+
expect(extension).toEqual(null);
18+
});
19+
20+
it('should return an extension with multiple dots in the path', () => {
21+
const extension = getFileExtension(
22+
'example.example/example/something.esm.js',
23+
);
24+
expect(extension).toEqual('js');
25+
});
26+
});
27+
28+
describe('getPathWithoutExtension', () => {
29+
it('should resolve when path has extension', () => {
30+
const extension = getPathWithoutExtension('example/example.txt', 'txt');
31+
expect(extension).toEqual('example/example');
32+
});
33+
it('should resolve when path has no extension', () => {
34+
const extension = getPathWithoutExtension(
35+
'example/example.example/example',
36+
null,
37+
);
38+
expect(extension).toEqual('example/example.example/example');
39+
});
40+
});
41+
42+
describe('requireFile', () => {
43+
it('should require file with extension using json', async () => {
44+
const file = await requireFile(
45+
path.join(__dirname, '__fixtures__', 'package.json'),
46+
);
47+
expect(file.name).toEqual('example');
48+
});
49+
it('should require file with extension using js', async () => {
50+
const file = await requireFile(
51+
path.join(__dirname, '__fixtures__', 'file.js'),
52+
);
53+
expect(file.example).toEqual(true);
54+
});
55+
it('should fail when requiring an invalid extension', () => {
56+
expect(() => requireFile('./__fixtures__/invalid.fake')).toThrowError(
57+
`cannot import() module with extension 'fake'`,
58+
);
59+
});
60+
it('should fail when requiring a valid extension (js) but invalid file path', () => {
61+
expect(() => requireFile('./__fixtures__/invalid.js')).toThrowError(
62+
`Cannot find module './__fixtures__/invalid.js' from 'file.ts'`,
63+
);
64+
});
65+
it('should fail when requiring a valid extension (json) but invalid file path', () => {
66+
expect(() => requireFile('./__fixtures__/npmignore.json')).toThrowError(
67+
`Cannot find module './__fixtures__/npmignore.json' from 'file.ts'`,
68+
);
69+
});
70+
it('should require file with no extension using js', async () => {
71+
const config = await requireFile(
72+
path.join(__dirname, '__fixtures__', 'file'),
73+
);
74+
await expect(config.example).toEqual(true);
75+
});
76+
it('should require file with no extension using json', async () => {
77+
const file = await requireFile(
78+
path.join(__dirname, '__fixtures__', 'package'),
79+
);
80+
expect(file.name).toEqual('example');
81+
});
82+
it('should fail when requiring a file with no extension', async () => {
83+
expect(() =>
84+
requireFile(path.join(__dirname, '__fixtures__', 'packages')),
85+
).toThrowError(
86+
`Cannot find module '${__dirname}/__fixtures__/packages.json' from 'file.ts'`,
87+
);
88+
});
89+
});
90+
91+
describe('resolveFile', () => {
92+
it('should resolve when path has extension', () => {
93+
const resolvedPath = resolveFile(
94+
path.join(__dirname, './__fixtures__/package.json'),
95+
);
96+
expect(resolvedPath).toEqual(
97+
require.resolve(path.join(__dirname, '__fixtures__/package.json')),
98+
);
99+
});
100+
101+
it('should resolve when path has extension', () => {
102+
const resolvedPath = resolveFile(
103+
path.join(__dirname, '__fixtures__', 'package'),
104+
);
105+
expect(resolvedPath).toEqual(
106+
require.resolve(path.join(__dirname, '__fixtures__', 'package')),
107+
);
108+
});
109+
110+
it('should resolve when path has extension', () => {
111+
const resolvedPath = resolveFile(
112+
path.join(__dirname, '__fixtures__', 'package'),
113+
);
114+
expect(resolvedPath).toEqual(
115+
require.resolve(path.join(__dirname, '__fixtures__', 'package')),
116+
);
117+
});
118+
119+
it('should resolve when path has extension but path is not found', () => {
120+
expect(() => resolveFile('./__fixtures__/nonexistant.js')).toThrowError(
121+
`Cannot find module './__fixtures__/nonexistant.js' from 'file.ts'`,
122+
);
123+
});
124+
125+
it('should resolve when path has no extension', () => {
126+
const resolvedPath = resolveFile(
127+
path.join(__dirname, '__fixtures__', 'file'),
128+
);
129+
expect(resolvedPath).toEqual(
130+
require.resolve(path.join(__dirname, '__fixtures__', 'file')),
131+
);
132+
});
133+
});

packages/graphql-language-service-utils/src/file.spec.ts

Lines changed: 0 additions & 110 deletions
This file was deleted.

packages/graphql-language-service-utils/src/file.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,33 @@ export function getPathWithoutExtension(
2323

2424
function handleExtensionErr(extension: string | null) {
2525
if (extension) {
26-
throw Error(`cannot require() module with extension '${extension}'`);
26+
throw Error(`cannot import() module with extension '${extension}'`);
2727
}
2828
}
29+
2930
// these make webpack happy
3031

32+
const resolveJs = (path: string) => require.resolve(path + '.js');
33+
const resolveJSON = (path: string) => require.resolve(path + '.json');
34+
35+
const importJs = (path: string) => import(path + '.js');
36+
const importJSON = (path: string) => import(path + '.json');
37+
3138
export function resolveFile(filePath: string) {
3239
const extension = getFileExtension(filePath);
3340
const pathWithoutExtension = getPathWithoutExtension(filePath, extension);
3441
switch (extension) {
3542
case 'js': {
36-
return require.resolve(pathWithoutExtension + '.js');
43+
return resolveJs(pathWithoutExtension);
3744
}
3845
case 'json': {
39-
return require.resolve(pathWithoutExtension + '.json');
46+
return resolveJSON(pathWithoutExtension);
4047
}
4148
default: {
4249
try {
43-
return require.resolve(filePath + '.js');
44-
} catch (err) {
45-
try {
46-
return require.resolve(filePath + '.json');
47-
} catch (err) {
48-
handleExtensionErr(extension);
49-
throw err;
50-
}
50+
return resolveJs(filePath);
51+
} catch (_error) {
52+
return resolveJSON(filePath);
5153
}
5254
}
5355
}
@@ -60,29 +62,30 @@ export function resolveFile(filePath: string) {
6062
export function requireFile(filePath: string) {
6163
const extension = getFileExtension(filePath);
6264
const pathWithoutExtension = getPathWithoutExtension(filePath, extension);
65+
6366
switch (extension) {
6467
case 'js': {
65-
if (resolveFile(pathWithoutExtension + '.js')) {
66-
return import(pathWithoutExtension + '.js');
68+
if (resolveFile(pathWithoutExtension + `.js`)) {
69+
return importJs(pathWithoutExtension);
6770
}
6871
return null;
6972
}
7073
case 'json': {
71-
if (resolveFile(pathWithoutExtension + '.json')) {
72-
return import(pathWithoutExtension + '.json');
74+
if (resolveFile(pathWithoutExtension + `.json`)) {
75+
return importJSON(pathWithoutExtension);
7376
}
7477
return null;
7578
}
7679
default: {
7780
try {
7881
if (resolveFile(filePath + `.js`)) {
79-
return import(filePath + '.js');
82+
return importJs(filePath);
8083
}
8184
} catch (err) {
8285
handleExtensionErr(extension);
8386
}
8487
if (resolveFile(filePath + `.json`)) {
85-
return import(filePath + '.json');
88+
return importJSON(filePath);
8689
}
8790
handleExtensionErr(extension);
8891
}

packages/graphql-language-service-utils/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
{
99
"path": "../graphql-language-service-types"
1010
}
11-
]
11+
],
12+
"exclude": ["**/*-test.*","**/*.spec.*"]
1213
}

0 commit comments

Comments
 (0)