* build(deps-dev): bump typescript from 4.3.5 to 4.4.2 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.3.5 to 4.4.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.3.5...v4.4.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps-dev): bump typescript from 4.3.5 to 4.4.2 * test: fix nodeOps types Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Carlos Rodrigues <carlos@hypermob.co.uk> Co-authored-by: Evan You <yyx990803@gmail.com>
67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
// 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.
|
|
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
|
|
)
|
|
)
|
|
}
|
|
}
|