You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							106 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							106 lines
						
					
					
						
							3.7 KiB
						
					
					
				"use strict";
 | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", {
 | 
						|
  value: true
 | 
						|
});
 | 
						|
exports.createRegExpFeaturePlugin = createRegExpFeaturePlugin;
 | 
						|
var _regexpuCore = require("regexpu-core");
 | 
						|
var _features = require("./features");
 | 
						|
var _util = require("./util");
 | 
						|
var _core = require("@babel/core");
 | 
						|
var _helperAnnotateAsPure = require("@babel/helper-annotate-as-pure");
 | 
						|
const version = "7.20.5".split(".").reduce((v, x) => v * 1e5 + +x, 0);
 | 
						|
const versionKey = "@babel/plugin-regexp-features/version";
 | 
						|
function createRegExpFeaturePlugin({
 | 
						|
  name,
 | 
						|
  feature,
 | 
						|
  options = {},
 | 
						|
  manipulateOptions = () => {}
 | 
						|
}) {
 | 
						|
  return {
 | 
						|
    name,
 | 
						|
    manipulateOptions,
 | 
						|
    pre() {
 | 
						|
      var _file$get;
 | 
						|
      const {
 | 
						|
        file
 | 
						|
      } = this;
 | 
						|
      const features = (_file$get = file.get(_features.featuresKey)) != null ? _file$get : 0;
 | 
						|
      let newFeatures = (0, _features.enableFeature)(features, _features.FEATURES[feature]);
 | 
						|
      const {
 | 
						|
        useUnicodeFlag,
 | 
						|
        runtime
 | 
						|
      } = options;
 | 
						|
      if (useUnicodeFlag === false) {
 | 
						|
        newFeatures = (0, _features.enableFeature)(newFeatures, _features.FEATURES.unicodeFlag);
 | 
						|
      }
 | 
						|
      if (newFeatures !== features) {
 | 
						|
        file.set(_features.featuresKey, newFeatures);
 | 
						|
      }
 | 
						|
      if (runtime !== undefined) {
 | 
						|
        if (file.has(_features.runtimeKey) && file.get(_features.runtimeKey) !== runtime &&
 | 
						|
        (0, _features.hasFeature)(newFeatures, _features.FEATURES.duplicateNamedCaptureGroups)) {
 | 
						|
          throw new Error(`The 'runtime' option must be the same for ` + `'@babel/plugin-transform-named-capturing-groups-regex' and ` + `'@babel/plugin-proposal-duplicate-named-capturing-groups-regex'.`);
 | 
						|
        }
 | 
						|
        if (feature === "namedCaptureGroups") {
 | 
						|
          if (!runtime || !file.has(_features.runtimeKey)) file.set(_features.runtimeKey, runtime);
 | 
						|
        } else {
 | 
						|
          file.set(_features.runtimeKey, runtime);
 | 
						|
        }
 | 
						|
      }
 | 
						|
      if (!file.has(versionKey) || file.get(versionKey) < version) {
 | 
						|
        file.set(versionKey, version);
 | 
						|
      }
 | 
						|
    },
 | 
						|
    visitor: {
 | 
						|
      RegExpLiteral(path) {
 | 
						|
        var _file$get2;
 | 
						|
        const {
 | 
						|
          node
 | 
						|
        } = path;
 | 
						|
        const {
 | 
						|
          file
 | 
						|
        } = this;
 | 
						|
        const features = file.get(_features.featuresKey);
 | 
						|
        const runtime = (_file$get2 = file.get(_features.runtimeKey)) != null ? _file$get2 : true;
 | 
						|
        const regexpuOptions = (0, _util.generateRegexpuOptions)(node.pattern, features);
 | 
						|
        if ((0, _util.canSkipRegexpu)(node, regexpuOptions)) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
        const namedCaptureGroups = {
 | 
						|
          __proto__: null
 | 
						|
        };
 | 
						|
        if (regexpuOptions.namedGroups === "transform") {
 | 
						|
          regexpuOptions.onNamedGroup = (name, index) => {
 | 
						|
            const prev = namedCaptureGroups[name];
 | 
						|
            if (typeof prev === "number") {
 | 
						|
              namedCaptureGroups[name] = [prev, index];
 | 
						|
            } else if (Array.isArray(prev)) {
 | 
						|
              prev.push(index);
 | 
						|
            } else {
 | 
						|
              namedCaptureGroups[name] = index;
 | 
						|
            }
 | 
						|
          };
 | 
						|
        }
 | 
						|
        node.pattern = _regexpuCore(node.pattern, node.flags, regexpuOptions);
 | 
						|
        if (regexpuOptions.namedGroups === "transform" && Object.keys(namedCaptureGroups).length > 0 && runtime && !isRegExpTest(path)) {
 | 
						|
          const call = _core.types.callExpression(this.addHelper("wrapRegExp"), [node, _core.types.valueToNode(namedCaptureGroups)]);
 | 
						|
          (0, _helperAnnotateAsPure.default)(call);
 | 
						|
          path.replaceWith(call);
 | 
						|
        }
 | 
						|
        node.flags = (0, _util.transformFlags)(regexpuOptions, node.flags);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 | 
						|
function isRegExpTest(path) {
 | 
						|
  return path.parentPath.isMemberExpression({
 | 
						|
    object: path.node,
 | 
						|
    computed: false
 | 
						|
  }) && path.parentPath.get("property").isIdentifier({
 | 
						|
    name: "test"
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
//# sourceMappingURL=index.js.map
 |