-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
ConfigLoader.js
111 lines (93 loc) Β· 3.04 KB
/
ConfigLoader.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// @flow
import type {ConfigRequestDesc, ParcelOptions} from './types';
import type ParcelConfig from './ParcelConfig';
import invariant from 'assert';
import nullthrows from 'nullthrows';
import {md5FromString, PromiseQueue} from '@parcel/utils';
import {PluginLogger} from '@parcel/logger';
import {createConfig} from './InternalConfig';
import Config from './public/Config';
import loadParcelConfig from './loadParcelConfig';
import loadPlugin from './loadParcelPlugin';
export default class ConfigLoader {
options: ParcelOptions;
parcelConfig: ParcelConfig;
queue: PromiseQueue<any>;
constructor(options: ParcelOptions) {
this.options = options;
this.queue = new PromiseQueue({maxConcurrent: 32});
}
load(configRequest: ConfigRequestDesc) {
let promise = this.queue.add(() => this._load(configRequest));
this.queue.run();
return promise;
}
_load(configRequest: ConfigRequestDesc) {
if (!configRequest.plugin) {
return this.loadParcelConfig(configRequest);
}
return this.loadPluginConfig(configRequest);
}
async loadParcelConfig(configRequest: ConfigRequestDesc) {
let {filePath, isSource, env, pipeline} = configRequest;
let config = createConfig({
isSource,
searchPath: filePath,
env,
});
let publicConfig = new Config(config, this.options);
let {config: parcelConfig, extendedFiles} = nullthrows(
await loadParcelConfig(filePath, this.options),
);
publicConfig.setResolvedPath(parcelConfig.filePath);
publicConfig.setResult(parcelConfig.getConfig());
this.parcelConfig = parcelConfig;
let devDeps = [];
switch (configRequest.meta.actionType) {
case 'transformation':
devDeps = parcelConfig.getTransformerNames(filePath, pipeline);
break;
case 'validation':
devDeps = parcelConfig.getValidatorNames(filePath);
break;
case 'dependency':
devDeps = parcelConfig.getResolverNames();
break;
}
devDeps.forEach(devDep => publicConfig.addDevDependency(devDep));
publicConfig.setResultHash(md5FromString(JSON.stringify(devDeps)));
publicConfig.setWatchGlob('**/.parcelrc');
// TODO: if extended config comes from a package, yarn.lock change should invalidate config request
for (let extendedFile of extendedFiles) {
publicConfig.addIncludedFile(extendedFile);
}
return config;
}
async loadPluginConfig({
plugin,
env,
isSource,
filePath,
meta: {parcelConfigPath},
}: ConfigRequestDesc) {
let config = createConfig({
isSource,
searchPath: filePath,
env,
});
invariant(typeof parcelConfigPath === 'string');
let pluginInstance = await loadPlugin(
this.options.packageManager,
nullthrows(plugin),
parcelConfigPath,
);
if (pluginInstance.loadConfig != null) {
await pluginInstance.loadConfig({
config: new Config(config, this.options),
options: this.options,
logger: new PluginLogger({origin: nullthrows(plugin)}),
});
}
return config;
}
}