1 | export const KEY_DELIMITER = '__dot__';
|
2 | export const EXPANSION_PREFIX = '__exp';
|
3 | export function preparseMergeArgsExpr(mergeArgsExpr) {
|
4 | const variableRegex = /\$[_A-Za-z][_A-Za-z0-9.]*/g;
|
5 | const dotRegex = /\./g;
|
6 | mergeArgsExpr = mergeArgsExpr.replace(variableRegex, variable => variable.replace(dotRegex, KEY_DELIMITER));
|
7 | const segments = mergeArgsExpr.split('[[');
|
8 | const expansionExpressions = Object.create(null);
|
9 | if (segments.length === 1) {
|
10 | return { mergeArgsExpr, expansionExpressions };
|
11 | }
|
12 | let finalSegments = [segments[0]];
|
13 | for (let i = 1; i < segments.length; i++) {
|
14 | const additionalSegments = segments[i].split(']]');
|
15 | if (additionalSegments.length !== 2) {
|
16 | throw new Error(`Each opening "[[" must be matched by a closing "]]" without nesting.`);
|
17 | }
|
18 | finalSegments = finalSegments.concat(additionalSegments);
|
19 | }
|
20 | let finalMergeArgsExpr = finalSegments[0];
|
21 | for (let i = 1; i < finalSegments.length - 1; i += 2) {
|
22 | const variableName = `${EXPANSION_PREFIX}${(i - 1) / 2 + 1}`;
|
23 | expansionExpressions[variableName] = finalSegments[i];
|
24 | finalMergeArgsExpr += `\$${variableName}${finalSegments[i + 1]}`;
|
25 | }
|
26 | return { mergeArgsExpr: finalMergeArgsExpr, expansionExpressions };
|
27 | }
|