Files
Paul Gschwendtner 907da3977a fix(core): destroy hooks not set up for useClass provider using forwardRef (#44281)
Fixes an issue where destroy hooks are not set up for `useClass` providers
that rely on `forwardRef` for passing the actual class reference.

Currently the destroy hooks are not captured because forward refs are
not resolved for class providers. In ES2015+ this issue becomes even
more critical if arrow-functions are used for

e.g. `useClass: () => forwardRef(..)`.

This is because arrow functions do not have a prototype, unlike in ES5
where the function assigned to `useClass` would always have a prototype.
In ES2015+ a runtime exception as followed is returned (and doesn't give
any useful indication of the forwardRef issue):

```
TypeError: Cannot read properties of undefined (reading 'ngOnDestroy')
  at registerDestroyHooksIfSupported (dist/packages/core/src/render3/di_setup.ts:196:35 <- dist/legacy-test-bundle.spec.js:41508:37)
  at resolveProvider (dist/packages/core/src/render3/di_setup.ts:153:9 <- dist/legacy-test-bundle.spec.js:41485:11)
  at resolveProvider (dist/packages/core/src/render3/di_setup.ts:70:7 <- dist/legacy-test-bundle.spec.js:41445:9)
  at providersResolver (dist/packages/core/src/render3/di_setup.ts:54:5 <- dist/legacy-test-bundle.spec.js:41438:7)
  at Object.definition.providersResolver (dist/packages/core/src/render3/features/providers_feature.ts:48:18 <- dist/legacy-test-bundle.spec.js:41600:16)
  at resolveDirectives (dist/packages/core/src/render3/instructions/shared.ts:1179:40 <- dist/legacy-test-bundle.spec.js:35611:17)
  at elementStartFirstCreatePass (dist/packages/core/src/render3/instructions/element.ts:40:7 <- dist/legacy-test-bundle.spec.js:38432:27)
  at ɵɵelementStart (dist/packages/core/src/render3/instructions/element.ts:87:7 <- dist/legacy-test-bundle.spec.js:38453:43)
  at ɵɵelement (dist/packages/core/src/render3/instructions/element.ts:180:3 <- dist/legacy-test-bundle.spec.js:38510:5)
  at MultipleFormControls_Template (ng:///MultipleFormControls.js:9:9)
```

PR Close #44281
2021-11-30 11:56:05 -05:00

114 lines
2.3 KiB
Python

load("//tools:defaults.bzl", "jasmine_node_test", "karma_web_test_suite", "ts_library")
package(default_visibility = ["//visibility:public"])
ES2015_SPECS = [
"providers_es2015_spec.ts",
]
ts_library(
name = "render3_lib",
testonly = True,
srcs = glob(
["**/*.ts"],
exclude = [
"**/*_perf.ts",
"domino.d.ts",
"load_domino.ts",
"is_shape_of.ts",
"jit_spec.ts",
"matchers.ts",
] + ES2015_SPECS,
),
deps = [
":matchers",
"//packages:types",
"//packages/animations",
"//packages/animations/browser",
"//packages/animations/browser/testing",
"//packages/common",
"//packages/compiler",
"//packages/core",
"//packages/core/src/di/interface",
"//packages/core/src/interface",
"//packages/core/src/util",
"//packages/core/testing",
"//packages/platform-browser",
"//packages/platform-browser/animations",
"//packages/platform-browser/testing",
"//packages/private/testing",
"@npm//rxjs",
],
)
ts_library(
name = "render3_es2015_test_lib",
testonly = True,
srcs = ES2015_SPECS,
devmode_target = "es2015",
tsconfig = "es2015-tsconfig.json",
deps = [
":matchers",
":render3_lib",
"//packages:types",
"//packages/core",
],
)
ts_library(
name = "matchers",
testonly = True,
srcs = [
"is_shape_of.ts",
"matchers.ts",
],
deps = [
"//packages/core",
],
)
ts_library(
name = "domino",
testonly = True,
srcs = [
"load_domino.ts",
],
deps = [
"//packages/common",
"//packages/compiler",
"//packages/platform-server",
"//packages/zone.js/lib:zone_d_ts",
],
)
ts_library(
name = "render3_node_lib",
testonly = True,
srcs = [],
deps = [
":domino",
":render3_lib",
],
)
jasmine_node_test(
name = "render3",
bootstrap = [
":domino_es5",
"//tools/testing:node_es5",
],
deps = [
":render3_es2015_test_lib",
":render3_node_lib",
"//packages/zone.js/lib",
],
)
karma_web_test_suite(
name = "render3_web",
deps = [
":render3_es2015_test_lib",
":render3_lib",
],
)