-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPlaceHolderResolver.js
40 lines (37 loc) · 1.42 KB
/
PlaceHolderResolver.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
/* eslint-disable import/extensions */
import Resolver from './Resolver.js';
import SelectiveResolver from './SelectiveResolver.js';
import PlaceHolderSelector from './PlaceHolderSelector.js';
export default class PlaceHolderResolver extends SelectiveResolver {
constructor(selector, reference) {
super(selector || (new PlaceHolderSelector()));
this.reference = reference;
}
resolve(config) {
const self = this;
const resolvedConfig = Resolver.prototype.mapValuesDeep(config, (v) => {
if (self.selector.matches(v)) {
try {
let resolvedValue = '';
let remainder = v;
let placeholder;
while (resolvedValue === '' || (remainder.includes('${')
&& remainder.includes('}')
&& remainder.indexOf('${') < remainder.indexOf('}'))
) {
resolvedValue = `${resolvedValue}${remainder.substring(0, remainder.indexOf('${'))}`;
placeholder = remainder.substring(remainder.indexOf('${') + 2, remainder.indexOf('}'));
resolvedValue = `${resolvedValue}${self.reference.get(placeholder)}`;
remainder = remainder.substring(remainder.indexOf('}') + 1);
}
resolvedValue = `${resolvedValue}${remainder}`;
return resolvedValue;
} catch (e) {
return v;
}
}
return v;
});
return resolvedConfig;
}
}