-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
TypeScriptAsset.js
75 lines (64 loc) · 2.14 KB
/
TypeScriptAsset.js
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
const Asset = require('../Asset');
const localRequire = require('../utils/localRequire');
const isAccessedVarChanged = require('../utils/isAccessedVarChanged');
class TypeScriptAsset extends Asset {
constructor(name, options) {
super(name, options);
this.type = 'js';
this.cacheData.env = {};
}
shouldInvalidate(cacheData) {
return isAccessedVarChanged(cacheData);
}
async generate() {
// require typescript, installed locally in the app
let typescript = await localRequire('typescript', this.name);
let transpilerOptions = {
compilerOptions: {
module: this.options.scopeHoist
? typescript.ModuleKind.ESNext
: typescript.ModuleKind.CommonJS,
jsx: typescript.JsxEmit.Preserve,
// it brings the generated output from TypeScript closer to that generated by Babel
// see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html
esModuleInterop: true
},
fileName: this.relativeName
};
let tsconfig = await this.getConfig(['tsconfig.json']);
// Overwrite default if config is found
if (tsconfig) {
transpilerOptions.compilerOptions = Object.assign(
transpilerOptions.compilerOptions,
tsconfig.compilerOptions
);
}
transpilerOptions.compilerOptions.noEmit = false;
transpilerOptions.compilerOptions.sourceMap = this.options.sourceMaps;
// Transpile Module using TypeScript and parse result as ast format through babylon
let transpiled = typescript.transpileModule(
this.contents,
transpilerOptions
);
let sourceMap = transpiled.sourceMapText;
if (sourceMap) {
sourceMap = JSON.parse(sourceMap);
sourceMap.sources = [this.relativeName];
sourceMap.sourcesContent = [this.contents];
// Remove the source map URL
let content = transpiled.outputText;
transpiled.outputText = content.substring(
0,
content.lastIndexOf('//# sourceMappingURL')
);
}
return [
{
type: 'js',
value: transpiled.outputText,
map: sourceMap
}
];
}
}
module.exports = TypeScriptAsset;