66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
import { FEATURES, hasFeature } from "./features";
|
|
|
|
type RegexpuOptions = {
|
|
useUnicodeFlag: boolean;
|
|
onNamedGroup: (name: string, index: number) => void;
|
|
namedGroup: boolean;
|
|
unicodePropertyEscape: boolean;
|
|
dotAllFlag: boolean;
|
|
lookbehind: boolean;
|
|
};
|
|
|
|
export function generateRegexpuOptions(node, features): RegexpuOptions | null {
|
|
let useUnicodeFlag = false,
|
|
dotAllFlag = false,
|
|
unicodePropertyEscape = false,
|
|
namedGroup = false;
|
|
const { flags, pattern } = node;
|
|
const flagsIncludesU = flags.includes("u");
|
|
|
|
if (flagsIncludesU) {
|
|
if (!hasFeature(features, FEATURES.unicodeFlag)) {
|
|
useUnicodeFlag = true;
|
|
}
|
|
if (
|
|
hasFeature(features, FEATURES.unicodePropertyEscape) &&
|
|
/\\[pP]{/.test(pattern)
|
|
) {
|
|
unicodePropertyEscape = true;
|
|
}
|
|
}
|
|
|
|
if (hasFeature(features, FEATURES.dotAllFlag) && flags.indexOf("s") >= 0) {
|
|
dotAllFlag = true;
|
|
}
|
|
if (
|
|
hasFeature(features, FEATURES.namedCaptureGroups) &&
|
|
/\(\?<(?![=!])/.test(pattern)
|
|
) {
|
|
namedGroup = true;
|
|
}
|
|
if (
|
|
!namedGroup &&
|
|
!unicodePropertyEscape &&
|
|
!dotAllFlag &&
|
|
(!flagsIncludesU || useUnicodeFlag)
|
|
) {
|
|
return null;
|
|
}
|
|
// Now we have to feed regexpu-core the regex
|
|
if (flagsIncludesU && flags.indexOf("s") >= 0) {
|
|
// When flags includes u, `config.unicode` will be enabled even if `u` is supported natively.
|
|
// In this case we have to enable dotAllFlag, otherwise `rewritePattern(/./su)` will return
|
|
// incorrect result
|
|
// https://github.com/mathiasbynens/regexpu-core/blob/v4.6.0/rewrite-pattern.js#L191
|
|
dotAllFlag = true;
|
|
}
|
|
return {
|
|
useUnicodeFlag,
|
|
onNamedGroup: () => {},
|
|
namedGroup,
|
|
unicodePropertyEscape,
|
|
dotAllFlag,
|
|
lookbehind: true,
|
|
};
|
|
}
|