-
-
Notifications
You must be signed in to change notification settings - Fork 237
/
TypeScriptReporterConfiguration.ts
88 lines (80 loc) · 2.82 KB
/
TypeScriptReporterConfiguration.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import webpack from 'webpack';
import path from 'path';
import semver from 'semver';
import { TypeScriptDiagnosticsOptions } from './TypeScriptDiagnosticsOptions';
import { TypeScriptReporterOptions } from './TypeScriptReporterOptions';
import {
createTypeScriptVueExtensionConfiguration,
TypeScriptVueExtensionConfiguration,
} from './extension/vue/TypeScriptVueExtensionConfiguration';
import { TypeScriptConfigurationOverwrite } from './TypeScriptConfigurationOverwrite';
interface TypeScriptReporterConfiguration {
enabled: boolean;
memoryLimit: number;
configFile: string;
configOverwrite: TypeScriptConfigurationOverwrite;
build: boolean;
context: string;
mode: 'readonly' | 'write-tsbuildinfo' | 'write-dts' | 'write-references';
diagnosticOptions: TypeScriptDiagnosticsOptions;
extensions: {
vue: TypeScriptVueExtensionConfiguration;
};
profile: boolean;
typescriptPath: string;
}
function createTypeScriptReporterConfiguration(
compiler: webpack.Compiler,
options: TypeScriptReporterOptions | undefined
): TypeScriptReporterConfiguration {
let configFile =
typeof options === 'object' ? options.configFile || 'tsconfig.json' : 'tsconfig.json';
// ensure that `configFile` is an absolute normalized path
configFile = path.normalize(
path.isAbsolute(configFile)
? configFile
: path.resolve(compiler.options.context || process.cwd(), configFile)
);
const optionsAsObject: Exclude<TypeScriptReporterOptions, boolean> =
typeof options === 'object' ? options : {};
const typescriptPath = optionsAsObject.typescriptPath || require.resolve('typescript');
const defaultCompilerOptions: Record<string, unknown> = {
skipLibCheck: true,
sourceMap: false,
inlineSourceMap: false,
};
if (semver.gte(require(typescriptPath).version, '2.9.0')) {
defaultCompilerOptions.declarationMap = false;
}
return {
enabled: options !== false,
memoryLimit: 2048,
build: false,
mode: 'write-tsbuildinfo',
profile: false,
...optionsAsObject,
configFile: configFile,
configOverwrite: {
...(optionsAsObject.configOverwrite || {}),
compilerOptions: {
...defaultCompilerOptions,
...((optionsAsObject.configOverwrite || {}).compilerOptions || {}),
},
},
context: optionsAsObject.context || path.dirname(configFile),
extensions: {
vue: createTypeScriptVueExtensionConfiguration(
optionsAsObject.extensions ? optionsAsObject.extensions.vue : undefined
),
},
diagnosticOptions: {
syntactic: false, // by default they are reported by the loader
semantic: true,
declaration: false,
global: false,
...(optionsAsObject.diagnosticOptions || {}),
},
typescriptPath: typescriptPath,
};
}
export { createTypeScriptReporterConfiguration, TypeScriptReporterConfiguration };