From 93c3f7a931a20a12fa6f8336bcf78343fb178b76 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 22 Oct 2024 07:03:51 +0000 Subject: [PATCH] build: remove usages of `useDefineForClassFields: false` (#58297) When setting `"useDefineForClassFields": false`, static fields are compiled within a block that relies on the `this` context. This output makes it more difficult for bundlers to treeshake and eliminate unused code. PR Close #58297 --- .../upgrade/static/ts/full/module.ts | 2 +- .../upgrade/static/ts/lite/module.ts | 2 +- .../src/lib/highlighter.ts | 15 +- .../size-tracking/integration-payloads.json | 2 +- packages/bazel/src/ng_module/ng_module.bzl | 4 - .../test/ng_package/example_package.golden | 27 ++-- .../example_with_ts_library_package.golden | 6 +- .../ivy_enabled/ng_module_ivy_test.ts | 2 +- .../src/file_linker/linker_environment.ts | 13 +- packages/compiler-cli/test/ngtsc/env.ts | 6 +- packages/core/src/linker/query_list.ts | 16 +- packages/core/test/acceptance/di_spec.ts | 53 ++++--- packages/core/test/acceptance/styling_spec.ts | 6 +- .../bundle.golden_symbols.json | 17 +- .../animations/bundle.golden_symbols.json | 17 +- .../cyclic_import/bundle.golden_symbols.json | 15 +- .../bundling/defer/bundle.golden_symbols.json | 9 +- .../forms_reactive/bundle.golden_symbols.json | 18 +-- .../bundle.golden_symbols.json | 18 +-- .../hello_world/bundle.golden_symbols.json | 15 +- .../hydration/bundle.golden_symbols.json | 15 +- .../injection/bundle.golden_symbols.json | 145 +----------------- .../router/bundle.golden_symbols.json | 21 ++- .../bundle.golden_symbols.json | 15 +- .../bundling/todo/bundle.golden_symbols.json | 15 +- .../examples/upgrade/static/ts/full/module.ts | 2 +- .../upgrade/static/ts/lite-multi/module.ts | 6 +- .../examples/upgrade/static/ts/lite/module.ts | 2 +- packages/forms/test/form_array_spec.ts | 6 +- packages/language-service/src/completions.ts | 23 ++- packages/language-service/src/definitions.ts | 7 +- packages/language-service/src/quick_info.ts | 9 +- .../src/references_and_rename.ts | 15 +- .../source_file_translation_handler.ts | 13 +- .../service-worker/worker/testing/events.ts | 9 +- .../service-worker/worker/testing/scope.ts | 9 +- packages/tsconfig-build.json | 2 - .../background-service/saucelabs-daemon.ts | 9 +- 38 files changed, 219 insertions(+), 367 deletions(-) diff --git a/adev/src/content/api-examples/upgrade/static/ts/full/module.ts b/adev/src/content/api-examples/upgrade/static/ts/full/module.ts index fb6d57feac7..13c0b09f184 100644 --- a/adev/src/content/api-examples/upgrade/static/ts/full/module.ts +++ b/adev/src/content/api-examples/upgrade/static/ts/full/module.ts @@ -105,7 +105,7 @@ export class Ng1HeroComponentWrapper extends UpgradeComponent { // The names of the input and output properties here must match the names of the // `<` and `&` bindings in the AngularJS component that is being wrapped @Input() hero!: Hero; - @Output() onRemove!: EventEmitter; + @Output() onRemove: EventEmitter = new EventEmitter(); constructor(elementRef: ElementRef, injector: Injector) { // We must pass the name of the directive as used by AngularJS to the super diff --git a/adev/src/content/api-examples/upgrade/static/ts/lite/module.ts b/adev/src/content/api-examples/upgrade/static/ts/lite/module.ts index e9476ce44f3..401ea852893 100644 --- a/adev/src/content/api-examples/upgrade/static/ts/lite/module.ts +++ b/adev/src/content/api-examples/upgrade/static/ts/lite/module.ts @@ -116,7 +116,7 @@ class Ng1HeroComponentWrapper extends UpgradeComponent { // The names of the input and output properties here must match the names of the // `<` and `&` bindings in the AngularJS component that is being wrapped. @Input() hero!: Hero; - @Output() onRemove!: EventEmitter; + @Output() onRemove: EventEmitter = new EventEmitter(); constructor(elementRef: ElementRef, injector: Injector) { // We must pass the name of the directive as used by AngularJS to the super. diff --git a/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts b/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts index f3e9a9dce50..da58d347a5d 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts @@ -103,10 +103,19 @@ export function highlightHydrationElement(el: Node, status: HydrationStatus) { } export function unHighlight(): void { - if (selectedElementOverlay) { - document.body.removeChild(selectedElementOverlay); - selectedElementOverlay = null; + if (!selectedElementOverlay) { + return; } + + for (const node of document.body.childNodes) { + if (node === selectedElementOverlay) { + document.body.removeChild(selectedElementOverlay); + + break; + } + } + + selectedElementOverlay = null; } export function removeHydrationHighlights(): void { diff --git a/goldens/size-tracking/integration-payloads.json b/goldens/size-tracking/integration-payloads.json index 2826cdcb2e8..1398be73519 100644 --- a/goldens/size-tracking/integration-payloads.json +++ b/goldens/size-tracking/integration-payloads.json @@ -47,7 +47,7 @@ }, "defer": { "uncompressed": { - "main": 11497, + "main": 12094, "polyfills": 33807, "defer.component": 345 } diff --git a/packages/bazel/src/ng_module/ng_module.bzl b/packages/bazel/src/ng_module/ng_module.bzl index 7b4e0bc6b68..6e1d28c959e 100644 --- a/packages/bazel/src/ng_module/ng_module.bzl +++ b/packages/bazel/src/ng_module/ng_module.bzl @@ -208,10 +208,6 @@ def _ngc_tsconfig(ctx, files, srcs, **kwargs): # https://github.com/bazelbuild/rules_nodejs/blob/901df3868e3ceda177d3ed181205e8456a5592ea/third_party/github.com/bazelbuild/rules_typescript/internal/common/tsconfig.bzl#L195 # TODO(devversion): In the future, combine prodmode and devmode so we can get rid of the # ambiguous terminology and concept that can result in slow-down for development workflows. - # TODO(alanagius): The below causes a drastic size increase when enabled (4Kb in the //integration/forms:test). This is mainly due to Babel transforms for Safari 15. - # https://github.com/angular/angular-cli/blob/3e8bdf72d6b7e2925d2822da807b726f88a77e1a/packages/angular_devkit/build_angular/src/babel/presets/application.ts#L199-L204 - # https://www.diffchecker.com/9Ge3pexk - tsconfig["compilerOptions"]["useDefineForClassFields"] = False tsconfig["compilerOptions"]["target"] = "es2022" tsconfig["compilerOptions"]["module"] = "esnext" diff --git a/packages/bazel/test/ng_package/example_package.golden b/packages/bazel/test/ng_package/example_package.golden index a2c6bf5ecf2..12104b27145 100644 --- a/packages/bazel/test/ng_package/example_package.golden +++ b/packages/bazel/test/ng_package/example_package.golden @@ -128,9 +128,9 @@ import * as i0 from '@angular/core'; import { NgModule } from '@angular/core'; class A11yModule { - static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: A11yModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } - static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: A11yModule }); } - static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: A11yModule }); } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: A11yModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); + static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: A11yModule }); + static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: A11yModule }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: A11yModule, decorators: [{ type: NgModule, @@ -157,8 +157,8 @@ import * as i0 from '@angular/core'; import { Injectable } from '@angular/core'; class MySecondService { - static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MySecondService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } - static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MySecondService, providedIn: 'root' }); } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MySecondService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); + static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MySecondService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MySecondService, decorators: [{ type: Injectable, @@ -166,11 +166,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport }] }); class MyService { + secondService; constructor(secondService) { this.secondService = secondService; } - static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyService, deps: [{ token: MySecondService }], target: i0.ɵɵFactoryTarget.Injectable }); } - static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyService, providedIn: 'root' }); } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyService, deps: [{ token: MySecondService }], target: i0.ɵɵFactoryTarget.Injectable }); + static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyService, decorators: [{ type: Injectable, @@ -197,9 +198,9 @@ import * as i0 from '@angular/core'; import { NgModule } from '@angular/core'; class SecondaryModule { - static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } - static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule }); } - static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule }); } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); + static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule }); + static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: SecondaryModule, decorators: [{ type: NgModule, @@ -227,9 +228,9 @@ import * as i0 from '@angular/core'; import { NgModule } from '@angular/core'; class MyModule { - static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } - static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: MyModule }); } - static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyModule }); } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); + static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: MyModule }); + static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyModule }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: MyModule, decorators: [{ type: NgModule, diff --git a/packages/bazel/test/ng_package/example_with_ts_library_package.golden b/packages/bazel/test/ng_package/example_with_ts_library_package.golden index 4bde98adec5..ce5ee588131 100644 --- a/packages/bazel/test/ng_package/example_with_ts_library_package.golden +++ b/packages/bazel/test/ng_package/example_with_ts_library_package.golden @@ -76,9 +76,9 @@ import * as i0 from '@angular/core'; import { NgModule } from '@angular/core'; class PortalModule { - static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: PortalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } - static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: PortalModule }); } - static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: PortalModule }); } + static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: PortalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); + static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0", ngImport: i0, type: PortalModule }); + static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: PortalModule }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: PortalModule, decorators: [{ type: NgModule, diff --git a/packages/bazel/test/ngc-wrapped/ivy_enabled/ng_module_ivy_test.ts b/packages/bazel/test/ngc-wrapped/ivy_enabled/ng_module_ivy_test.ts index 85505f45d5f..b6eb20d08b3 100644 --- a/packages/bazel/test/ngc-wrapped/ivy_enabled/ng_module_ivy_test.ts +++ b/packages/bazel/test/ngc-wrapped/ivy_enabled/ng_module_ivy_test.ts @@ -15,6 +15,6 @@ describe('ng_module with ivy enabled', () => { 'packages/bazel/test/ngc-wrapped/ivy_enabled/test_module_default_compilation.mjs', ); const fileContent = readFileSync(outputFile, 'utf8'); - expect(fileContent).toContain(`static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent`); + expect(fileContent).toContain(`static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent`); }); }); diff --git a/packages/compiler-cli/linker/src/file_linker/linker_environment.ts b/packages/compiler-cli/linker/src/file_linker/linker_environment.ts index 18ccb7a5b76..0ad7b3c89f1 100644 --- a/packages/compiler-cli/linker/src/file_linker/linker_environment.ts +++ b/packages/compiler-cli/linker/src/file_linker/linker_environment.ts @@ -15,10 +15,8 @@ import {DEFAULT_LINKER_OPTIONS, LinkerOptions} from './linker_options'; import {Translator} from './translator'; export class LinkerEnvironment { - readonly translator = new Translator(this.factory); - readonly sourceFileLoader = this.options.sourceMapping - ? new SourceFileLoader(this.fileSystem, this.logger, {}) - : null; + readonly translator: Translator; + readonly sourceFileLoader: SourceFileLoader | null; private constructor( readonly fileSystem: ReadonlyFileSystem, @@ -26,7 +24,12 @@ export class LinkerEnvironment { readonly host: AstHost, readonly factory: AstFactory, readonly options: LinkerOptions, - ) {} + ) { + this.translator = new Translator(this.factory); + this.sourceFileLoader = this.options.sourceMapping + ? new SourceFileLoader(this.fileSystem, this.logger, {}) + : null; + } static create( fileSystem: ReadonlyFileSystem, diff --git a/packages/compiler-cli/test/ngtsc/env.ts b/packages/compiler-cli/test/ngtsc/env.ts index 547c4a8e6f7..2e66f63cd93 100644 --- a/packages/compiler-cli/test/ngtsc/env.ts +++ b/packages/compiler-cli/test/ngtsc/env.ts @@ -48,13 +48,15 @@ export class NgtscTestEnvironment { private multiCompileHostExt: MultiCompileHostExt | null = null; private oldProgram: Program | null = null; private changedResources: Set | null = null; - private commandLineArgs = ['-p', this.basePath]; + private commandLineArgs: string[]; private constructor( private fs: FileSystem, readonly outDir: AbsoluteFsPath, readonly basePath: AbsoluteFsPath, - ) {} + ) { + this.commandLineArgs = ['-p', this.basePath]; + } /** * Set up a new testing environment. diff --git a/packages/core/src/linker/query_list.ts b/packages/core/src/linker/query_list.ts index faa65fa4d73..860a8db3092 100644 --- a/packages/core/src/linker/query_list.ts +++ b/packages/core/src/linker/query_list.ts @@ -66,14 +66,7 @@ export class QueryList implements Iterable { * has occurred. Or if it should fire when query is recomputed. (recomputing could resolve in * the same result) */ - constructor(private _emitDistinctChangesOnly: boolean = false) { - // This function should be declared on the prototype, but doing so there will cause the class - // declaration to have side-effects and become not tree-shakable. For this reason we do it in - // the constructor. - // [Symbol.iterator](): Iterator { ... } - const proto = QueryList.prototype; - if (!proto[Symbol.iterator]) proto[Symbol.iterator] = symbolIterator; - } + constructor(private _emitDistinctChangesOnly: boolean = false) {} /** * Returns the QueryList entry at `index`. @@ -193,10 +186,5 @@ export class QueryList implements Iterable { } } - // The implementation of `Symbol.iterator` should be declared here, but this would cause - // tree-shaking issues with `QueryList. So instead, it's added in the constructor (see comments - // there) and this declaration is left here to ensure that TypeScript considers QueryList to - // implement the Iterable interface. This is required for template type-checking of NgFor loops - // over QueryLists to work correctly, since QueryList must be assignable to NgIterable. - [Symbol.iterator]!: () => Iterator; + [Symbol.iterator]: () => Iterator = /** @__PURE__*/ (() => symbolIterator)(); } diff --git a/packages/core/test/acceptance/di_spec.ts b/packages/core/test/acceptance/di_spec.ts index d803d0d420f..2a837a7075d 100644 --- a/packages/core/test/acceptance/di_spec.ts +++ b/packages/core/test/acceptance/di_spec.ts @@ -2707,11 +2707,17 @@ describe('di', () => { standalone: false, }) class MyComp { - tokenViaInjector = this.injector.get(NON_EXISTING_PROVIDER, null, InjectFlags.Optional); + tokenViaInjector; constructor( public injector: Injector, @Inject(NON_EXISTING_PROVIDER) @Optional() public tokenViaConstructor: string, - ) {} + ) { + this.tokenViaInjector = this.injector.get( + NON_EXISTING_PROVIDER, + null, + InjectFlags.Optional, + ); + } } TestBed.configureTestingModule({declarations: [MyComp]}); const fixture = TestBed.createComponent(MyComp); @@ -2748,11 +2754,13 @@ describe('di', () => { standalone: false, }) class ChildComponent { - tokenViaInjector = this.injector.get(TOKEN, null, InjectFlags.SkipSelf); + tokenViaInjector; constructor( public injector: Injector, @Inject(TOKEN) @SkipSelf() public tokenViaConstructor: string, - ) {} + ) { + this.tokenViaInjector = this.injector.get(TOKEN, null, InjectFlags.SkipSelf); + } } TestBed.configureTestingModule({ @@ -2774,11 +2782,13 @@ describe('di', () => { standalone: false, }) class DirectiveString { - tokenViaInjector = this.injector.get(TOKEN, null, InjectFlags.Host); + tokenViaInjector; constructor( public injector: Injector, @Inject(TOKEN) @Host() public tokenViaConstructor: string, - ) {} + ) { + this.tokenViaInjector = this.injector.get(TOKEN, null, InjectFlags.Host); + } } @Component({ @@ -2809,21 +2819,24 @@ describe('di', () => { standalone: false, }) class DirectiveB { - public tokenSelfViaInjector = this.injector.get( - DirectiveA, - null, - InjectFlags.Self | InjectFlags.Optional, - ); - public tokenHostViaInjector = this.injector.get( - DirectiveA, - null, - InjectFlags.Host | InjectFlags.Optional, - ); + tokenSelfViaInjector; + tokenHostViaInjector; constructor( public injector: Injector, @Inject(DirectiveA) @Self() @Optional() public tokenSelfViaConstructor: DirectiveA, @Inject(DirectiveA) @Host() @Optional() public tokenHostViaConstructor: DirectiveA, - ) {} + ) { + this.tokenSelfViaInjector = this.injector.get( + DirectiveA, + null, + InjectFlags.Self | InjectFlags.Optional, + ); + this.tokenHostViaInjector = this.injector.get( + DirectiveA, + null, + InjectFlags.Host | InjectFlags.Optional, + ); + } } @Component({ @@ -2888,8 +2901,10 @@ describe('di', () => { @Injectable({providedIn: forwardRef(() => Module)}) class Provider { - constructor(private _dep: ProviderDep) {} - value = this._dep.getNumber() + 2; + constructor(private _dep: ProviderDep) { + this.value = this._dep.getNumber() + 2; + } + value; } @Component({ diff --git a/packages/core/test/acceptance/styling_spec.ts b/packages/core/test/acceptance/styling_spec.ts index 6bfe34dc9c8..e5447a4aa36 100644 --- a/packages/core/test/acceptance/styling_spec.ts +++ b/packages/core/test/acceptance/styling_spec.ts @@ -4050,8 +4050,10 @@ describe('styling', () => { standalone: false, }) class HostBindingTestComponent { - style: SafeStyle = this.sanitizer.bypassSecurityTrustStyle('color: white; display: block;'); - constructor(private sanitizer: DomSanitizer) {} + style: SafeStyle; + constructor(private sanitizer: DomSanitizer) { + this.style = this.sanitizer.bypassSecurityTrustStyle('color: white; display: block;'); + } } TestBed.configureTestingModule({declarations: [HostBindingTestComponent]}); const fixture = TestBed.createComponent(HostBindingTestComponent); diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index b11ebe500ad..89cbc213531 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -17,9 +17,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnimationAstBuilderContext" }, @@ -566,18 +563,9 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_AnimationDriver" - }, { "name": "_CACHED_BODY" }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -591,11 +579,14 @@ "name": "_NullComponentFactoryResolver" }, { - "name": "_SpecialCasedStyles" + "name": "__defProp" }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 02317f268cf..b8f3f90e5b3 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -20,9 +20,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnimationAstBuilderContext" }, @@ -626,18 +623,9 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_AnimationDriver" - }, { "name": "_CACHED_BODY" }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -651,11 +639,14 @@ "name": "_NullComponentFactoryResolver" }, { - "name": "_SpecialCasedStyles" + "name": "__defProp" }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index de612d661bb..b049a696a00 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -14,9 +14,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -473,12 +470,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -488,9 +479,15 @@ { "name": "_NullComponentFactoryResolver" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 941ae367e06..0c5165516ab 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -8,6 +8,9 @@ { "name": "APP_INITIALIZER" }, + { + "name": "AfterRenderImpl" + }, { "name": "AfterRenderManager" }, @@ -542,9 +545,6 @@ { "name": "_AfterRenderImpl" }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -566,6 +566,9 @@ { "name": "__getOwnPropNames" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 2375efbdb26..adb204a5386 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -26,9 +26,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -437,9 +434,6 @@ { "name": "NgModuleRef2" }, - { - "name": "NgOnChangesFeatureImpl" - }, { "name": "NgZone" }, @@ -662,12 +656,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -689,9 +677,15 @@ { "name": "__await" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index f22de0aa12b..d9b7adc2ebb 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -29,9 +29,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -422,9 +419,6 @@ { "name": "NgModuleRef2" }, - { - "name": "NgOnChangesFeatureImpl" - }, { "name": "NgZone" }, @@ -647,12 +641,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -674,9 +662,15 @@ { "name": "__await" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 230395bb9bd..740a6a9058d 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -11,9 +11,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -359,12 +356,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -374,9 +365,15 @@ { "name": "_NullComponentFactoryResolver" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index c007088261d..a76b5294ef2 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -14,9 +14,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -524,12 +521,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -545,9 +536,15 @@ { "name": "__await" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/injection/bundle.golden_symbols.json b/packages/core/test/bundling/injection/bundle.golden_symbols.json index 21552d764e8..e2dcbc7f0b7 100644 --- a/packages/core/test/bundling/injection/bundle.golden_symbols.json +++ b/packages/core/test/bundling/injection/bundle.golden_symbols.json @@ -1,52 +1,16 @@ [ - { - "name": "AfterRenderPhase" - }, - { - "name": "AnonymousSubject" - }, - { - "name": "BehaviorSubject" - }, { "name": "CIRCULAR" }, - { - "name": "COMPLETE_NOTIFICATION" - }, - { - "name": "ChangeDetectionScheduler" - }, - { - "name": "ConsumerObserver" - }, - { - "name": "DestroyRef" - }, { "name": "EMPTY_ARRAY" }, - { - "name": "EMPTY_OBSERVER" - }, - { - "name": "EMPTY_PAYLOAD" - }, - { - "name": "EMPTY_SUBSCRIPTION" - }, { "name": "ENVIRONMENT_INITIALIZER" }, { "name": "EnvironmentInjector" }, - { - "name": "ErrorHandler" - }, - { - "name": "EventEmitter" - }, { "name": "INJECTOR" }, @@ -92,42 +56,18 @@ { "name": "NULL_INJECTOR" }, - { - "name": "NgZone" - }, - { - "name": "NodeInjectorDestroyRef" - }, { "name": "NullInjector" }, - { - "name": "ObjectUnsubscribedError" - }, - { - "name": "Observable" - }, - { - "name": "PendingTasksInternal" - }, { "name": "R3Injector" }, { "name": "RuntimeError" }, - { - "name": "SafeSubscriber" - }, { "name": "ScopedService" }, - { - "name": "Subject" - }, - { - "name": "Subscriber" - }, { "name": "Subscription" }, @@ -141,16 +81,13 @@ "name": "UnsubscriptionError" }, { - "name": "_AfterRenderImpl" - }, - { - "name": "_Injector" + "name": "__defProp" }, { "name": "__forward_ref__" }, { - "name": "_bind" + "name": "__publicField" }, { "name": "_currentInjector" @@ -161,30 +98,12 @@ { "name": "activeConsumer" }, - { - "name": "angularZoneInstanceIdProperty" - }, { "name": "arrRemove" }, { "name": "assertNotDestroyed" }, - { - "name": "bind" - }, - { - "name": "checkStable" - }, - { - "name": "config" - }, - { - "name": "context" - }, - { - "name": "convertToBitFlags" - }, { "name": "createErrorClass" }, @@ -194,18 +113,12 @@ { "name": "createLFrame" }, - { - "name": "createNotification" - }, { "name": "deepForEach" }, { "name": "deepForEachProvider" }, - { - "name": "errorContext" - }, { "name": "execFinalizer" }, @@ -221,9 +134,6 @@ { "name": "getFactoryDef" }, - { - "name": "getInjectImplementation" - }, { "name": "getInjectableDef" }, @@ -236,33 +146,12 @@ { "name": "getOwnDefinition" }, - { - "name": "getPromiseCtor" - }, - { - "name": "handleStoppedNotification" - }, - { - "name": "handleUnhandledError" - }, - { - "name": "hasApplyArgsData" - }, - { - "name": "identity" - }, { "name": "importProvidersFrom" }, - { - "name": "inject" - }, { "name": "injectArgs" }, - { - "name": "injectDestroyRef" - }, { "name": "injectInjectorOnly" }, @@ -275,18 +164,12 @@ { "name": "internalImportProvidersFrom" }, - { - "name": "isAngularZoneProperty" - }, { "name": "isEnvironmentProviders" }, { "name": "isFunction" }, - { - "name": "isSubscription" - }, { "name": "isTypeProvider" }, @@ -296,24 +179,6 @@ { "name": "makeRecord" }, - { - "name": "ngZoneInstanceId" - }, - { - "name": "noop" - }, - { - "name": "noop2" - }, - { - "name": "observable" - }, - { - "name": "onEnter" - }, - { - "name": "onLeave" - }, { "name": "processInjectorTypesWithProviders" }, @@ -332,12 +197,6 @@ { "name": "stringify" }, - { - "name": "timeoutProvider" - }, - { - "name": "updateMicroTaskStatus" - }, { "name": "walkProviderTree" }, diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index bfcd79700de..beb01ca95c3 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -32,9 +32,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -458,9 +455,6 @@ { "name": "NgModuleRef2" }, - { - "name": "NgOnChangesFeatureImpl" - }, { "name": "NgZone" }, @@ -794,12 +788,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -815,9 +803,18 @@ { "name": "__await" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, + { + "name": "_a" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 91908803aa6..4d6cea94d18 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -11,9 +11,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -419,12 +416,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -434,9 +425,15 @@ { "name": "_NullComponentFactoryResolver" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 61b7c60ab10..b547168bb74 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -14,9 +14,6 @@ { "name": "AfterRenderManager" }, - { - "name": "AfterRenderPhase" - }, { "name": "AnonymousSubject" }, @@ -545,12 +542,6 @@ { "name": "ZoneStablePendingTask" }, - { - "name": "_AfterRenderImpl" - }, - { - "name": "_ComponentFactoryResolver" - }, { "name": "_DOM" }, @@ -566,9 +557,15 @@ { "name": "_NullComponentFactoryResolver" }, + { + "name": "__defProp" + }, { "name": "__forward_ref__" }, + { + "name": "__publicField" + }, { "name": "_applyRootElementTransformImpl" }, diff --git a/packages/examples/upgrade/static/ts/full/module.ts b/packages/examples/upgrade/static/ts/full/module.ts index c0666431a0b..29c7edb29f9 100644 --- a/packages/examples/upgrade/static/ts/full/module.ts +++ b/packages/examples/upgrade/static/ts/full/module.ts @@ -103,7 +103,7 @@ export class Ng1HeroComponentWrapper extends UpgradeComponent { // The names of the input and output properties here must match the names of the // `<` and `&` bindings in the AngularJS component that is being wrapped @Input() hero!: Hero; - @Output() onRemove!: EventEmitter; + @Output() onRemove: EventEmitter = new EventEmitter(); constructor(elementRef: ElementRef, injector: Injector) { // We must pass the name of the directive as used by AngularJS to the super diff --git a/packages/examples/upgrade/static/ts/lite-multi/module.ts b/packages/examples/upgrade/static/ts/lite-multi/module.ts index aae301f21c8..843e98398d2 100644 --- a/packages/examples/upgrade/static/ts/lite-multi/module.ts +++ b/packages/examples/upgrade/static/ts/lite-multi/module.ts @@ -113,8 +113,10 @@ const appModule = angular controller: [ 'ng2AService', class Ng1AController { - value = this.ng2AService.getValue(); - constructor(private ng2AService: Ng2AService) {} + value: string; + constructor(private ng2AService: Ng2AService) { + this.value = this.ng2AService.getValue(); + } }, ], }) diff --git a/packages/examples/upgrade/static/ts/lite/module.ts b/packages/examples/upgrade/static/ts/lite/module.ts index e9476ce44f3..401ea852893 100644 --- a/packages/examples/upgrade/static/ts/lite/module.ts +++ b/packages/examples/upgrade/static/ts/lite/module.ts @@ -116,7 +116,7 @@ class Ng1HeroComponentWrapper extends UpgradeComponent { // The names of the input and output properties here must match the names of the // `<` and `&` bindings in the AngularJS component that is being wrapped. @Input() hero!: Hero; - @Output() onRemove!: EventEmitter; + @Output() onRemove: EventEmitter = new EventEmitter(); constructor(elementRef: ElementRef, injector: Injector) { // We must pass the name of the directive as used by AngularJS to the super. diff --git a/packages/forms/test/form_array_spec.ts b/packages/forms/test/form_array_spec.ts index 1fc81ce002c..7b07d3acd36 100644 --- a/packages/forms/test/form_array_spec.ts +++ b/packages/forms/test/form_array_spec.ts @@ -1538,7 +1538,7 @@ import {asyncValidator} from './util'; describe('can be extended', () => { it('by a simple strongly-typed array', () => { abstract class StringFormArray extends FormArray { - override value!: string[]; + override value: string[] = []; } }); @@ -1546,8 +1546,8 @@ import {asyncValidator} from './util'; abstract class OtherTypedFormArray< TControls extends Array>, > extends FormArray { - override controls!: TControls; - override value!: never[]; + override controls: TControls = {} as TControls; + override value: string[] = []; } }); }); diff --git a/packages/language-service/src/completions.ts b/packages/language-service/src/completions.ts index 111068ecec2..f0cf5236cfa 100644 --- a/packages/language-service/src/completions.ts +++ b/packages/language-service/src/completions.ts @@ -11,7 +11,6 @@ import { ASTWithSource, BindingPipe, BindingType, - Call, EmptyExpr, ImplicitReceiver, LiteralPrimitive, @@ -41,6 +40,7 @@ import { PotentialDirective, SymbolKind, TemplateDeclarationSymbol, + TemplateTypeChecker, } from '@angular/compiler-cli/src/ngtsc/typecheck/api'; import ts from 'typescript'; @@ -123,12 +123,12 @@ function buildBlockSnippet(insertSnippet: boolean, blockName: string, withParens * @param N type of the template node in question, narrowed accordingly. */ export class CompletionBuilder { - private readonly typeChecker = this.compiler.getCurrentProgram().getTypeChecker(); - private readonly templateTypeChecker = this.compiler.getTemplateTypeChecker(); - private readonly nodeParent = this.targetDetails.parent; - private readonly nodeContext = nodeContextFromTarget(this.targetDetails.context); - private readonly template = this.targetDetails.template; - private readonly position = this.targetDetails.position; + private readonly typeChecker: ts.TypeChecker; + private readonly templateTypeChecker: TemplateTypeChecker; + private readonly nodeParent: TmplAstNode | AST | null; + private readonly nodeContext: CompletionNodeContext; + private readonly template: TmplAstTemplate | null; + private readonly position: number; constructor( private readonly tsLS: ts.LanguageService, @@ -136,7 +136,14 @@ export class CompletionBuilder { private readonly component: ts.ClassDeclaration, private readonly node: N, private readonly targetDetails: TemplateTarget, - ) {} + ) { + this.typeChecker = this.compiler.getCurrentProgram().getTypeChecker(); + this.templateTypeChecker = this.compiler.getTemplateTypeChecker(); + this.nodeParent = this.targetDetails.parent; + this.nodeContext = nodeContextFromTarget(this.targetDetails.context); + this.template = this.targetDetails.template; + this.position = this.targetDetails.position; + } /** * Analogue for `ts.LanguageService.getCompletionsAtPosition`. diff --git a/packages/language-service/src/definitions.ts b/packages/language-service/src/definitions.ts index 15cb9f8ae94..aa78000baf3 100644 --- a/packages/language-service/src/definitions.ts +++ b/packages/language-service/src/definitions.ts @@ -26,6 +26,7 @@ import { SymbolKind, TcbLocation, TemplateSymbol, + TemplateTypeChecker, } from '@angular/compiler-cli/src/ngtsc/typecheck/api'; import ts from 'typescript'; @@ -55,12 +56,14 @@ interface HasTcbLocation { } export class DefinitionBuilder { - private readonly ttc = this.compiler.getTemplateTypeChecker(); + private readonly ttc: TemplateTypeChecker; constructor( private readonly tsLS: ts.LanguageService, private readonly compiler: NgCompiler, - ) {} + ) { + this.ttc = this.compiler.getTemplateTypeChecker(); + } getDefinitionAndBoundSpan( fileName: string, diff --git a/packages/language-service/src/quick_info.ts b/packages/language-service/src/quick_info.ts index f1dd51e89a5..f6055433a7c 100644 --- a/packages/language-service/src/quick_info.ts +++ b/packages/language-service/src/quick_info.ts @@ -47,8 +47,8 @@ import { } from './utils'; export class QuickInfoBuilder { - private readonly typeChecker = this.compiler.getCurrentProgram().getTypeChecker(); - private readonly parent = this.positionDetails.parent; + private readonly typeChecker: ts.TypeChecker; + private readonly parent: TmplAstNode | AST | null; constructor( private readonly tsLS: ts.LanguageService, @@ -56,7 +56,10 @@ export class QuickInfoBuilder { private readonly component: ts.ClassDeclaration, private node: TmplAstNode | AST, private readonly positionDetails: TemplateTarget, - ) {} + ) { + this.typeChecker = this.compiler.getCurrentProgram().getTypeChecker(); + this.parent = this.positionDetails.parent; + } get(): ts.QuickInfo | undefined { if (this.node instanceof TmplAstDeferredTrigger || this.node instanceof TmplAstBlockNode) { diff --git a/packages/language-service/src/references_and_rename.ts b/packages/language-service/src/references_and_rename.ts index a93632a2d44..d2ac3f6ad9f 100644 --- a/packages/language-service/src/references_and_rename.ts +++ b/packages/language-service/src/references_and_rename.ts @@ -10,12 +10,11 @@ import {NgCompiler} from '@angular/compiler-cli/src/ngtsc/core'; import {absoluteFrom} from '@angular/compiler-cli/src/ngtsc/file_system'; import {MetaKind, PipeMeta} from '@angular/compiler-cli/src/ngtsc/metadata'; import {PerfPhase} from '@angular/compiler-cli/src/ngtsc/perf'; -import {SymbolKind} from '@angular/compiler-cli/src/ngtsc/typecheck/api'; +import {SymbolKind, TemplateTypeChecker} from '@angular/compiler-cli/src/ngtsc/typecheck/api'; import ts from 'typescript'; import { convertToTemplateDocumentSpan, - createLocationKey, FilePosition, getParentClassMeta, getRenameTextAndSpanAtPosition, @@ -26,12 +25,14 @@ import {collectMemberMethods, findTightestNode} from './utils/ts_utils'; import {getTemplateInfoAtPosition, TemplateInfo} from './utils'; export class ReferencesBuilder { - private readonly ttc = this.compiler.getTemplateTypeChecker(); + private readonly ttc: TemplateTypeChecker; constructor( private readonly tsLS: ts.LanguageService, private readonly compiler: NgCompiler, - ) {} + ) { + this.ttc = this.compiler.getTemplateTypeChecker(); + } getReferencesAtPosition(filePath: string, position: number): ts.ReferenceEntry[] | undefined { this.ttc.generateAllTypeCheckBlocks(); @@ -162,12 +163,14 @@ function isDirectRenameContext( } export class RenameBuilder { - private readonly ttc = this.compiler.getTemplateTypeChecker(); + private readonly ttc: TemplateTypeChecker; constructor( private readonly tsLS: ts.LanguageService, private readonly compiler: NgCompiler, - ) {} + ) { + this.ttc = this.compiler.getTemplateTypeChecker(); + } getRenameInfo( filePath: string, diff --git a/packages/localize/tools/src/translate/source_files/source_file_translation_handler.ts b/packages/localize/tools/src/translate/source_files/source_file_translation_handler.ts index 1a6df68ced0..bbff36e3de7 100644 --- a/packages/localize/tools/src/translate/source_files/source_file_translation_handler.ts +++ b/packages/localize/tools/src/translate/source_files/source_file_translation_handler.ts @@ -27,14 +27,17 @@ import {makeLocalePlugin} from './locale_plugin'; * message. */ export class SourceFileTranslationHandler implements TranslationHandler { - private sourceLocaleOptions: TranslatePluginOptions = { - ...this.translationOptions, - missingTranslation: 'ignore', - }; + private sourceLocaleOptions: TranslatePluginOptions; + constructor( private fs: FileSystem, private translationOptions: TranslatePluginOptions = {}, - ) {} + ) { + this.sourceLocaleOptions = { + ...this.translationOptions, + missingTranslation: 'ignore', + }; + } canTranslate(relativeFilePath: PathSegment | AbsoluteFsPath, _contents: Uint8Array): boolean { return this.fs.extname(relativeFilePath) === '.js'; diff --git a/packages/service-worker/worker/testing/events.ts b/packages/service-worker/worker/testing/events.ts index 6127aeae277..32a8b32eebc 100644 --- a/packages/service-worker/worker/testing/events.ts +++ b/packages/service-worker/worker/testing/events.ts @@ -111,16 +111,17 @@ export class MockExtendableMessageEvent } export class MockNotificationEvent extends MockExtendableEvent implements NotificationEvent { - readonly notification = { - ...this._notification, - close: () => undefined, - } as Notification; + readonly notification: Notification; constructor( private _notification: Partial, readonly action = '', ) { super('notification'); + this.notification = { + ...this._notification, + close: () => undefined, + } as Notification; } } diff --git a/packages/service-worker/worker/testing/scope.ts b/packages/service-worker/worker/testing/scope.ts index bc2035c9c8f..2b9c1dc4bb6 100644 --- a/packages/service-worker/worker/testing/scope.ts +++ b/packages/service-worker/worker/testing/scope.ts @@ -27,11 +27,14 @@ import {normalizeUrl, parseUrl} from './utils'; const EMPTY_SERVER_STATE = new MockServerStateBuilder().build(); export class SwTestHarnessBuilder { - private origin = parseUrl(this.scopeUrl).origin; + private origin: string; private server = EMPTY_SERVER_STATE; - private caches = new MockCacheStorage(this.origin); + private caches: MockCacheStorage; - constructor(private scopeUrl = 'http://localhost/') {} + constructor(private scopeUrl = 'http://localhost/') { + this.origin = parseUrl(this.scopeUrl).origin; + this.caches = new MockCacheStorage(this.origin); + } withCacheState(cache: string): SwTestHarnessBuilder { this.caches = new MockCacheStorage(this.origin, cache); diff --git a/packages/tsconfig-build.json b/packages/tsconfig-build.json index 7356a057536..8fd4cf015bf 100644 --- a/packages/tsconfig-build.json +++ b/packages/tsconfig-build.json @@ -19,8 +19,6 @@ "moduleResolution": "node", "module": "esnext", "target": "es2022", - // Keep the below in sync with ng_module.bzl - "useDefineForClassFields": false, "lib": ["es2020", "dom", "dom.iterable"], "skipLibCheck": true, // don't auto-discover @types/node, it results in a ///(); - /** Server used for communication with the Karma launcher. */ - private _server = new IpcServer(this); - - /** Base selenium capabilities that will be added to each browser. */ - private _baseCapabilities = {...defaultCapabilities, ...this._userCapabilities}; + private _baseCapabilities; /** Id of the keep alive interval that ensures no remote browsers time out. */ private _keepAliveIntervalId: NodeJS.Timeout | null = null; @@ -85,6 +81,9 @@ export class SaucelabsDaemon { ) { // Starts the keep alive loop for all active browsers, running every 15 seconds. this._keepAliveIntervalId = setInterval(() => this._keepAliveBrowsers(), 15_000); + + /** Base selenium capabilities that will be added to each browser. */ + this._baseCapabilities = {...defaultCapabilities, ...this._userCapabilities}; } /**