-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathloader.js
64 lines (52 loc) · 2.09 KB
/
loader.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
const loaderUtils = require('loader-utils');
const kotlinCompiler = require('./compiler/kotlin-compiler');
const sourceMapResolve = require("source-map-resolve")
const fs = require('fs');
const path = require('path');
const SOURCE_MAP_RELATED_PATH = path.resolve('./', './compiler/file-name-doesnt-matter.js');
const dependencyCache = new Map();
function fillEmptySourcesContent(compileRes) {
return new Promise((resolve, reject) => {
sourceMapResolve.resolveSources(compileRes.sourceMap, SOURCE_MAP_RELATED_PATH, fs.readFile, (error, res) => {
if (error) {
return reject(error);
}
compileRes.sourceMap.sourcesContent = res.sourcesContent;
resolve(compileRes);
});
});
}
function addAndCacheDependencies(entryFileName, pathes, addDependency) {
pathes.forEach(addDependency);
dependencyCache.set(entryFileName, pathes);
}
function addCachedDependencies(entryFileName, addDependency) {
dependencyCache.get(entryFileName).forEach(addDependency);
}
module.exports = function (sourceCode) {
this.cacheable();
const addDependency = this.addDependency.bind(this);
const options = loaderUtils.getOptions(this);
const callback = this.async();
if (!callback) {
throw new Error('webpack-kotlin-loader currently only supports async mode.');
}
const filename = loaderUtils.getRemainingRequest(this);
const sourcePathes = [filename, options.srcRoot].concat(options.srcRoots).filter(str => !!str);
kotlinCompiler.compile(Object.assign({
sources: sourcePathes,
sourceMaps: true,
moduleKind: 'commonjs',
libraries: options.libraries || []
}, options.compilerOptions))
.then(fillEmptySourcesContent)
.then(result => {
addAndCacheDependencies(filename, result.sourceMap.sources, addDependency);
return result;
})
.then(result => callback(null, result.compiledSource, result.sourceMap))
.catch(err => {
addCachedDependencies(filename, addDependency);
callback(err);
});
};