Skip to content

Commit 1d80c1a

Browse files
committed
feat(type-compiler): improve performance drastically
By making sure only .ts/d.ts are parsed, globals are cached and correctly excluded. Performance improvements: Angular website build, from 61s to 11s. @deepkit/desktop-ui from 60s to 8s.
1 parent 969c0a3 commit 1d80c1a

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

packages/type-compiler/src/compiler.ts

+22-11
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ import ts, {
7070
TypeParameterDeclaration,
7171
TypeQueryNode,
7272
TypeReferenceNode,
73-
UnionTypeNode
73+
UnionTypeNode,
7474
} from 'typescript';
7575

7676
import {
@@ -461,6 +461,8 @@ export class Cache {
461461
resolver: ReflectionConfigCache = {};
462462
sourceFiles: { [fileName: string]: SourceFile } = {};
463463

464+
globalSourceFiles?: SourceFile[];
465+
464466
/**
465467
* Signals the cache to check if it needs to be cleared.
466468
*/
@@ -600,8 +602,13 @@ export class ReflectionTransformer implements CustomTransformer {
600602
this.embedAssignType = false;
601603
this.addImports = [];
602604

605+
const start = Date.now();
603606
const reflection = this.getReflectionConfig(sourceFile);
604-
debug(`Transform file with reflection=${reflection.mode} (${this.getModuleType()}) ${sourceFile.fileName} via config ${reflection.tsConfigPath || 'none'}.`);
607+
608+
if (reflection.mode === 'never') {
609+
debug(`Transform file with reflection=${reflection.mode} (${this.getModuleType()}) ${sourceFile.fileName} via config ${reflection.tsConfigPath || 'none'}.`);
610+
return sourceFile;
611+
}
605612

606613
if (!(sourceFile as any).locals) {
607614
//@ts-ignore
@@ -1008,8 +1015,9 @@ export class ReflectionTransformer implements CustomTransformer {
10081015
// this.sourceFile = this.f.updateSourceFile(this.sourceFile, [...newTopStatements, ...this.sourceFile.statements]);
10091016
}
10101017

1011-
// console.log('transform sourceFile', this.sourceFile.fileName);
10121018
// console.log(createPrinter().printNode(EmitHint.SourceFile, this.sourceFile, this.sourceFile));
1019+
const took = Date.now() - start;
1020+
debug(`Transform file with reflection=${reflection.mode} took ${took}ms (${this.getModuleType()}) ${sourceFile.fileName} via config ${reflection.tsConfigPath || 'none'}.`);
10131021
return this.sourceFile;
10141022
}
10151023

@@ -1809,12 +1817,10 @@ export class ReflectionTransformer implements CustomTransformer {
18091817
'Boolean': ReflectionOp.boolean,
18101818
};
18111819

1812-
protected globalSourceFiles?: SourceFile[];
1813-
18141820
protected getGlobalLibs(): SourceFile[] {
1815-
if (this.globalSourceFiles) return this.globalSourceFiles;
1821+
if (this.cache.globalSourceFiles) return this.cache.globalSourceFiles;
18161822

1817-
this.globalSourceFiles = [];
1823+
this.cache.globalSourceFiles = [];
18181824

18191825
//todo also read compiler options "types" + typeRoot
18201826

@@ -1827,11 +1833,12 @@ export class ReflectionTransformer implements CustomTransformer {
18271833
const libs = knownLibFilesForCompilerOptions(options, ts);
18281834

18291835
for (const lib of libs) {
1836+
if (this.isExcluded(lib)) continue;
18301837
const sourceFile = this.resolver.resolveSourceFile(this.sourceFile, this.f.createStringLiteral('typescript/lib/' + lib.replace('.d.ts', '')));
18311838
if (!sourceFile) continue;
1832-
this.globalSourceFiles.push(sourceFile);
1839+
this.cache.globalSourceFiles.push(sourceFile);
18331840
}
1834-
return this.globalSourceFiles;
1841+
return this.cache.globalSourceFiles;
18351842
}
18361843

18371844
/**
@@ -1986,6 +1993,7 @@ export class ReflectionTransformer implements CustomTransformer {
19861993
}
19871994

19881995
const resolved = this.resolveDeclaration(typeName);
1996+
19891997
if (!resolved) {
19901998
//maybe reference to enum
19911999
if (isQualifiedName(typeName)) {
@@ -2520,13 +2528,16 @@ export class ReflectionTransformer implements CustomTransformer {
25202528
* }
25212529
*/
25222530
protected decorateClass(sourceFile: SourceFile, node: ClassDeclaration | ClassExpression): Node {
2523-
const name = getNameAsString(node.name);
25242531
const reflection = this.isWithReflection(sourceFile, node);
25252532
if (!reflection) {
25262533
return node;
25272534
}
25282535
const type = this.getTypeOfType(node);
2529-
const __type = this.f.createPropertyDeclaration(this.f.createModifiersFromModifierFlags(ModifierFlags.Static), '__type', undefined, undefined, type);
2536+
const __type = this.f.createPropertyDeclaration(
2537+
this.f.createModifiersFromModifierFlags(ModifierFlags.Static), '__type',
2538+
undefined, undefined,
2539+
type);
2540+
25302541
if (isClassDeclaration(node)) {
25312542
// return node;
25322543
return this.f.updateClassDeclaration(node, node.modifiers,

packages/type-compiler/src/config.ts

+5
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ export interface MatchResult {
216216
export const defaultExcluded = [
217217
'lib.dom*.d.ts',
218218
'*typedarrays.d.ts',
219+
'lib.webworker*.d.ts',
220+
'lib.decorator*.d.ts',
221+
'lib.es2015.proxy.d.ts',
222+
'lib.es2020.sharedmemory.d.ts',
223+
'lib.es2015.core.d.ts',
219224
];
220225

221226
export type Matcher = (path: string) => MatchResult;

packages/type-compiler/src/resolver.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ export class Resolver {
8282
const result = this.resolveImpl(modulePath, sourceFile);
8383
if (!result) return;
8484

85+
// only .ts and .d.ts files are supported
86+
if (!result.resolvedFileName.endsWith('.ts') && !result.resolvedFileName.endsWith('.d.ts')) {
87+
return;
88+
}
89+
8590
const fileName = result.resolvedFileName;
8691
if (this.sourceFiles[fileName]) return this.sourceFiles[fileName];
8792

@@ -90,7 +95,7 @@ export class Resolver {
9095
const moduleSourceFile = this.sourceFiles[fileName] = createSourceFile(fileName, source, {
9196
languageVersion: this.compilerOptions.target || ScriptTarget.ES2018,
9297
jsDocParsingMode: JSDocParsingMode.ParseNone,
93-
}, false);
98+
}, true);
9499

95100
this.sourceFiles[fileName] = moduleSourceFile;
96101

0 commit comments

Comments
 (0)