feat(compiler-core): switch to @babel/parser for expression parsing
This enables default support for parsing bigInt, optional chaining
and nullish coalescing, and also adds the `expressionPlugins`
compiler option for enabling additional parsing plugins listed at
https://babeljs.io/docs/en/next/babel-parser#plugins.
This commit is contained in:
@@ -380,7 +380,65 @@ describe('compiler: expression transform', () => {
|
||||
const onError = jest.fn()
|
||||
parseWithExpressionTransform(`{{ a( }}`, { onError })
|
||||
expect(onError.mock.calls[0][0].message).toMatch(
|
||||
`Invalid JavaScript expression.`
|
||||
`Error parsing JavaScript expression: Unexpected token`
|
||||
)
|
||||
})
|
||||
|
||||
describe('ES Proposals support', () => {
|
||||
test('bigInt', () => {
|
||||
const node = parseWithExpressionTransform(
|
||||
`{{ 13000n }}`
|
||||
) as InterpolationNode
|
||||
expect(node.content).toMatchObject({
|
||||
type: NodeTypes.SIMPLE_EXPRESSION,
|
||||
content: `13000n`,
|
||||
isStatic: false,
|
||||
isConstant: true
|
||||
})
|
||||
})
|
||||
|
||||
test('nullish colescing', () => {
|
||||
const node = parseWithExpressionTransform(
|
||||
`{{ a ?? b }}`
|
||||
) as InterpolationNode
|
||||
expect(node.content).toMatchObject({
|
||||
type: NodeTypes.COMPOUND_EXPRESSION,
|
||||
children: [{ content: `_ctx.a` }, ` ?? `, { content: `_ctx.b` }]
|
||||
})
|
||||
})
|
||||
|
||||
test('optional chaining', () => {
|
||||
const node = parseWithExpressionTransform(
|
||||
`{{ a?.b?.c }}`
|
||||
) as InterpolationNode
|
||||
expect(node.content).toMatchObject({
|
||||
type: NodeTypes.COMPOUND_EXPRESSION,
|
||||
children: [
|
||||
{ content: `_ctx.a` },
|
||||
`?.`,
|
||||
{ content: `b` },
|
||||
`?.`,
|
||||
{ content: `c` }
|
||||
]
|
||||
})
|
||||
})
|
||||
|
||||
test('Enabling additional plugins', () => {
|
||||
// enabling pipeline operator to replace filters:
|
||||
const node = parseWithExpressionTransform(`{{ a |> uppercase }}`, {
|
||||
expressionPlugins: [
|
||||
[
|
||||
'pipelineOperator',
|
||||
{
|
||||
proposal: 'minimal'
|
||||
}
|
||||
]
|
||||
]
|
||||
}) as InterpolationNode
|
||||
expect(node.content).toMatchObject({
|
||||
type: NodeTypes.COMPOUND_EXPRESSION,
|
||||
children: [{ content: `_ctx.a` }, ` |> `, { content: `_ctx.uppercase` }]
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user