|
4 | 4 | */ |
5 | 5 | var ContextDependencyHelpers = exports; |
6 | 6 |
|
| 7 | +/** |
| 8 | + * Escapes regular expression metacharacters |
| 9 | + * @param {string} str |
| 10 | + * @return string |
| 11 | + */ |
| 12 | +function quotemeta(str) { |
| 13 | + return str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&") |
| 14 | +} |
| 15 | + |
7 | 16 | ContextDependencyHelpers.create = function(Dep, range, param, expr, options) { |
8 | | - var dep; |
9 | | - if(param.isWrapped() && (param.prefix && param.prefix.isString() || param.postfix && param.postfix.isString())) { |
10 | | - var prefix = param.prefix && param.prefix.isString() ? param.prefix.string : ""; |
11 | | - var postfix = param.postfix && param.postfix.isString() ? param.postfix.string : ""; |
12 | | - var prefixRange = param.prefix && param.prefix.isString() ? param.prefix.range : null; |
13 | | - var valueRange = [prefixRange ? prefixRange[1] : param.range[0], param.range[1]]; |
14 | | - var idx = prefix.lastIndexOf("/"); |
15 | | - var context = "."; |
| 17 | + var dep, prefix, postfix, prefixRange, valueRange, idx, context, regExp; |
| 18 | + if(param.isTemplateString()) { |
| 19 | + prefix = param.quasis[0].string; |
| 20 | + postfix = param.quasis.length > 1 ? param.quasis[param.quasis.length - 1].string : ""; |
| 21 | + prefixRange = [param.quasis[0].range[0], param.quasis[0].range[1]]; |
| 22 | + valueRange = param.range; |
| 23 | + idx = prefix.lastIndexOf("/"); |
| 24 | + context = "."; |
| 25 | + if(idx >= 0) { |
| 26 | + context = prefix.substr(0, idx); |
| 27 | + prefix = "." + prefix.substr(idx); |
| 28 | + } |
| 29 | + // If there are more than two quasis, maybe the generated RegExp can be more precise? |
| 30 | + regExp = new RegExp("^" + |
| 31 | + quotemeta(prefix) + |
| 32 | + options.wrappedContextRegExp.source + |
| 33 | + quotemeta(postfix) + "$"); |
| 34 | + dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange); |
| 35 | + dep.loc = expr.loc; |
| 36 | + dep.replaces = [{ |
| 37 | + range: prefixRange, |
| 38 | + value: prefix |
| 39 | + }]; |
| 40 | + dep.critical = options.wrappedContextCritical && "a part of the request of a dependency is an expression"; |
| 41 | + return dep; |
| 42 | + } else if(param.isWrapped() && (param.prefix && param.prefix.isString() || param.postfix && param.postfix.isString())) { |
| 43 | + prefix = param.prefix && param.prefix.isString() ? param.prefix.string : ""; |
| 44 | + postfix = param.postfix && param.postfix.isString() ? param.postfix.string : ""; |
| 45 | + prefixRange = param.prefix && param.prefix.isString() ? param.prefix.range : null; |
| 46 | + valueRange = [prefixRange ? prefixRange[1] : param.range[0], param.range[1]]; |
| 47 | + idx = prefix.lastIndexOf("/"); |
| 48 | + context = "."; |
16 | 49 | if(idx >= 0) { |
17 | 50 | context = prefix.substr(0, idx); |
18 | 51 | prefix = "." + prefix.substr(idx); |
19 | 52 | } |
20 | | - var regExp = new RegExp("^" + |
21 | | - prefix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + |
| 53 | + regExp = new RegExp("^" + |
| 54 | + quotemeta(prefix) + |
22 | 55 | options.wrappedContextRegExp.source + |
23 | | - postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"); |
| 56 | + quotemeta(postfix) + "$"); |
24 | 57 | dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange); |
25 | 58 | dep.loc = expr.loc; |
26 | 59 | dep.prepend = param.prefix && param.prefix.isString() ? prefix : null; |
|
0 commit comments