UNPKG

react-monaco-editor

Version:
143 lines (139 loc) 3.36 kB
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const ContextDependencyHelpers = exports; /** * Escapes regular expression metacharacters * @param {string} str String to quote * @return {string} Escaped string */ const quotemeta = str => { return str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&"); }; ContextDependencyHelpers.create = ( Dep, range, param, expr, options, contextOptions ) => { let dep; let prefix; let postfix; let prefixRange; let valueRange; let idx; let context; let regExp; if (param.isTemplateString()) { prefix = param.quasis[0].string; postfix = param.quasis.length > 1 ? param.quasis[param.quasis.length - 1].string : ""; prefixRange = [param.quasis[0].range[0], param.quasis[0].range[1]]; valueRange = param.range; idx = prefix.lastIndexOf("/"); context = "."; if (idx >= 0) { context = prefix.substr(0, idx); prefix = `.${prefix.substr(idx)}`; } // If there are more than two quasis, maybe the generated RegExp can be more precise? regExp = new RegExp( `^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta( postfix )}$` ); dep = new Dep( Object.assign( { request: context, recursive: options.wrappedContextRecursive, regExp, mode: "sync" }, contextOptions ), range, valueRange ); dep.loc = expr.loc; dep.replaces = [ { range: prefixRange, value: prefix } ]; dep.critical = options.wrappedContextCritical && "a part of the request of a dependency is an expression"; return dep; } else if ( param.isWrapped() && ((param.prefix && param.prefix.isString()) || (param.postfix && param.postfix.isString())) ) { prefix = param.prefix && param.prefix.isString() ? param.prefix.string : ""; postfix = param.postfix && param.postfix.isString() ? param.postfix.string : ""; prefixRange = param.prefix && param.prefix.isString() ? param.prefix.range : null; valueRange = [ prefixRange ? prefixRange[1] : param.range[0], param.range[1] ]; idx = prefix.lastIndexOf("/"); context = "."; if (idx >= 0) { context = prefix.substr(0, idx); prefix = `.${prefix.substr(idx)}`; } regExp = new RegExp( `^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta( postfix )}$` ); dep = new Dep( Object.assign( { request: context, recursive: options.wrappedContextRecursive, regExp, mode: "sync" }, contextOptions ), range, valueRange ); dep.loc = expr.loc; dep.prepend = param.prefix && param.prefix.isString() ? prefix : null; dep.critical = options.wrappedContextCritical && "a part of the request of a dependency is an expression"; return dep; } else { dep = new Dep( Object.assign( { request: options.exprContextRequest, recursive: options.exprContextRecursive, regExp: options.exprContextRegExp, mode: "sync" }, contextOptions ), range, param.range ); dep.loc = expr.loc; dep.critical = options.exprContextCritical && "the request of a dependency is an expression"; return dep; } };