-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
loadConfigFile.ts
75 lines (67 loc) · 2.24 KB
/
loadConfigFile.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
import path from 'path';
import rollup from 'rollup';
import tc from 'turbocolor';
import { RollupBuild, RollupOutput } from '../../../src/rollup/types';
import { GenericConfigObject } from '../../../src/utils/mergeOptions';
import relativeId from '../../../src/utils/relativeId';
import { handleError, stderr } from '../logging';
import batchWarnings from './batchWarnings';
interface NodeModuleWithCompile extends NodeModule {
_compile(code: string, filename: string): any;
}
export default function loadConfigFile(
configFile: string,
commandOptions: any = {}
): Promise<GenericConfigObject[]> {
const silent = commandOptions.silent || false;
const warnings = batchWarnings();
return rollup
.rollup({
external: (id: string) =>
(id[0] !== '.' && !path.isAbsolute(id)) || id.slice(-5, id.length) === '.json',
input: configFile,
onwarn: warnings.add,
treeshake: false
})
.then((bundle: RollupBuild) => {
if (!silent && warnings.count > 0) {
stderr(tc.bold(`loaded ${relativeId(configFile)} with warnings`));
warnings.flush();
}
return bundle.generate({
exports: 'named',
format: 'cjs'
});
})
.then(({ output: [{ code }] }: RollupOutput) => {
// temporarily override require
const defaultLoader = require.extensions['.js'];
require.extensions['.js'] = (module: NodeModule, filename: string) => {
if (filename === configFile) {
(module as NodeModuleWithCompile)._compile(code, filename);
} else {
defaultLoader(module, filename);
}
};
delete require.cache[configFile];
return Promise.resolve(require(configFile))
.then(configFileContent => {
if (configFileContent.default) configFileContent = configFileContent.default;
if (typeof configFileContent === 'function') {
return configFileContent(commandOptions);
}
return configFileContent;
})
.then(configs => {
if (Object.keys(configs).length === 0) {
handleError({
code: 'MISSING_CONFIG',
message: 'Config file must export an options object, or an array of options objects',
url: 'https://rollupjs.org/guide/en/#configuration-files'
});
}
require.extensions['.js'] = defaultLoader;
return Array.isArray(configs) ? configs : [configs];
});
});
}