diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts index 7fa4977f60..14a9ac0c86 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts @@ -496,6 +496,51 @@ describe('compiler compliance: bindings', () => { expectEmit(result.source, template, 'Incorrect handling of interpolated properties'); }); + + it('should generate the proper update instructions for interpolated attributes', () => { + const files: MockDirectory = getAppFiles(` +
+
+
+
+
+
+
+
+
+
+ `); + + const template = ` + … + if (rf & 2) { + i0.Δselect(0); + i0.ΔattributeInterpolateV("title", ["a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i", ctx.nine, "j"]); + i0.Δselect(1); + i0.ΔattributeInterpolate8("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i"); + i0.Δselect(2); + i0.ΔattributeInterpolate7("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h"); + i0.Δselect(3); + i0.ΔattributeInterpolate6("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g"); + i0.Δselect(4); + i0.ΔattributeInterpolate5("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f"); + i0.Δselect(5); + i0.ΔattributeInterpolate4("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e"); + i0.Δselect(6); + i0.ΔattributeInterpolate3("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d"); + i0.Δselect(7); + i0.ΔattributeInterpolate2("title", "a", ctx.one, "b", ctx.two, "c"); + i0.Δselect(8); + i0.ΔattributeInterpolate1("title", "a", ctx.one, "b"); + i0.Δselect(9); + i0.ΔattributeInterpolate("title", ctx.one); + } + … + `; + const result = compile(files, angularFiles); + expectEmit(result.source, template, 'Incorrect handling of interpolated properties'); + }); + it('should keep local ref for host element', () => { const files: MockDirectory = getAppFiles(` diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts index 05de920cd9..1a50c5ebb7 100644 --- a/packages/compiler/src/render3/r3_identifiers.ts +++ b/packages/compiler/src/render3/r3_identifiers.ts @@ -43,6 +43,27 @@ export class Identifiers { static attribute: o.ExternalReference = {name: 'ɵɵattribute', moduleName: CORE}; + static attributeInterpolate: + o.ExternalReference = {name: 'ɵɵattributeInterpolate', moduleName: CORE}; + static attributeInterpolate1: + o.ExternalReference = {name: 'ɵɵattributeInterpolate1', moduleName: CORE}; + static attributeInterpolate2: + o.ExternalReference = {name: 'ɵɵattributeInterpolate2', moduleName: CORE}; + static attributeInterpolate3: + o.ExternalReference = {name: 'ɵɵattributeInterpolate3', moduleName: CORE}; + static attributeInterpolate4: + o.ExternalReference = {name: 'ɵɵattributeInterpolate4', moduleName: CORE}; + static attributeInterpolate5: + o.ExternalReference = {name: 'ɵɵattributeInterpolate5', moduleName: CORE}; + static attributeInterpolate6: + o.ExternalReference = {name: 'ɵɵattributeInterpolate6', moduleName: CORE}; + static attributeInterpolate7: + o.ExternalReference = {name: 'ɵɵattributeInterpolate7', moduleName: CORE}; + static attributeInterpolate8: + o.ExternalReference = {name: 'ɵɵattributeInterpolate8', moduleName: CORE}; + static attributeInterpolateV: + o.ExternalReference = {name: 'ɵɵattributeInterpolateV', moduleName: CORE}; + static classProp: o.ExternalReference = {name: 'ɵɵclassProp', moduleName: CORE}; static elementContainerStart: diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index c141d350bc..2b0fb06635 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -772,12 +772,12 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } else if (inputType === BindingType.Attribute) { if (value instanceof Interpolation) { // attr.name="{{value}}" and friends - this.updateInstruction(elementIndex, input.sourceSpan, R3.elementAttribute, () => { - return [ - o.literal(elementIndex), o.literal(attrName), - this.convertPropertyBinding(implicit, value), ...params - ]; - }); + this.updateInstruction( + elementIndex, input.sourceSpan, getAttributeInterpolationExpression(value), + () => + [o.literal(attrName), + ...this.getUpdateInstructionArguments(o.variable(CONTEXT_NAME), value), + ...params]); } else { // [attr.name]="value" this.updateInstruction(elementIndex, input.sourceSpan, R3.attribute, () => { @@ -1695,6 +1695,35 @@ function getPropertyInterpolationExpression(interpolation: Interpolation) { } } +/** + * Gets the instruction to generate for an interpolated attribute + * @param interpolation An Interpolation AST + */ +function getAttributeInterpolationExpression(interpolation: Interpolation) { + switch (getInterpolationArgsLength(interpolation)) { + case 1: + return R3.attributeInterpolate; + case 3: + return R3.attributeInterpolate1; + case 5: + return R3.attributeInterpolate2; + case 7: + return R3.attributeInterpolate3; + case 9: + return R3.attributeInterpolate4; + case 11: + return R3.attributeInterpolate5; + case 13: + return R3.attributeInterpolate6; + case 15: + return R3.attributeInterpolate7; + case 17: + return R3.attributeInterpolate8; + default: + return R3.attributeInterpolateV; + } +} + /** * Gets the number of arguments expected to be passed to a generated instruction in the case of * interpolation instructions. diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 96cfb3bd9b..e6bd93d75e 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -9,6 +9,16 @@ // clang-format off export { ɵɵattribute, + ɵɵattributeInterpolate, + ɵɵattributeInterpolate1, + ɵɵattributeInterpolate2, + ɵɵattributeInterpolate3, + ɵɵattributeInterpolate4, + ɵɵattributeInterpolate5, + ɵɵattributeInterpolate6, + ɵɵattributeInterpolate7, + ɵɵattributeInterpolate8, + ɵɵattributeInterpolateV, ɵɵdefineBase, ɵɵdefineComponent, ɵɵdefineDirective, diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index b0ffe6aa71..00f1480263 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -23,7 +23,19 @@ export { tick, ɵɵallocHostVars, + ɵɵattribute, + ɵɵattributeInterpolate, + ɵɵattributeInterpolate1, + ɵɵattributeInterpolate2, + ɵɵattributeInterpolate3, + ɵɵattributeInterpolate4, + ɵɵattributeInterpolate5, + ɵɵattributeInterpolate6, + ɵɵattributeInterpolate7, + ɵɵattributeInterpolate8, + ɵɵattributeInterpolateV, + ɵɵbind, ɵɵclassMap, ɵɵclassProp, diff --git a/packages/core/src/render3/instructions/all.ts b/packages/core/src/render3/instructions/all.ts index 22017700fd..4ae084f172 100644 --- a/packages/core/src/render3/instructions/all.ts +++ b/packages/core/src/render3/instructions/all.ts @@ -27,6 +27,7 @@ */ export * from './alloc_host_vars'; export * from './attribute'; +export * from './attribute_interpolation'; export * from './change_detection'; export * from './container'; export * from './storage'; diff --git a/packages/core/src/render3/instructions/attribute_interpolation.ts b/packages/core/src/render3/instructions/attribute_interpolation.ts new file mode 100644 index 0000000000..f078ef9849 --- /dev/null +++ b/packages/core/src/render3/instructions/attribute_interpolation.ts @@ -0,0 +1,413 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import {SanitizerFn} from '../interfaces/sanitization'; +import {getSelectedIndex} from '../state'; +import {ΔelementAttribute} from './element'; +import {Δinterpolation1, Δinterpolation2, Δinterpolation3, Δinterpolation4, Δinterpolation5, Δinterpolation6, Δinterpolation7, Δinterpolation8, ΔinterpolationV} from './property_interpolation'; +import {TsickleIssue1009} from './shared'; + +/** + * + * Update an interpolated attribute on an element with a lone bound value + * + * Used when the value passed to a property has 1 interpolated value in it, an no additional text + * surrounds that interpolated value: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate('title', v0); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate( + attrName: string, v0: any, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 { + ΔattributeInterpolate1(attrName, '', v0, '', sanitizer); + return ΔattributeInterpolate; +} + + +/** + * + * Update an interpolated attribute on an element with single bound value surrounded by text. + * + * Used when the value passed to a property has 1 interpolated value in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate1('title', 'prefix', v0, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate1( + attrName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn, + namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = Δinterpolation1(prefix, v0, suffix); + + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + + return ΔattributeInterpolate1; +} + +/** + * + * Update an interpolated attribute on an element with 2 bound values surrounded by text. + * + * Used when the value passed to a property has 2 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate2('title', 'prefix', v0, '-', v1, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate2( + attrName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, + sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = Δinterpolation2(prefix, v0, i0, v1, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate2; +} + +/** + * + * Update an interpolated attribute on an element with 3 bound values surrounded by text. + * + * Used when the value passed to a property has 3 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate3( + * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate3( + attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, + suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = Δinterpolation3(prefix, v0, i0, v1, i1, v2, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate3; +} + +/** + * + * Update an interpolated attribute on an element with 4 bound values surrounded by text. + * + * Used when the value passed to a property has 4 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate4( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate4( + attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = Δinterpolation4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate4; +} + +/** + * + * Update an interpolated attribute on an element with 5 bound values surrounded by text. + * + * Used when the value passed to a property has 5 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate5( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate5( + attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn, + namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = Δinterpolation5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate5; +} + +/** + * + * Update an interpolated attribute on an element with 6 bound values surrounded by text. + * + * Used when the value passed to a property has 6 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate6( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param i4 Static value used for concatenation only. + * @param v5 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate6( + attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn, + namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = + Δinterpolation6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate6; +} + +/** + * + * Update an interpolated attribute on an element with 7 bound values surrounded by text. + * + * Used when the value passed to a property has 7 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate7( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param i4 Static value used for concatenation only. + * @param v5 Value checked for change. + * @param i5 Static value used for concatenation only. + * @param v6 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate7( + attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, + sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = + Δinterpolation7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate7; +} + +/** + * + * Update an interpolated attribute on an element with 8 bound values surrounded by text. + * + * Used when the value passed to a property has 8 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolate8( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix'); + * ``` + * + * @param attrName The name of the attribute to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param i4 Static value used for concatenation only. + * @param v5 Value checked for change. + * @param i5 Static value used for concatenation only. + * @param v6 Value checked for change. + * @param i6 Static value used for concatenation only. + * @param v7 Value checked for change. + * @param suffix Static value used for concatenation only. + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolate8( + attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, + suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + const interpolatedValue = + Δinterpolation8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix); + ΔelementAttribute(index, attrName, interpolatedValue, sanitizer, namespace); + return ΔattributeInterpolate8; +} + +/** + * Update an interpolated attribute on an element with 8 or more bound values surrounded by text. + * + * Used when the number of interpolated values exceeds 7. + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔattributeInterpolateV( + * 'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9, + * 'suffix']); + * ``` + * + * @param attrName The name of the attribute to update. + * @param values The a collection of values and the strings in-between those values, beginning with + * a string prefix and ending with a string suffix. + * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`) + * @param sanitizer An optional sanitizer function + * @returns itself, so that it may be chained. + * @codeGenApi + */ +export function ΔattributeInterpolateV( + attrName: string, values: any[], sanitizer?: SanitizerFn, + namespace?: string): TsickleIssue1009 { + const index = getSelectedIndex(); + ΔelementAttribute(index, attrName, ΔinterpolationV(values), sanitizer, namespace); + return ΔattributeInterpolateV; +} diff --git a/tools/public_api_guard/core/core.d.ts b/tools/public_api_guard/core/core.d.ts index 1ca6059c4b..fecd24d2f0 100644 --- a/tools/public_api_guard/core/core.d.ts +++ b/tools/public_api_guard/core/core.d.ts @@ -1405,3 +1405,405 @@ export interface WtfScopeFn { } export declare const wtfStartTimeRange: (rangeType: string, action: string) => any; + +export declare function ɵɵallocHostVars(count: number): void; + +export declare function ɵɵattribute(name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void; + +export declare function ɵɵattributeInterpolate(attrName: string, v0: any, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate1(attrName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate2(attrName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate3(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate4(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate5(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate6(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate7(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolate8(attrName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export declare function ɵɵattributeInterpolateV(attrName: string, values: any[], sanitizer?: SanitizerFn, namespace?: string): TsickleIssue1009; + +export interface ɵɵBaseDef { + contentQueries: ContentQueriesFunction | null; + /** @deprecated */ readonly declaredInputs: { + [P in keyof T]: string; + }; + hostBindings: HostBindingsFunction | null; + readonly inputs: { + [P in keyof T]: string; + }; + readonly outputs: { + [P in keyof T]: string; + }; + viewQuery: ViewQueriesFunction | null; +} + +export declare function ɵɵbind(value: T): T | NO_CHANGE; + +export declare function ɵɵclassMap(classes: { + [styleName: string]: any; +} | NO_CHANGE | string | null): void; + +export declare function ɵɵclassProp(classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; + +export declare type ɵɵComponentDefWithMeta = ComponentDef; + +export declare function ɵɵcomponentHostSyntheticListener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; + +export declare function ɵɵcomponentHostSyntheticProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; + +export declare function ɵɵcontainer(index: number): void; + +export declare function ɵɵcontainerRefreshEnd(): void; + +export declare function ɵɵcontainerRefreshStart(index: number): void; + +export declare function ɵɵcontentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): QueryList; + +export declare const ɵɵdefaultStyleSanitizer: StyleSanitizeFn; + +export declare function ɵɵdefineBase(baseDefinition: { + inputs?: { + [P in keyof T]?: string | [string, string]; + }; + outputs?: { + [P in keyof T]?: string; + }; + contentQueries?: ContentQueriesFunction | null; + viewQuery?: ViewQueriesFunction | null; + hostBindings?: HostBindingsFunction; +}): ɵɵBaseDef; + +export declare function ɵɵdefineComponent(componentDefinition: { + type: Type; + selectors: CssSelectorList; + factory: FactoryFn; + consts: number; + vars: number; + inputs?: { + [P in keyof T]?: string | [string, string]; + }; + outputs?: { + [P in keyof T]?: string; + }; + hostBindings?: HostBindingsFunction; + contentQueries?: ContentQueriesFunction; + exportAs?: string[]; + template: ComponentTemplate; + ngContentSelectors?: string[]; + viewQuery?: ViewQueriesFunction | null; + features?: ComponentDefFeature[]; + encapsulation?: ViewEncapsulation; + data?: { + [kind: string]: any; + }; + styles?: string[]; + changeDetection?: ChangeDetectionStrategy; + directives?: DirectiveTypesOrFactory | null; + pipes?: PipeTypesOrFactory | null; + schemas?: SchemaMetadata[] | null; +}): never; + +export declare const ɵɵdefineDirective: (directiveDefinition: { + type: Type; + selectors: (string | SelectorFlags)[][]; + factory: FactoryFn; + inputs?: { [P in keyof T]?: string | [string, string] | undefined; } | undefined; + outputs?: { [P in keyof T]?: string | undefined; } | undefined; + features?: DirectiveDefFeature[] | undefined; + hostBindings?: HostBindingsFunction | undefined; + contentQueries?: ContentQueriesFunction | undefined; + viewQuery?: ViewQueriesFunction | null | undefined; + exportAs?: string[] | undefined; +}) => never; + +export declare function ɵɵdefineInjectable(opts: { + providedIn?: Type | 'root' | 'any' | null; + factory: () => T; +}): never; + +export declare function ɵɵdefineInjector(options: { + factory: () => any; + providers?: any[]; + imports?: any[]; +}): never; + +export declare function ɵɵdefineNgModule(def: { + type: T; + bootstrap?: Type[] | (() => Type[]); + declarations?: Type[] | (() => Type[]); + imports?: Type[] | (() => Type[]); + exports?: Type[] | (() => Type[]); + schemas?: SchemaMetadata[] | null; + id?: string | null; +}): never; + +export declare function ɵɵdefinePipe(pipeDef: { + name: string; + type: Type; + factory: FactoryFn; + pure?: boolean; +}): never; + +export declare type ɵɵDirectiveDefWithMeta = DirectiveDef; + +export declare function ɵɵdirectiveInject(token: Type | InjectionToken): T; +export declare function ɵɵdirectiveInject(token: Type | InjectionToken, flags: InjectFlags): T; + +export declare function ɵɵdisableBindings(): void; + +export declare function ɵɵelement(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ɵɵelementAttribute(index: number, name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void; + +export declare function ɵɵelementContainerEnd(): void; + +export declare function ɵɵelementContainerStart(index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ɵɵelementEnd(): void; + +export declare function ɵɵelementHostAttrs(attrs: TAttributes): void; + +export declare function ɵɵelementProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; + +export declare function ɵɵelementStart(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ɵɵembeddedViewEnd(): void; + +export declare function ɵɵembeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags; + +export declare function ɵɵenableBindings(): void; + +export declare function ɵɵgetCurrentView(): OpaqueViewState; + +export declare function ɵɵgetFactoryOf(type: Type): ((type: Type | null) => T) | null; + +export declare function ɵɵgetInheritedFactory(type: Type): (type: Type) => T; + +export declare function ɵɵi18n(index: number, message: string, subTemplateIndex?: number): void; + +export declare function ɵɵi18nApply(index: number): void; + +export declare function ɵɵi18nAttributes(index: number, values: string[]): void; + +export declare function ɵɵi18nEnd(): void; + +export declare function ɵɵi18nExp(expression: T | NO_CHANGE): void; + +/** @deprecated */ +export declare function ɵɵi18nLocalize(input: string, placeholders?: { + [key: string]: string; +}): string; + +export declare function ɵɵi18nPostprocess(message: string, replacements?: { + [key: string]: (string | string[]); +}): string; + +export declare function ɵɵi18nStart(index: number, message: string, subTemplateIndex?: number): void; + +export declare function ɵɵInheritDefinitionFeature(definition: DirectiveDef | ComponentDef): void; + +export declare function ɵɵinject(token: Type | InjectionToken): T; +export declare function ɵɵinject(token: Type | InjectionToken, flags?: InjectFlags): T | null; + +export interface ɵɵInjectableDef { + factory: () => T; + providedIn: InjectorType | 'root' | 'any' | null; + value: T | undefined; +} + +export declare function ɵɵinjectAttribute(attrNameToInject: string): string | null; + +export interface ɵɵInjectorDef { + factory: () => T; + imports: (InjectorType | InjectorTypeWithProviders)[]; + providers: (Type | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[]; +} + +export declare function ɵɵinterpolation1(prefix: string, v0: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation2(prefix: string, v0: any, i0: string, v1: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolationV(values: any[]): string | NO_CHANGE; + +export declare function ɵɵlistener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; + +export declare function ɵɵload(index: number): T; + +export declare function ɵɵloadContentQuery(): QueryList; + +export declare function ɵɵloadViewQuery(): T; + +export declare function ɵɵnamespaceHTML(): void; + +export declare function ɵɵnamespaceMathML(): void; + +export declare function ɵɵnamespaceSVG(): void; + +export declare function ɵɵnextContext(level?: number): T; + +export declare type ɵɵNgModuleDefWithMeta = NgModuleDef; + +export declare function ɵɵNgOnChangesFeature(): DirectiveDefFeature; + +export declare function ɵɵpipe(index: number, pipeName: string): any; + +export declare function ɵɵpipeBind1(index: number, slotOffset: number, v1: any): any; + +export declare function ɵɵpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any; + +export declare function ɵɵpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any; + +export declare function ɵɵpipeBind4(index: number, slotOffset: number, v1: any, v2: any, v3: any, v4: any): any; + +export declare function ɵɵpipeBindV(index: number, slotOffset: number, values: any[]): any; + +export declare type ɵɵPipeDefWithMeta = PipeDef; + +export declare function ɵɵprojection(nodeIndex: number, selectorIndex?: number, attrs?: TAttributes): void; + +export declare function ɵɵprojectionDef(selectors?: CssSelectorList[]): void; + +export declare function ɵɵproperty(propName: string, value: T, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate(propName: string, v0: any, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate1(propName: string, prefix: string, v0: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate2(propName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate3(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate4(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate5(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate6(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate7(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolate8(propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵpropertyInterpolateV(propName: string, values: any[], sanitizer?: SanitizerFn): TsickleIssue1009; + +export declare function ɵɵProvidersFeature(providers: Provider[], viewProviders?: Provider[]): (definition: DirectiveDef) => void; + +export declare function ɵɵpureFunction0(slotOffset: number, pureFn: () => T, thisArg?: any): T; + +export declare function ɵɵpureFunction1(slotOffset: number, pureFn: (v: any) => any, exp: any, thisArg?: any): any; + +export declare function ɵɵpureFunction2(slotOffset: number, pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any, thisArg?: any): any; + +export declare function ɵɵpureFunction3(slotOffset: number, pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any, thisArg?: any): any; + +export declare function ɵɵpureFunction4(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, thisArg?: any): any; + +export declare function ɵɵpureFunction5(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, thisArg?: any): any; + +export declare function ɵɵpureFunction6(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, thisArg?: any): any; + +export declare function ɵɵpureFunction7(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, thisArg?: any): any; + +export declare function ɵɵpureFunction8(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any, thisArg?: any): any; + +export declare function ɵɵpureFunctionV(slotOffset: number, pureFn: (...v: any[]) => any, exps: any[], thisArg?: any): any; + +export declare function ɵɵqueryRefresh(queryList: QueryList): boolean; + +export declare function ɵɵreference(index: number): T; + +export declare function ɵɵresolveBody(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: HTMLElement; +}; + +export declare function ɵɵresolveDocument(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: Document; +}; + +export declare function ɵɵresolveWindow(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: Window | null; +}; + +export declare function ɵɵrestoreView(viewToRestore: OpaqueViewState): void; + +export declare function ɵɵsanitizeHtml(unsafeHtml: any): string; + +export declare function ɵɵsanitizeResourceUrl(unsafeResourceUrl: any): string; + +export declare function ɵɵsanitizeScript(unsafeScript: any): string; + +export declare function ɵɵsanitizeStyle(unsafeStyle: any): string; + +export declare function ɵɵsanitizeUrl(unsafeUrl: any): string; + +export declare function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any; + +export declare function ɵɵselect(index: number): void; + +export declare function ɵɵsetComponentScope(type: ComponentType, directives: Type[], pipes: Type[]): void; + +export declare function ɵɵsetNgModuleScope(type: any, scope: { + declarations?: Type[] | (() => Type[]); + imports?: Type[] | (() => Type[]); + exports?: Type[] | (() => Type[]); +}): void; + +export declare function ɵɵstaticContentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): void; + +export declare function ɵɵstaticViewQuery(predicate: Type | string[], descend: boolean, read: any): void; + +export declare function ɵɵstyleMap(styles: { + [styleName: string]: any; +} | NO_CHANGE | null): void; + +export declare function ɵɵstyleProp(styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; + +export declare function ɵɵstyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; + +export declare function ɵɵstylingApply(): void; + +export declare function ɵɵtemplate(index: number, templateFn: ComponentTemplate | null, consts: number, vars: number, tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, localRefExtractor?: LocalRefExtractor): void; + +export declare function ɵɵtemplateRefExtractor(tNode: TNode, currentView: LView): ViewEngine_TemplateRef<{}> | null; + +export declare function ɵɵtext(index: number, value?: any): void; + +export declare function ɵɵtextBinding(index: number, value: T | NO_CHANGE): void; + +export declare function ɵɵviewQuery(predicate: Type | string[], descend: boolean, read: any): QueryList;