diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js new file mode 100644 index 0000000000000..10abfca0669cb --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js @@ -0,0 +1,64 @@ +/**************************************************************************************************** + * PARTIAL FILE: todo_example.js + ****************************************************************************************************/ +import { Component, Input, NgModule } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { + constructor() { + this.list = []; + } +} +MyApp.ɵfac = function MyApp_Factory(t) { return new (t || MyApp)(); }; +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: MyApp, selector: "my-app", ngImport: i0, template: { source: '', isInline: true }, directives: [{ type: function () { return TodoComponent; }, selector: "todo", inputs: ["data"] }] }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyApp, [{ + type: Component, + args: [{ selector: 'my-app', template: '' }] + }], null, null); })(); +export class TodoComponent { + constructor() { + this.data = []; + } +} +TodoComponent.ɵfac = function TodoComponent_Factory(t) { return new (t || TodoComponent)(); }; +TodoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: TodoComponent, selector: "todo", inputs: { data: "data" }, ngImport: i0, template: { source: '', isInline: true } }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(TodoComponent, [{ + type: Component, + args: [{ + selector: 'todo', + template: '' + }] + }], null, { data: [{ + type: Input + }] }); })(); +export class TodoModule { +} +TodoModule.ɵmod = i0.ɵɵdefineNgModule({ type: TodoModule }); +TodoModule.ɵinj = i0.ɵɵdefineInjector({ factory: function TodoModule_Factory(t) { return new (t || TodoModule)(); } }); +(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(TodoModule, { declarations: [TodoComponent, MyApp] }); })(); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(TodoModule, [{ + type: NgModule, + args: [{ + declarations: [TodoComponent, MyApp], + }] + }], null, null); })(); + +/**************************************************************************************************** + * PARTIAL FILE: todo_example.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + list: any[]; + static ɵfac: i0.ɵɵFactoryDef; + static ɵcmp: i0.ɵɵComponentDefWithMeta; +} +export declare class TodoComponent { + data: any[]; + myTitle: string; + static ɵfac: i0.ɵɵFactoryDef; + static ɵcmp: i0.ɵɵComponentDefWithMeta; +} +export declare class TodoModule { + static ɵmod: i0.ɵɵNgModuleDefWithMeta; + static ɵinj: i0.ɵɵInjectorDef; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/TEST_CASES.json new file mode 100644 index 0000000000000..9167bba39aa63 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/TEST_CASES.json @@ -0,0 +1,22 @@ +{ + "$schema": "../test_case_schema.json", + "cases": [ + { + "description": "should be able to generate the TODO example", + "inputFiles": [ + "todo_example.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "todo_example_template.js", + "generated": "todo_example.js" + } + ], + "failureMessage": "Incorrect template" + } + ] + } + ] +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/GOLDEN_PARTIAL.js new file mode 100644 index 0000000000000..d0e1ab9d0f56e --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/GOLDEN_PARTIAL.js @@ -0,0 +1,75 @@ +/**************************************************************************************************** + * PARTIAL FILE: static_animation_attribute.js + ****************************************************************************************************/ +import { Component, NgModule } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { +} +MyApp.ɵfac = function MyApp_Factory(t) { return new (t || MyApp)(); }; +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: MyApp, selector: "my-app", ngImport: i0, template: { source: '
', isInline: true } }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyApp, [{ + type: Component, + args: [{ selector: 'my-app', template: '
' }] + }], null, null); })(); +export class MyModule { +} +MyModule.ɵmod = i0.ɵɵdefineNgModule({ type: MyModule }); +MyModule.ɵinj = i0.ɵɵdefineInjector({ factory: function MyModule_Factory(t) { return new (t || MyModule)(); } }); +(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(MyModule, { declarations: [MyApp] }); })(); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyModule, [{ + type: NgModule, + args: [{ declarations: [MyApp] }] + }], null, null); })(); + +/**************************************************************************************************** + * PARTIAL FILE: static_animation_attribute.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + static ɵfac: i0.ɵɵFactoryDef; + static ɵcmp: i0.ɵɵComponentDefWithMeta; +} +export declare class MyModule { + static ɵmod: i0.ɵɵNgModuleDefWithMeta; + static ɵinj: i0.ɵɵInjectorDef; +} + +/**************************************************************************************************** + * PARTIAL FILE: duplicate_animation_listeners.js + ****************************************************************************************************/ +import { Component, NgModule } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { +} +MyApp.ɵfac = function MyApp_Factory(t) { return new (t || MyApp)(); }; +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: MyApp, selector: "my-app", ngImport: i0, template: { source: '
', isInline: true } }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyApp, [{ + type: Component, + args: [{ + selector: 'my-app', + template: '
' + }] + }], null, null); })(); +export class MyModule { +} +MyModule.ɵmod = i0.ɵɵdefineNgModule({ type: MyModule }); +MyModule.ɵinj = i0.ɵɵdefineInjector({ factory: function MyModule_Factory(t) { return new (t || MyModule)(); } }); +(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(MyModule, { declarations: [MyApp] }); })(); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyModule, [{ + type: NgModule, + args: [{ declarations: [MyApp] }] + }], null, null); })(); + +/**************************************************************************************************** + * PARTIAL FILE: duplicate_animation_listeners.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + static ɵfac: i0.ɵɵFactoryDef; + static ɵcmp: i0.ɵɵComponentDefWithMeta; +} +export declare class MyModule { + static ɵmod: i0.ɵɵNgModuleDefWithMeta; + static ɵinj: i0.ɵɵInjectorDef; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/TEST_CASES.json new file mode 100644 index 0000000000000..d73be37fef43a --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/TEST_CASES.json @@ -0,0 +1,39 @@ +{ + "$schema": "../../test_case_schema.json", + "cases": [ + { + "description": "should not register any @attr attributes as static attributes", + "inputFiles": [ + "static_animation_attribute.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "static_animation_attribute_template.js", + "generated": "static_animation_attribute.js" + } + ], + "failureMessage": "Incorrect initialization attributes" + } + ] + }, + { + "description": "should dedup multiple [@event] listeners", + "inputFiles": [ + "duplicate_animation_listeners.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "duplicate_animation_listeners_template.js", + "generated": "duplicate_animation_listeners.js" + } + ], + "failureMessage": "Incorrect initialization attributes" + } + ] + } + ] +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/duplicate_animation_listeners.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/duplicate_animation_listeners.ts new file mode 100644 index 0000000000000..65a320e7dafd4 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/duplicate_animation_listeners.ts @@ -0,0 +1,12 @@ +import {Component, NgModule} from '@angular/core'; + +@Component({ + selector: 'my-app', + template: '
' +}) +export class MyApp { +} + +@NgModule({declarations: [MyApp]}) +export class MyModule { +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/duplicate_animation_listeners_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/duplicate_animation_listeners_template.js new file mode 100644 index 0000000000000..3a9ac98abeb10 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/duplicate_animation_listeners_template.js @@ -0,0 +1,7 @@ +template: function MyApp_Template(rf, ctx) { + if (rf & 1) { + $i0$.ɵɵelementStart(0, "div"); + … + $i0$.ɵɵproperty("@mySelector", …); + } +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/static_animation_attribute.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/static_animation_attribute.ts new file mode 100644 index 0000000000000..1eb3aa12bc286 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/static_animation_attribute.ts @@ -0,0 +1,9 @@ +import {Component, NgModule} from '@angular/core'; + +@Component({selector: 'my-app', template: '
'}) +export class MyApp { +} + +@NgModule({declarations: [MyApp]}) +export class MyModule { +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/static_animation_attribute_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/static_animation_attribute_template.js new file mode 100644 index 0000000000000..091f7b90882ba --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/animations/static_animation_attribute_template.js @@ -0,0 +1,8 @@ +template: function MyApp_Template(rf, ctx) { + if (rf & 1) { + $i0$.ɵɵelement(0, "div"); + } + if (rf & 2) { + $i0$.ɵɵproperty("@attr", …)("@binding", …); + } +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/GOLDEN_PARTIAL.js new file mode 100644 index 0000000000000..696e6beb4394e --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/GOLDEN_PARTIAL.js @@ -0,0 +1,41 @@ +/**************************************************************************************************** + * PARTIAL FILE: basic_any_cast.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +class Comp { +} +Comp.ɵfac = function Comp_Factory(t) { return new (t || Comp)(); }; +Comp.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: Comp, selector: "ng-component", ngImport: i0, template: { source: '
', isInline: true } }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(Comp, [{ + type: Component, + args: [{ template: '
' }] + }], null, null); })(); + +/**************************************************************************************************** + * PARTIAL FILE: basic_any_cast.d.ts + ****************************************************************************************************/ +export {}; + +/**************************************************************************************************** + * PARTIAL FILE: this_any_access.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +class Comp { + $any(value) { + return value; + } +} +Comp.ɵfac = function Comp_Factory(t) { return new (t || Comp)(); }; +Comp.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: Comp, selector: "ng-component", ngImport: i0, template: { source: '
', isInline: true } }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(Comp, [{ + type: Component, + args: [{ template: '
' }] + }], null, null); })(); + +/**************************************************************************************************** + * PARTIAL FILE: this_any_access.d.ts + ****************************************************************************************************/ +export {}; + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/TEST_CASES.json new file mode 100644 index 0000000000000..1015580ac94b8 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/TEST_CASES.json @@ -0,0 +1,39 @@ +{ + "$schema": "../../test_case_schema.json", + "cases": [ + { + "description": "should strip out $any wrappers", + "inputFiles": [ + "basic_any_cast.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "basic_any_cast_template.js", + "generated": "basic_any_cast.js" + } + ], + "failureMessage": "Incorrect template" + } + ] + }, + { + "description": "should preserve $any if it is accessed through `this`", + "inputFiles": [ + "this_any_access.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "this_any_access_template.js", + "generated": "this_any_access.js" + } + ], + "failureMessage": "Incorrect template" + } + ] + } + ] +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/basic_any_cast.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/basic_any_cast.ts new file mode 100644 index 0000000000000..e706dd293f940 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/basic_any_cast.ts @@ -0,0 +1,5 @@ +import {Component} from '@angular/core'; + +@Component({template: '
'}) +class Comp { +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/basic_any_cast_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/basic_any_cast_template.js new file mode 100644 index 0000000000000..6b97d98157d6b --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/basic_any_cast_template.js @@ -0,0 +1 @@ +i0.ɵɵproperty("tabIndex", 10); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/this_any_access.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/this_any_access.ts new file mode 100644 index 0000000000000..edc10c9307f1b --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/this_any_access.ts @@ -0,0 +1,8 @@ +import {Component} from '@angular/core'; + +@Component({template: '
'}) +class Comp { + $any(value: null): any { + return value as any; + } +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/this_any_access_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/this_any_access_template.js new file mode 100644 index 0000000000000..4bfb556179fc7 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/any/this_any_access_template.js @@ -0,0 +1 @@ +i0.ɵɵproperty("tabIndex", ctx.$any(null)); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/GOLDEN_PARTIAL.js new file mode 100644 index 0000000000000..7c9593cdcb92c --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/GOLDEN_PARTIAL.js @@ -0,0 +1,48 @@ +/**************************************************************************************************** + * PARTIAL FILE: test.js + ****************************************************************************************************/ +import { Component, NgModule } from '@angular/core'; +import * as i0 from "@angular/core"; +class Greeter { +} +class GreeterEN { + greet() { + return 'Hi'; + } +} +export class MyComponent { +} +MyComponent.ɵfac = function MyComponent_Factory(t) { return new (t || MyComponent)(); }; +MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ version: 1, type: MyComponent, selector: "my-component", providers: [GreeterEN, { provide: Greeter, useClass: GreeterEN }], ngImport: i0, template: { source: '
', isInline: true }, viewProviders: [GreeterEN] }); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyComponent, [{ + type: Component, + args: [{ + selector: 'my-component', + template: '
', + providers: [GreeterEN, { provide: Greeter, useClass: GreeterEN }], + viewProviders: [GreeterEN] + }] + }], null, null); })(); +export class MyModule { +} +MyModule.ɵmod = i0.ɵɵdefineNgModule({ type: MyModule }); +MyModule.ɵinj = i0.ɵɵdefineInjector({ factory: function MyModule_Factory(t) { return new (t || MyModule)(); } }); +(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(MyModule, { declarations: [MyComponent] }); })(); +/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(MyModule, [{ + type: NgModule, + args: [{ declarations: [MyComponent] }] + }], null, null); })(); + +/**************************************************************************************************** + * PARTIAL FILE: test.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyComponent { + static ɵfac: i0.ɵɵFactoryDef; + static ɵcmp: i0.ɵɵComponentDefWithMeta; +} +export declare class MyModule { + static ɵmod: i0.ɵɵNgModuleDefWithMeta; + static ɵinj: i0.ɵɵInjectorDef; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/TEST_CASES.json new file mode 100644 index 0000000000000..87e37d74cb735 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/TEST_CASES.json @@ -0,0 +1,13 @@ +{ + "$schema": "../../test_case_schema.json", + "cases": [ + { + "description": "should be able to generate the hello world component", + "expectations": [ + { + "failureMessage": "Incorrect template" + } + ] + } + ] +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/test.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/test.js new file mode 100644 index 0000000000000..e97308779bf76 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/test.js @@ -0,0 +1,4 @@ +import { Component, NgModule } from '@angular/core'; +… +MyComponent.ɵfac = …; +MyComponent.ɵcmp = …; diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/test.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/test.ts new file mode 100644 index 0000000000000..1e5ed6c62b065 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/hello_world/test.ts @@ -0,0 +1,24 @@ +import {Component, NgModule} from '@angular/core'; + +abstract class Greeter { + abstract greet(): string; +} + +class GreeterEN implements Greeter { + greet() { + return 'Hi'; + } +} + +@Component({ + selector: 'my-component', + template: '
', + providers: [GreeterEN, {provide: Greeter, useClass: GreeterEN}], + viewProviders: [GreeterEN] +}) +export class MyComponent { +} + +@NgModule({declarations: [MyComponent]}) +export class MyModule { +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/todo_example.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/todo_example.ts new file mode 100644 index 0000000000000..f814e4b6d2661 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/todo_example.ts @@ -0,0 +1,22 @@ +import {Component, Input, NgModule} from '@angular/core'; + +@Component({selector: 'my-app', template: ''}) +export class MyApp { + list: any[] = []; +} + +@Component({ + selector: 'todo', + template: '
  • {{data}}
' +}) +export class TodoComponent { + @Input() data: any[] = []; + + myTitle!: string; +} + +@NgModule({ + declarations: [TodoComponent, MyApp], +}) +export class TodoModule { +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/todo_example_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/todo_example_template.js new file mode 100644 index 0000000000000..1aa67f9caf04d --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/todo_example_template.js @@ -0,0 +1,4 @@ +import { Component, Input, NgModule } from '@angular/core'; +… +MyApp.ɵcmp = …; +TodoComponent.ɵcmp = …;