fix(compiler): check more cases for pipe usage inside host bindings (#37883)
Builds on top of #34655 to support more cases that could be using a pipe inside host bindings (e.g. ternary expressions or function calls). Fixes #37610. PR Close #37883
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
|
||||
import {ASTWithSource, BindingPipe, Interpolation, ParserError, TemplateBinding, VariableBinding} from '@angular/compiler/src/expression_parser/ast';
|
||||
import {Lexer} from '@angular/compiler/src/expression_parser/lexer';
|
||||
import {Parser, SplitInterpolation} from '@angular/compiler/src/expression_parser/parser';
|
||||
import {IvyParser, Parser, SplitInterpolation} from '@angular/compiler/src/expression_parser/parser';
|
||||
import {expect} from '@angular/platform-browser/testing/src/matchers';
|
||||
|
||||
|
||||
@ -740,6 +740,68 @@ describe('parser', () => {
|
||||
it('should report when encountering field write', () => {
|
||||
expectError(validate(parseSimpleBinding('a = b')), 'Bindings cannot contain assignments');
|
||||
});
|
||||
|
||||
describe('Ivy-only validations', () => {
|
||||
it('should throw if a pipe is used inside a conditional', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('(hasId | myPipe) ? "my-id" : ""')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a function call', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('getId(true, id | myPipe)')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a method call', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('idService.getId(true, id | myPipe)')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a safe method call', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('idService?.getId(true, id | myPipe)')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a property access', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('a[id | myPipe]')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a keyed read expression', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('a[id | myPipe].b')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a safe property read', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('(id | myPipe)?.id')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a non-null assertion', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('[id | myPipe]!')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a prefix not expression', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('!(id | myPipe)')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
|
||||
it('should throw if a pipe is used inside a binary expression', () => {
|
||||
expectError(
|
||||
validate(parseSimpleBindingIvy('(id | myPipe) === true')),
|
||||
'Host binding expression cannot contain pipes');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('wrapLiteralPrimitive', () => {
|
||||
@ -781,6 +843,10 @@ function createParser() {
|
||||
return new Parser(new Lexer());
|
||||
}
|
||||
|
||||
function createIvyParser() {
|
||||
return new IvyParser(new Lexer());
|
||||
}
|
||||
|
||||
function parseAction(text: string, location: any = null, offset: number = 0): ASTWithSource {
|
||||
return createParser().parseAction(text, location, offset);
|
||||
}
|
||||
@ -816,6 +882,11 @@ function parseSimpleBinding(text: string, location: any = null, offset: number =
|
||||
return createParser().parseSimpleBinding(text, location, offset);
|
||||
}
|
||||
|
||||
function parseSimpleBindingIvy(
|
||||
text: string, location: any = null, offset: number = 0): ASTWithSource {
|
||||
return createIvyParser().parseSimpleBinding(text, location, offset);
|
||||
}
|
||||
|
||||
function checkInterpolation(exp: string, expected?: string) {
|
||||
const ast = parseInterpolation(exp)!;
|
||||
if (expected == null) expected = exp;
|
||||
|
Reference in New Issue
Block a user