Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x | import type { SimpleExpressionNode } from './ast' import type { TransformContext } from './transform' import { ErrorCodes, createCompilerError } from './errors' // these keywords should not appear inside expressions, but operators like // 'typeof', 'instanceof', and 'in' are allowed const prohibitedKeywordRE = new RegExp( '\\b' + ( 'arguments,await,break,case,catch,class,const,continue,debugger,default,' + 'delete,do,else,export,extends,finally,for,function,if,import,let,new,' + 'return,super,switch,throw,try,var,void,while,with,yield' ) .split(',') .join('\\b|\\b') + '\\b', ) // strip strings in expressions const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g /** * Validate a non-prefixed expression. * This is only called when using the in-browser runtime compiler since it * doesn't prefix expressions. */ export function validateBrowserExpression( node: SimpleExpressionNode, context: TransformContext, asParams = false, asRawStatements = false, ): void { const exp = node.content // empty expressions are validated per-directive since some directives // do allow empty expressions. if (!exp.trim()) { return } try { new Function( asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}`, ) } catch (e: any) { let message = e.message const keywordMatch = exp .replace(stripStringRE, '') .match(prohibitedKeywordRE) if (keywordMatch) { message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"` } context.onError( createCompilerError( ErrorCodes.X_INVALID_EXPRESSION, node.loc, undefined, message, ), ) } } |