fix(runtime): 由于在一些js引擎(主要是react-native hemers)中不支持正则表达式的命名捕获组从而导致运行时不可用,废弃命名捕获组

This commit is contained in:
wxzhang 2023-03-29 17:34:54 +08:00
parent fae66ba0a6
commit ad679f6942
3 changed files with 11 additions and 21 deletions

View File

@ -165,6 +165,7 @@ function getNestingParamsRegex(...tags){
// const formatterParamsRegex = /((([\'\"])(.*?)\3)|(\{.*?\})|(\[.*?\])|([\d]+\.?[\d]?)|((true|false|null)(?=[,\b\s]))|([\w\.]+)|((?<=,)\s*(?=,)))(?<=\s*[,\)]?\s*)/g;
// 支持解析嵌套的{}和[]参数, 前提是字符串需要经addTagHelperFlags操作后会在{}[]等位置添加辅助字符
// 解析嵌套的{}和[]参数基本原理:在{}[]等位置添加辅助字符,然后使用正则表达式匹配,匹配到的字符串中包含辅助字符,然后再去除辅助字符
const formatterNestingParamsRegex = String.raw`((([\'\"])(.*?)\3))|__TAG_REGEXP__([\d]+\.?[\d]?)|((true|false|null)(?=[,\b\s]))|([\w\.]+)|((?<=,)\s*(?=,))(?<=\s*[,\)]?\s*)`
/**

View File

@ -33,7 +33,10 @@ const { parseFormatters } = require("./formatter")
// 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter }
// 支持参数: { var | formatter(x,x,..) | formatter }
let varWithPipeRegexp = /\{\s*(?<varname>\w+)?(?<formatters>(\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g;
// v1 采用命名捕获组
//let varWithPipeRegexp = /\{\s*(?<varname>\w+)?(?<formatters>(\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g;
// v2: 由于一些js引擎(如react-native Hermes )不支持命名捕获组而导致运行时不能使用,所以此处移除命名捕获组
let varWithPipeRegexp = /\{\s*(\w+)?((\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g;
/**
* 考虑到通过正则表达式进行插值的替换可能较慢
@ -102,9 +105,9 @@ function forEachInterpolatedVars(str, replacer, options = {}) {
let opts = Object.assign({replaceAll: true },options);
varWithPipeRegexp.lastIndex = 0;
while ((matched = varWithPipeRegexp.exec(result)) !== null) {
const varname = matched.groups.varname || "";
const varname = matched[1] || "";
// 解析格式化器和参数 = [<formatterName>,[<formatterName>,[<arg>,<arg>,...]]]
const formatters = parseFormatters(matched.groups.formatters);
const formatters = parseFormatters(matched[2] || "");
if (isFunction(replacer)) {
try {
const finalValue = replacer(varname, formatters, matched[0]);

22
pnpm-lock.yaml generated
View File

@ -301,10 +301,12 @@ importers:
fs-extra: ^10.0.1
semver: ^7.3.7
shelljs: ^0.8.5
string.prototype.replaceall: ^1.0.7
dependencies:
fs-extra: 10.1.0
semver: 7.3.8
shelljs: 0.8.5
string.prototype.replaceall: 1.0.7
packages/vite:
specifiers:
@ -8882,13 +8884,6 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
/get-intrinsic/1.1.2:
resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==}
dependencies:
function-bind: 1.1.1
has: 1.0.3
has-symbols: 1.0.3
/get-intrinsic/1.2.0:
resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==}
dependencies:
@ -12224,15 +12219,6 @@ packages:
dependencies:
isobject: 3.0.1
/object.assign/4.1.2:
resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.1.4
has-symbols: 1.0.3
object-keys: 1.1.1
/object.assign/4.1.4:
resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
engines: {node: '>= 0.4'}
@ -15472,7 +15458,7 @@ packages:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
dependencies:
call-bind: 1.0.2
get-intrinsic: 1.1.2
get-intrinsic: 1.2.0
object-inspect: 1.12.2
/signal-exit/3.0.7:
@ -16936,7 +16922,7 @@ packages:
is-valid-glob: 1.0.0
lazystream: 1.0.1
lead: 1.0.0
object.assign: 4.1.2
object.assign: 4.1.4
pumpify: 1.5.1
readable-stream: 2.3.7
remove-bom-buffer: 3.0.0