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 67 | 84x 84x 84x 84x | // these keywords should not appear inside expressions, but operators like import { SimpleExpressionNode } from './ast' import { TransformContext } from './transform' import { createCompilerError, ErrorCodes } from './errors' // typeof, instanceof and in are allowed const prohibitedKeywordRE = new RegExp( '\\b' + ( 'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' + 'super,throw,while,yield,delete,export,import,return,switch,default,' + 'extends,finally,continue,debugger,function,arguments,typeof,void' ) .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 ) { const exp = node.content // empty expressions are validated per-directive since some directives // do allow empty expressions. Iif (!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) Iif (keywordMatch) { message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"` } context.onError( createCompilerError( ErrorCodes.X_INVALID_EXPRESSION, node.loc, undefined, message ) ) } } |