Skip to content

Commit

Permalink
fix(gls-utils): #1055 - move file test, refactor for fixtures
Browse files Browse the repository at this point in the history
  • Loading branch information
acao committed Dec 8, 2019
1 parent 4408bec commit 19d8d7f
Show file tree
Hide file tree
Showing 11 changed files with 167 additions and 130 deletions.
3 changes: 2 additions & 1 deletion packages/graphql-language-service-interface/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
},
"license": "MIT",
"files": [
"dist"
"dist",
"esm"
],
"keywords": [
"graphql"
Expand Down
3 changes: 2 additions & 1 deletion packages/graphql-language-service-parser/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
},
"license": "MIT",
"files": [
"dist"
"dist",
"esm"
],
"keywords": [
"graphql"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
example: true,
};
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"name": "example"
}
133 changes: 133 additions & 0 deletions packages/graphql-language-service-utils/src/__tests__/file-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import path from 'path';

import {
getFileExtension,
getPathWithoutExtension,
resolveFile,
requireFile,
} from '../file';

describe('getFileExtension', () => {
it('should resolve an extension', () => {
const extension = getFileExtension('example/example.txt');
expect(extension).toEqual('txt');
});
it('should resolve null when no extension is present', () => {
const extension = getFileExtension('example/example');
expect(extension).toEqual(null);
});

it('should return an extension with multiple dots in the path', () => {
const extension = getFileExtension(
'example.example/example/something.esm.js',
);
expect(extension).toEqual('js');
});
});

describe('getPathWithoutExtension', () => {
it('should resolve when path has extension', () => {
const extension = getPathWithoutExtension('example/example.txt', 'txt');
expect(extension).toEqual('example/example');
});
it('should resolve when path has no extension', () => {
const extension = getPathWithoutExtension(
'example/example.example/example',
null,
);
expect(extension).toEqual('example/example.example/example');
});
});

describe('requireFile', () => {
it('should require file with extension using json', async () => {
const file = await requireFile(
path.join(__dirname, '__fixtures__', 'package.json'),
);
expect(file.name).toEqual('example');
});
it('should require file with extension using js', async () => {
const file = await requireFile(
path.join(__dirname, '__fixtures__', 'file.js'),
);
expect(file.example).toEqual(true);
});
it('should fail when requiring an invalid extension', () => {
expect(() => requireFile('./__fixtures__/invalid.fake')).toThrowError(
`cannot import() module with extension 'fake'`,
);
});
it('should fail when requiring a valid extension (js) but invalid file path', () => {
expect(() => requireFile('./__fixtures__/invalid.js')).toThrowError(
`Cannot find module './__fixtures__/invalid.js' from 'file.ts'`,
);
});
it('should fail when requiring a valid extension (json) but invalid file path', () => {
expect(() => requireFile('./__fixtures__/npmignore.json')).toThrowError(
`Cannot find module './__fixtures__/npmignore.json' from 'file.ts'`,
);
});
it('should require file with no extension using js', async () => {
const config = await requireFile(
path.join(__dirname, '__fixtures__', 'file'),
);
await expect(config.example).toEqual(true);
});
it('should require file with no extension using json', async () => {
const file = await requireFile(
path.join(__dirname, '__fixtures__', 'package'),
);
expect(file.name).toEqual('example');
});
it('should fail when requiring a file with no extension', async () => {
expect(() =>
requireFile(path.join(__dirname, '__fixtures__', 'packages')),
).toThrowError(
`Cannot find module '${__dirname}/__fixtures__/packages.json' from 'file.ts'`,
);
});
});

describe('resolveFile', () => {
it('should resolve when path has extension', () => {
const resolvedPath = resolveFile(
path.join(__dirname, './__fixtures__/package.json'),
);
expect(resolvedPath).toEqual(
require.resolve(path.join(__dirname, '__fixtures__/package.json')),
);
});

it('should resolve when path has extension', () => {
const resolvedPath = resolveFile(
path.join(__dirname, '__fixtures__', 'package'),
);
expect(resolvedPath).toEqual(
require.resolve(path.join(__dirname, '__fixtures__', 'package')),
);
});

it('should resolve when path has extension', () => {
const resolvedPath = resolveFile(
path.join(__dirname, '__fixtures__', 'package'),
);
expect(resolvedPath).toEqual(
require.resolve(path.join(__dirname, '__fixtures__', 'package')),
);
});

it('should resolve when path has extension but path is not found', () => {
expect(() => resolveFile('./__fixtures__/nonexistant.js')).toThrowError(
`Cannot find module './__fixtures__/nonexistant.js' from 'file.ts'`,
);
});

it('should resolve when path has no extension', () => {
const resolvedPath = resolveFile(
path.join(__dirname, '__fixtures__', 'file'),
);
expect(resolvedPath).toEqual(
require.resolve(path.join(__dirname, '__fixtures__', 'file')),
);
});
});
110 changes: 0 additions & 110 deletions packages/graphql-language-service-utils/src/file.spec.ts

This file was deleted.

37 changes: 20 additions & 17 deletions packages/graphql-language-service-utils/src/file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,33 @@ export function getPathWithoutExtension(

function handleExtensionErr(extension: string | null) {
if (extension) {
throw Error(`cannot require() module with extension '${extension}'`);
throw Error(`cannot import() module with extension '${extension}'`);
}
}

// these make webpack happy

const resolveJs = (path: string) => require.resolve(path + '.js');
const resolveJSON = (path: string) => require.resolve(path + '.json');

const importJs = (path: string) => import(path + '.js');
const importJSON = (path: string) => import(path + '.json');

export function resolveFile(filePath: string) {
const extension = getFileExtension(filePath);
const pathWithoutExtension = getPathWithoutExtension(filePath, extension);
switch (extension) {
case 'js': {
return require.resolve(pathWithoutExtension + '.js');
return resolveJs(pathWithoutExtension);
}
case 'json': {
return require.resolve(pathWithoutExtension + '.json');
return resolveJSON(pathWithoutExtension);
}
default: {
try {
return require.resolve(filePath + '.js');
} catch (err) {
try {
return require.resolve(filePath + '.json');
} catch (err) {
handleExtensionErr(extension);
throw err;
}
return resolveJs(filePath);
} catch (_error) {
return resolveJSON(filePath);
}
}
}
Expand All @@ -60,29 +62,30 @@ export function resolveFile(filePath: string) {
export function requireFile(filePath: string) {
const extension = getFileExtension(filePath);
const pathWithoutExtension = getPathWithoutExtension(filePath, extension);

switch (extension) {
case 'js': {
if (resolveFile(pathWithoutExtension + '.js')) {
return import(pathWithoutExtension + '.js');
if (resolveFile(pathWithoutExtension + `.js`)) {
return importJs(pathWithoutExtension);
}
return null;
}
case 'json': {
if (resolveFile(pathWithoutExtension + '.json')) {
return import(pathWithoutExtension + '.json');
if (resolveFile(pathWithoutExtension + `.json`)) {
return importJSON(pathWithoutExtension);
}
return null;
}
default: {
try {
if (resolveFile(filePath + `.js`)) {
return import(filePath + '.js');
return importJs(filePath);
}
} catch (err) {
handleExtensionErr(extension);
}
if (resolveFile(filePath + `.json`)) {
return import(filePath + '.json');
return importJSON(filePath);
}
handleExtensionErr(extension);
}
Expand Down
3 changes: 2 additions & 1 deletion packages/graphql-language-service-utils/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@
{
"path": "../graphql-language-service-types"
}
]
],
"exclude": ["**/*-test.*","**/*.spec.*"]
}
2 changes: 2 additions & 0 deletions resources/buildJs.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ const commands = [
'**/__tests__/**',
'--ignore',
'**/*.spec.*',
'--ignore',
'**/*-test.*',
'--out-dir',
'dist',
'--root-mode',
Expand Down

0 comments on commit 19d8d7f

Please sign in to comment.