diff --git a/packages/@lwc/template-compiler/src/parser/constants.ts b/packages/@lwc/template-compiler/src/parser/constants.ts index 560e80f795..124de5d2bd 100644 --- a/packages/@lwc/template-compiler/src/parser/constants.ts +++ b/packages/@lwc/template-compiler/src/parser/constants.ts @@ -162,3 +162,6 @@ export const ATTR_NAME = { XLINK_HREF: 'xlink:href', }; export const TEMPLATE_DIRECTIVES = [/^key$/, /^lwc:*/, /^if:*/, /^for:*/, /^iterator:*/]; + +// TODO [#3370]: remove experimental template expression flag +export const TMPL_EXPR_ECMASCRIPT_EDITION = 2022; diff --git a/packages/@lwc/template-compiler/src/parser/expression-complex/html.ts b/packages/@lwc/template-compiler/src/parser/expression-complex/html.ts index 00e2152b67..d09810eae9 100644 --- a/packages/@lwc/template-compiler/src/parser/expression-complex/html.ts +++ b/packages/@lwc/template-compiler/src/parser/expression-complex/html.ts @@ -10,6 +10,7 @@ import { Document, DocumentFragment, ParsingError, ParserOptions } from 'parse5' import { ParserDiagnostics, invariant } from '@lwc/errors'; import Parser from 'parse5/lib/parser'; import Tokenizer from 'parse5/lib/tokenizer'; +import { TMPL_EXPR_ECMASCRIPT_EDITION } from '../constants'; import type ParserCtx from '../parser'; import type { PreparsedExpressionMap } from './types'; @@ -55,7 +56,7 @@ class TemplateHtmlTokenizer extends Tokenizer { // Start parsing immediately after the opening curly brace. const estreeNode = parseExpressionAt(html, javascriptExprStart, { - ecmaVersion: 2022, + ecmaVersion: TMPL_EXPR_ECMASCRIPT_EDITION, locations: true, ranges: true, onComment: () => invariant(false, ParserDiagnostics.INVALID_EXPR_COMMENTS_DISALLOWED), diff --git a/packages/@lwc/template-compiler/src/parser/expression.ts b/packages/@lwc/template-compiler/src/parser/expression.ts index f4cdb2221e..692d7f6f59 100644 --- a/packages/@lwc/template-compiler/src/parser/expression.ts +++ b/packages/@lwc/template-compiler/src/parser/expression.ts @@ -11,6 +11,7 @@ import * as t from '../shared/estree'; import { NormalizedConfig } from '../config'; import { Expression, Identifier, SourceLocation } from '../shared/types'; import { validateExpressionAst } from './expression-complex'; +import { TMPL_EXPR_ECMASCRIPT_EDITION } from './constants'; import ParserCtx from './parser'; import { isReservedES6Keyword } from './utils/javascript'; @@ -103,7 +104,9 @@ export function parseExpression( source: string, location: SourceLocation ): Expression { - const ecmaVersion = ctx.config.experimentalComplexExpressions ? 2022 : 2020; + const ecmaVersion = ctx.config.experimentalComplexExpressions + ? TMPL_EXPR_ECMASCRIPT_EDITION + : 2020; return ctx.withErrorWrapping( () => { const parsed = parseExpressionAt(source, 1, { ecmaVersion });