| | |
| | | Object.defineProperty(exports, "__esModule", { |
| | | value: true |
| | | }); |
| | | exports.canSkipRegexpu = canSkipRegexpu; |
| | | exports.generateRegexpuOptions = generateRegexpuOptions; |
| | | exports.transformFlags = transformFlags; |
| | | |
| | | var _features = require("./features"); |
| | | |
| | | function generateRegexpuOptions(node, features) { |
| | | let useUnicodeFlag = false, |
| | | dotAllFlag = false, |
| | | unicodePropertyEscape = false, |
| | | namedGroup = false; |
| | | function generateRegexpuOptions(toTransform) { |
| | | const feat = (name, ok = "transform") => { |
| | | return (0, _features.hasFeature)(toTransform, _features.FEATURES[name]) ? ok : false; |
| | | }; |
| | | |
| | | return { |
| | | unicodeFlag: feat("unicodeFlag"), |
| | | unicodeSetsFlag: feat("unicodeSetsFlag") || feat("unicodeSetsFlag_syntax", "parse"), |
| | | dotAllFlag: feat("dotAllFlag"), |
| | | unicodePropertyEscapes: feat("unicodePropertyEscape"), |
| | | namedGroups: feat("namedCaptureGroups"), |
| | | onNamedGroup: () => {} |
| | | }; |
| | | } |
| | | |
| | | function canSkipRegexpu(node, options) { |
| | | const { |
| | | flags, |
| | | pattern |
| | | } = node; |
| | | const flagsIncludesU = flags.includes("u"); |
| | | |
| | | if (flagsIncludesU) { |
| | | if (!(0, _features.hasFeature)(features, _features.FEATURES.unicodeFlag)) { |
| | | useUnicodeFlag = true; |
| | | } |
| | | if (flags.includes("v")) { |
| | | if (options.unicodeSetsFlag === "transform") return false; |
| | | } |
| | | |
| | | if ((0, _features.hasFeature)(features, _features.FEATURES.unicodePropertyEscape) && /\\[pP]{/.test(pattern)) { |
| | | unicodePropertyEscape = true; |
| | | if (flags.includes("u")) { |
| | | if (options.unicodeFlag === "transform") return false; |
| | | |
| | | if (options.unicodePropertyEscapes === "transform" && /\\[pP]{/.test(pattern)) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | if ((0, _features.hasFeature)(features, _features.FEATURES.dotAllFlag) && flags.indexOf("s") >= 0) { |
| | | dotAllFlag = true; |
| | | if (flags.includes("s")) { |
| | | if (options.dotAllFlag === "transform") return false; |
| | | } |
| | | |
| | | if ((0, _features.hasFeature)(features, _features.FEATURES.namedCaptureGroups) && /\(\?<(?![=!])/.test(pattern)) { |
| | | namedGroup = true; |
| | | if (options.namedGroups === "transform" && /\(\?<(?![=!])/.test(pattern)) { |
| | | return false; |
| | | } |
| | | |
| | | if (!namedGroup && !unicodePropertyEscape && !dotAllFlag && (!flagsIncludesU || useUnicodeFlag)) { |
| | | return null; |
| | | return true; |
| | | } |
| | | |
| | | function transformFlags(regexpuOptions, flags) { |
| | | if (regexpuOptions.unicodeSetsFlag === "transform") { |
| | | flags = flags.replace("v", "u"); |
| | | } |
| | | |
| | | if (flagsIncludesU && flags.indexOf("s") >= 0) { |
| | | dotAllFlag = true; |
| | | if (regexpuOptions.unicodeFlag === "transform") { |
| | | flags = flags.replace("u", ""); |
| | | } |
| | | |
| | | return { |
| | | useUnicodeFlag, |
| | | onNamedGroup: () => {}, |
| | | namedGroup, |
| | | unicodePropertyEscape, |
| | | dotAllFlag, |
| | | lookbehind: true |
| | | }; |
| | | if (regexpuOptions.dotAllFlag === "transform") { |
| | | flags = flags.replace("s", ""); |
| | | } |
| | | |
| | | return flags; |
| | | } |