forked from CacheControl/json-rules-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterpolate.js
27 lines (17 loc) · 919 Bytes
/
interpolate.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
export const defaultInterpolation = /\{\{\s*(.+?)\s*\}\}/g
export const needsInterpolation = (rule,regexp) => regexp.test(rule.toJSON(true));
const interpolate = (subject = '', params = {}, regexp, resolver) => {
let shouldReplaceFull, found;
const replaced = subject.replace(regexp, (full, matched) => {
shouldReplaceFull = full === subject;
found = resolver(params, matched);
return shouldReplaceFull ? '' : found;
});
return shouldReplaceFull ? found : replaced;
};
export const interpolateDeep = (o, params, regexp, resolver) => {
if (!o || typeof o === 'number' || typeof o === 'boolean') return o;
if (typeof o === 'string') return interpolate(o,params,regexp,resolver)
if (Array.isArray(o)) return o.map(t => interpolateDeep(t, params, regexp, resolver));
return Object.entries(o).reduce((acc, [k, v]) => ({...acc,[k]: interpolateDeep(v, params, regexp, resolver)}),{});
};