Skip to content

Commit dac8968

Browse files
committed
enhancement(types): Enable strictNullChecks and throw errors in unhandled situations
1 parent c22c199 commit dac8968

File tree

34 files changed

+216
-95
lines changed

34 files changed

+216
-95
lines changed

src/create-mock-list.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
import { DeepPartial } from './partial/deepPartial';
2-
export declare function createMockList<T extends object>(quantity: number, iterator?: (index: number) => DeepPartial<T>): T[];
2+
export declare function createMockList<T extends object | undefined>(quantity: number, iterator?: (index: number) => DeepPartial<T>): T[];

src/create-mock.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
import { DeepPartial } from './partial/deepPartial';
22

3-
export declare function createMock<T extends object>(values?: DeepPartial<T>): T;
3+
export declare function createMock<T extends object | undefined>(values?: DeepPartial<T>): T;

src/extension/extensionHandler.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export class ExtensionHandler<TMock> {
2525
return extensionOrPropertyName(this._mock);
2626
}
2727

28+
if (!maybePropertyHandler) {
29+
throw new Error('Unhandled');
30+
}
31+
2832
return maybePropertyHandler(this._mock[extensionOrPropertyName], this._mock, extensionOrPropertyName);
2933
}
3034
}

src/options/options.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ export interface TsAutoMockOptions {
77
cacheBetweenTests: TsAutoMockCacheOptions;
88
}
99

10-
let options: TsAutoMockOptions = null;
10+
let options: TsAutoMockOptions | undefined;
1111

12-
export function SetTsAutoMockOptions(_options: TsAutoMockOptions): void {
12+
export function SetTsAutoMockOptions(_options?: TsAutoMockOptions): void {
1313
options = _options;
1414
}
1515

src/transformer/base/base.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,17 @@ function visitNode(node: ts.Node, visitor: Visitor, customFunctions: CustomFunct
4242
return node;
4343
}
4444

45-
const signature: ts.Signature = TypescriptHelper.getSignatureOfCallExpression(node);
45+
const signature: ts.Signature | undefined = TypescriptHelper.getSignatureOfCallExpression(node);
4646

47-
if (!isFunctionFromThisLibrary(signature, customFunctions)) {
47+
if (!signature || !isFunctionFromThisLibrary(signature, customFunctions)) {
4848
return node;
4949
}
5050

51-
const nodeToMock: ts.TypeNode = node.typeArguments[0];
51+
const nodeToMock: ts.TypeNode | undefined = node.typeArguments?.[0];
52+
53+
if (!nodeToMock) {
54+
throw new Error('Unhandled');
55+
}
5256

5357
MockDefiner.instance.setFileNameFromNode(nodeToMock);
5458
MockDefiner.instance.setTsAutoMockImportIdentifier();

src/transformer/descriptor/helper/helper.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ export namespace TypescriptHelper {
1616

1717
export function GetDeclarationFromNode(node: ts.Node): ts.Declaration {
1818
const typeChecker: ts.TypeChecker = TypeChecker();
19-
const symbol: ts.Symbol = typeChecker.getSymbolAtLocation(node);
19+
const symbol: ts.Symbol | undefined = typeChecker.getSymbolAtLocation(node);
20+
21+
if (!symbol) {
22+
throw new Error('Unhandled');
23+
}
2024

2125
return GetDeclarationFromSymbol(symbol);
2226
}
@@ -56,11 +60,13 @@ export namespace TypescriptHelper {
5660
export function GetParameterOfNode(node: ts.EntityName): ts.NodeArray<ts.TypeParameterDeclaration> {
5761
const declaration: ts.Declaration = GetDeclarationFromNode(node);
5862

59-
return (declaration as Declaration).typeParameters;
63+
const { typeParameters = ts.createNodeArray([]) }: Declaration = (declaration as Declaration);
64+
65+
return typeParameters;
6066
}
6167

62-
export function GetTypeParameterOwnerMock(declaration: ts.Declaration): ts.Declaration {
63-
const typeDeclaration: ts.Declaration = ts.getTypeParameterOwner(declaration);
68+
export function GetTypeParameterOwnerMock(declaration: ts.Declaration): ts.Declaration | undefined {
69+
const typeDeclaration: ts.Declaration | undefined = ts.getTypeParameterOwner(declaration);
6470

6571
// THIS IS TO FIX A MISSING IMPLEMENTATION IN TYPESCRIPT https://github.com/microsoft/TypeScript/blob/ba5e86f1406f39e89d56d4b32fd6ff8de09a0bf3/src/compiler/utilities.ts#L5138
6672
if (typeDeclaration && (typeDeclaration as Declaration).typeParameters) {
@@ -79,7 +85,12 @@ export namespace TypescriptHelper {
7985
return propertyName.text;
8086
}
8187

82-
const symbol: ts.Symbol = TypeChecker().getSymbolAtLocation(propertyName);
88+
const symbol: ts.Symbol | undefined = TypeChecker().getSymbolAtLocation(propertyName);
89+
90+
if (!symbol) {
91+
throw new Error('Unhandled');
92+
}
93+
8394
return symbol.escapedName.toString();
8495
}
8596

@@ -88,7 +99,7 @@ export namespace TypescriptHelper {
8899
}
89100

90101

91-
export function getSignatureOfCallExpression(node: ts.CallExpression): ts.Signature {
102+
export function getSignatureOfCallExpression(node: ts.CallExpression): ts.Signature | undefined {
92103
const typeChecker: ts.TypeChecker = TypeChecker();
93104

94105
return typeChecker.getResolvedSignature(node);
@@ -109,9 +120,9 @@ export namespace TypescriptHelper {
109120

110121
function GetDeclarationsForImport(node: ImportDeclaration): ts.Declaration[] {
111122
const typeChecker: ts.TypeChecker = TypeChecker();
112-
const symbol: ts.Symbol = typeChecker.getSymbolAtLocation(node.name);
113-
const originalSymbol: ts.Symbol = typeChecker.getAliasedSymbol(symbol);
123+
const symbol: ts.Symbol | undefined = node.name && typeChecker.getSymbolAtLocation(node.name);
124+
const originalSymbol: ts.Symbol | undefined = symbol && typeChecker.getAliasedSymbol(symbol);
114125

115-
return originalSymbol.declarations;
126+
return originalSymbol?.declarations ?? [];
116127
}
117128
}

src/transformer/descriptor/indexedAccess/indexedAccess.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ export function GetIndexedAccessTypeDescriptor(node: ts.IndexedAccessTypeNode, s
3737
}
3838

3939
if (propertyName !== null) {
40-
const propertySymbol: ts.Symbol = typeChecker.getPropertyOfType(typeChecker.getTypeFromTypeNode(node.objectType), propertyName);
40+
const propertySymbol: ts.Symbol | undefined = typeChecker.getPropertyOfType(typeChecker.getTypeFromTypeNode(node.objectType), propertyName);
41+
42+
if (!propertySymbol) {
43+
throw new Error('Unhandled');
44+
}
45+
4146
return GetDescriptor(TypescriptHelper.GetDeclarationFromSymbol(propertySymbol), scope);
4247
}
4348

src/transformer/descriptor/mapped/mapped.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@ import { GetMockPropertiesFromDeclarations } from '../mock/mockProperties';
66
import { GetTypes } from '../type/type';
77

88
export function GetMappedDescriptor(node: ts.MappedTypeNode, scope: Scope): ts.Expression {
9-
const typeParameter: ts.TypeNode = node.typeParameter.constraint;
9+
const typeParameter: ts.TypeNode | undefined = node.typeParameter.constraint;
1010
const typeChecker: ts.TypeChecker = TypeChecker();
11-
const types: ts.Node[] = GetTypes(ts.createNodeArray([typeParameter]), scope);
11+
12+
const parameters: ts.TypeNode[] = [];
13+
if (typeParameter) {
14+
parameters.push(typeParameter);
15+
}
16+
17+
const types: ts.Node[] = GetTypes(ts.createNodeArray(parameters), scope);
1218

1319
const properties: ts.PropertyDeclaration[] = types.reduce((acc: ts.PropertyDeclaration[], possibleType: ts.Node) => {
1420
if (ts.isLiteralTypeNode(possibleType)) {

src/transformer/descriptor/method/bodyReturnType.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ export function GetReturnTypeFromBodyDescriptor(node: ts.ArrowFunction | ts.Func
88
}
99

1010
export function GetReturnNodeFromBody(node: ts.FunctionLikeDeclaration): ts.Node {
11-
let returnValue: ts.Node;
11+
let returnValue: ts.Node | undefined;
1212

13-
const functionBody: ts.ConciseBody = node.body;
13+
const functionBody: ts.ConciseBody | undefined = node.body;
1414

15-
if (ts.isBlock(functionBody)) {
15+
if (functionBody && ts.isBlock(functionBody)) {
1616
const returnStatement: ts.ReturnStatement = GetReturnStatement(functionBody);
1717

1818
if (returnStatement) {
@@ -24,6 +24,10 @@ export function GetReturnNodeFromBody(node: ts.FunctionLikeDeclaration): ts.Node
2424
returnValue = node.body;
2525
}
2626

27+
if (!returnValue) {
28+
throw new Error('Unhandled');
29+
}
30+
2731
return returnValue;
2832
}
2933

src/transformer/descriptor/method/functionType.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import { GetMethodDescriptor } from './method';
77
export function GetFunctionTypeDescriptor(node: ts.FunctionTypeNode | ts.CallSignatureDeclaration | ts.ConstructSignatureDeclaration, scope: Scope): ts.Expression {
88
const property: ts.PropertyName = PropertySignatureCache.instance.get();
99

10+
if (!node.type) {
11+
throw new Error('Unhandled');
12+
}
13+
1014
const returnValue: ts.Expression = GetDescriptor(node.type, scope);
1115

1216
return GetMethodDescriptor(property, returnValue);

0 commit comments

Comments
 (0)