UNPKG

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