-
-
Notifications
You must be signed in to change notification settings - Fork 431
/
Copy pathcompilerSetup.ts
86 lines (76 loc) · 2.75 KB
/
compilerSetup.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
import * as semver from 'semver';
import type * as typescript from 'typescript';
import type { LoaderOptions } from './interfaces';
import type * as logger from './logger';
export function getCompiler(loaderOptions: LoaderOptions, log: logger.Logger) {
let compiler: typeof typescript | undefined;
let errorMessage: string | undefined;
let compilerDetailsLogMessage: string | undefined;
let compilerCompatible = false;
try {
compiler = require(loaderOptions.compiler);
} catch (e) {
errorMessage =
loaderOptions.compiler === 'typescript'
? 'Could not load TypeScript. Try installing with `yarn add typescript` or `npm install typescript`. If TypeScript is installed globally, try using `yarn link typescript` or `npm link typescript`.'
: `Could not load TypeScript compiler with NPM package name \`${loaderOptions.compiler}\`. Are you sure it is correctly installed?`;
}
if (errorMessage === undefined) {
compilerDetailsLogMessage = `ts-loader: Using ${loaderOptions.compiler}@${
compiler!.version
}`;
compilerCompatible = false;
if (loaderOptions.compiler === 'typescript') {
if (
compiler!.version !== undefined &&
semver.gte(compiler!.version, '3.6.3')
) {
// don't log yet in this case, if a tsconfig.json exists we want to combine the message
compilerCompatible = true;
} else {
log.logError(
`${compilerDetailsLogMessage}. This version is incompatible with ts-loader. Please upgrade to the latest version of TypeScript.`
);
}
} else {
log.logWarning(
`${compilerDetailsLogMessage}. This version may or may not be compatible with ts-loader.`
);
}
}
return {
compiler,
compilerCompatible,
compilerDetailsLogMessage,
errorMessage,
};
}
export function getCompilerOptions(
configParseResult: typescript.ParsedCommandLine,
compiler: typeof typescript
) {
const defaultOptions = { skipLibCheck: true };
const compilerOptions = Object.assign(
defaultOptions,
configParseResult.options,
{
suppressOutputPathCheck: true, // This is why: https://github.com/Microsoft/TypeScript/issues/7363
} as typescript.CompilerOptions
);
// if `module` is not specified and not using ES6+ target, default to CJS module output
if (
compilerOptions.module === undefined &&
compilerOptions.target !== undefined &&
compilerOptions.target < compiler.ScriptTarget.ES2015
) {
compilerOptions.module = compiler.ModuleKind.CommonJS;
}
if (configParseResult.options.configFile) {
Object.defineProperty(compilerOptions, 'configFile', {
enumerable: false,
writable: false,
value: configParseResult.options.configFile,
});
}
return compilerOptions;
}