UNPKG

3.31 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.createRegExpFeaturePlugin = createRegExpFeaturePlugin;
7
8var _regexpuCore = _interopRequireDefault(require("regexpu-core"));
9
10var _features = require("./features");
11
12var _util = require("./util");
13
14var _package = _interopRequireDefault(require("../package.json"));
15
16var _core = require("@babel/core");
17
18var _helperRegex = require("@babel/helper-regex");
19
20var _helperAnnotateAsPure = _interopRequireDefault(require("@babel/helper-annotate-as-pure"));
21
22function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
24const version = _package.default.version.split(".").reduce((v, x) => v * 1e5 + +x, 0);
25
26const versionKey = "@babel/plugin-regexp-features/version";
27
28function createRegExpFeaturePlugin({
29 name,
30 feature,
31 options = {}
32}) {
33 return {
34 name,
35
36 pre() {
37 var _file$get;
38
39 const {
40 file
41 } = this;
42 const features = (_file$get = file.get(_features.featuresKey)) != null ? _file$get : 0;
43 let newFeatures = (0, _features.enableFeature)(features, _features.FEATURES[feature]);
44 const {
45 useUnicodeFlag,
46 runtime = true
47 } = options;
48
49 if (useUnicodeFlag === false) {
50 newFeatures = (0, _features.enableFeature)(newFeatures, _features.FEATURES.unicodeFlag);
51 }
52
53 if (newFeatures !== features) {
54 file.set(_features.featuresKey, newFeatures);
55 }
56
57 if (!runtime) {
58 file.set(_features.runtimeKey, false);
59 }
60
61 if (!file.has(versionKey) || file.get(versionKey) < version) {
62 file.set(versionKey, version);
63 }
64 },
65
66 visitor: {
67 RegExpLiteral(path) {
68 var _file$get2;
69
70 const {
71 node
72 } = path;
73 const {
74 file
75 } = this;
76 const features = file.get(_features.featuresKey);
77 const runtime = (_file$get2 = file.get(_features.runtimeKey)) != null ? _file$get2 : true;
78 const regexpuOptions = (0, _util.generateRegexpuOptions)(node, features);
79
80 if (regexpuOptions === null) {
81 return;
82 }
83
84 const namedCaptureGroups = {};
85
86 if (regexpuOptions.namedGroup) {
87 regexpuOptions.onNamedGroup = (name, index) => {
88 namedCaptureGroups[name] = index;
89 };
90 }
91
92 node.pattern = (0, _regexpuCore.default)(node.pattern, node.flags, regexpuOptions);
93
94 if (regexpuOptions.namedGroup && Object.keys(namedCaptureGroups).length > 0 && runtime && !isRegExpTest(path)) {
95 const call = _core.types.callExpression(this.addHelper("wrapRegExp"), [node, _core.types.valueToNode(namedCaptureGroups)]);
96
97 (0, _helperAnnotateAsPure.default)(call);
98 path.replaceWith(call);
99 }
100
101 if ((0, _features.hasFeature)(features, _features.FEATURES.unicodeFlag)) {
102 (0, _helperRegex.pullFlag)(node, "u");
103 }
104
105 if ((0, _features.hasFeature)(features, _features.FEATURES.dotAllFlag)) {
106 (0, _helperRegex.pullFlag)(node, "s");
107 }
108 }
109
110 }
111 };
112}
113
114function isRegExpTest(path) {
115 return path.parentPath.isMemberExpression({
116 object: path.node,
117 computed: false
118 }) && path.parentPath.get("property").isIdentifier({
119 name: "test"
120 });
121}
\No newline at end of file