diff --git a/packages/taro-transformer-wx/__tests__/wxs.test.ts b/packages/taro-transformer-wx/__tests__/wxs.test.ts new file mode 100644 index 00000000000..f8e387c65bc --- /dev/null +++ b/packages/taro-transformer-wx/__tests__/wxs.test.ts @@ -0,0 +1,14 @@ +import transform from '../src' +import { baseOptions } from './utils' + +describe('wxs.ts测试', () => { + test('wxs文件中的var regexp = getRegExp()转换为var regexp = new RegExp()', () => { + const wxsCode = `var regexp = getRegExp();` + baseOptions.sourcePath = '.wxs' + const { code } = transform({ + ...baseOptions, + code: wxsCode, + }) + expect(code).toEqual('var regexp = new RegExp();') + }) +}) \ No newline at end of file diff --git a/packages/taro-transformer-wx/src/wxs.ts b/packages/taro-transformer-wx/src/wxs.ts index 51f3f2d4c74..b71612e9c5d 100644 --- a/packages/taro-transformer-wx/src/wxs.ts +++ b/packages/taro-transformer-wx/src/wxs.ts @@ -21,7 +21,7 @@ export function traverseWxsFile(ast: t.File, defaultResult: TransformResult) { if (path.node.arguments.length > 1) { const regex = path.node.arguments[0] const modifier = path.node.arguments[1] - if (t.isStringLiteral(regex)) { + if (t.isStringLiteral(regex) && t.isStringLiteral(modifier)) { const regexStr = regex.extra?.raw as string const regexModifier = modifier.extra?.rawValue as string const regexWithoutQuotes = regexStr.replace(/^['"](.*)['"]$/, '$1') @@ -30,8 +30,12 @@ export function traverseWxsFile(ast: t.File, defaultResult: TransformResult) { t.stringLiteral(regexModifier), ]) path.replaceWith(newExpr) + } else if (t.isIdentifier(regex) || t.isIdentifier(modifier)) { + throw new Error('getRegExp 函数暂不支持传入变量类型的参数') + } else { + throw new Error('getRegExp 函数暂不支持传入非字符串类型的参数') } - }else { + } else if (path.node.arguments.length === 1) { const regex = path.node.arguments[0] if (t.isStringLiteral(regex)) { const regexStr = regex.extra?.raw as string @@ -40,7 +44,14 @@ export function traverseWxsFile(ast: t.File, defaultResult: TransformResult) { t.stringLiteral(regexWithoutQuotes) ]) path.replaceWith(newExpr) + } else if (t.isIdentifier(regex)) { + throw new Error('getRegExp 函数暂不支持传入变量类型的参数') + } else { + throw new Error('getRegExp 函数暂不支持传入非字符串类型的参数') } + } else { + const newExpr = t.newExpression(t.identifier('RegExp'), []) + path.replaceWith(newExpr) } } }, diff --git a/packages/taroize/__tests__/wxml.test.ts b/packages/taroize/__tests__/wxml.test.ts index e9fee19f3e1..5287f2142ce 100644 --- a/packages/taroize/__tests__/wxml.test.ts +++ b/packages/taroize/__tests__/wxml.test.ts @@ -75,6 +75,16 @@ describe('wxml.ts测试', () => { const { wxml }: any = parseWXML(option.path, option.wxml) expect(wxml).toMatchSnapshot() }) + + test('wxs模块中的var regexp = getRegExp()转换为var regexp = new RegExp()', () => { + option.wxml = ` + var regexp = getRegExp() + ` + option.path = 'wxml_wxs_regexp' + const { wxses, imports }: any = parseWXML(option.path, option.wxml) + expect(wxses).toMatchSnapshot() + expect(imports).toMatchSnapshot() + }) }) describe('parseContent', () => { diff --git a/packages/taroize/src/wxml.ts b/packages/taroize/src/wxml.ts index 6f4ad79a9ea..a3f2e78aade 100644 --- a/packages/taroize/src/wxml.ts +++ b/packages/taroize/src/wxml.ts @@ -718,7 +718,7 @@ function getWXS (attrs: t.JSXAttribute[], path: NodePath, imports: if (path.node.arguments.length > 1) { const regex = path.node.arguments[0] const modifier = path.node.arguments[1] - if (t.isStringLiteral(regex)) { + if (t.isStringLiteral(regex) && t.isStringLiteral(modifier)) { const regexStr = regex.extra?.raw as string const regexModifier = modifier.extra?.rawValue as string const regexWithoutQuotes = regexStr.replace(/^['"](.*)['"]$/, '$1') @@ -727,15 +727,26 @@ function getWXS (attrs: t.JSXAttribute[], path: NodePath, imports: t.stringLiteral(regexModifier), ]) path.replaceWith(newExpr) + } else if (t.isIdentifier(regex) || t.isIdentifier(modifier)) { + throw new Error('getRegExp 函数暂不支持传入变量类型的参数') + } else { + throw new Error('getRegExp 函数暂不支持传入非字符串类型的参数') } - } else { + } else if (path.node.arguments.length === 1) { const regex = path.node.arguments[0] if (t.isStringLiteral(regex)) { const regexStr = regex.extra?.raw as string const regexWithoutQuotes = regexStr.replace(/^['"](.*)['"]$/, '$1') const newExpr = t.newExpression(t.identifier('RegExp'), [t.stringLiteral(regexWithoutQuotes)]) path.replaceWith(newExpr) + } else if (t.isIdentifier(regex)) { + throw new Error('getRegExp 函数暂不支持传入变量类型的参数') + } else { + throw new Error('getRegExp 函数暂不支持传入非字符串类型的参数') } + } else { + const newExpr = t.newExpression(t.identifier('RegExp'), []) + path.replaceWith(newExpr) } } },