From 8f92783f55d385708437d5424124b16032c957bb Mon Sep 17 00:00:00 2001 From: tolyo Date: Tue, 27 Oct 2026 11:06:55 +0200 Subject: [PATCH 1/6] Fix Kotlin namespace parity coverage --- integrations/kotlin/NG_NAMESPACE_PARITY.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/integrations/kotlin/NG_NAMESPACE_PARITY.md b/integrations/kotlin/NG_NAMESPACE_PARITY.md index 402e91486..d8a438eab 100644 --- a/integrations/kotlin/NG_NAMESPACE_PARITY.md +++ b/integrations/kotlin/NG_NAMESPACE_PARITY.md @@ -77,6 +77,11 @@ part of the Kotlin public facade. | `LinkFn` | generated | | `Model` | generated | | `ModelChange` | generated | +| `ModelValidationContext` | generated | +| `ModelParser` | manual | +| `ModelFormatter` | manual | +| `ModelValidators` | manual | +| `AsyncModelValidators` | manual | | `ModelRestoreOptions` | generated | | `ModelSyncFailureMode` | generated | | `ModelSyncOptions` | generated | @@ -174,6 +179,7 @@ part of the Kotlin public facade. | `StreamService` | generated | | `TemplateCacheService` | generated | | `TemplateRequestService` | generated | +| `TemplateRequestOptions` | manual | | `TransitionsService` | generated | | `WebComponentService` | generated | | `WebSocketService` | generated | From 0b2b12b7991aa0afc0131ee32a341fd189290a2a Mon Sep 17 00:00:00 2001 From: tolyo Date: Tue, 27 Oct 2026 11:07:02 +0200 Subject: [PATCH 2/6] Fix Kotlin namespace parity coverage --- .../src/jsTest/kotlin/angular/ts/AngularTsTest.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/integrations/kotlin/src/jsTest/kotlin/angular/ts/AngularTsTest.kt b/integrations/kotlin/src/jsTest/kotlin/angular/ts/AngularTsTest.kt index 3fdc733ed..5a7b2822e 100644 --- a/integrations/kotlin/src/jsTest/kotlin/angular/ts/AngularTsTest.kt +++ b/integrations/kotlin/src/jsTest/kotlin/angular/ts/AngularTsTest.kt @@ -30,13 +30,24 @@ class AngularTsTest { val parser: ModelParser = { text -> text.toDoubleOrNull() } control.addParser(parser) assertTrue(control.parsers[0]("invalid").asDynamic() === js("undefined")) - control.formatters = arrayOf({ value: Double? -> value?.toString() ?: "" }) + val formatter: ModelFormatter = { value -> value?.toString() ?: "" } + control.formatters = arrayOf(formatter) + assertEquals("", control.formatters[0](null)) control.validators["positive"] = { value, text -> (value ?: 0.0) > 0 && text != "" } assertEquals(true, control.validators["positive"]?.invoke(12.0, "12")) assertEquals(24.0, control.parsers[0]("24")) control.setViewValue("24") assertEquals("24", control.viewValue) val abort = js("new AbortController()") + val context = js("({})").unsafeCast() + context.signal = abort.signal + var validationSignal: dynamic = null + control.asyncValidators["remote"] = { value, text, validation -> + validationSignal = validation.signal + Promise.resolve(value != null && text != null) + } + assertNotNull(control.asyncValidators["remote"]).invoke(12.0, "12", context) + assertSame(abort.signal, validationSignal) var captured: dynamic = null val request: dynamic = { _: String, options: dynamic -> captured = options.signal } val templateRequest = TemplateRequestService(request.unsafeCast()) From 9880ee3c3b19972f61917ed1cc99e9d180cd3f2b Mon Sep 17 00:00:00 2001 From: tolyo Date: Tue, 27 Oct 2026 11:07:42 +0200 Subject: [PATCH 3/6] Record Kotlin member parity decisions --- integrations/kotlin/tool/generator-overrides.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/integrations/kotlin/tool/generator-overrides.json b/integrations/kotlin/tool/generator-overrides.json index 0c7e5b379..13dc6381d 100644 --- a/integrations/kotlin/tool/generator-overrides.json +++ b/integrations/kotlin/tool/generator-overrides.json @@ -1,6 +1,10 @@ { "callableProperties": [], - "manual": [], + "manual": [ + "ModelFormatter.call", + "ModelParser.call", + "TemplateRequestOptions.signal" + ], "propertyTypes": { "GeolocationValue.altitude": "Double?", "GeolocationValue.altitudeAccuracy": "Double?", @@ -19,10 +23,10 @@ "Element": "org.w3c.dom.Element", "Event": "org.w3c.dom.events.Event", "HTMLElement": "org.w3c.dom.HTMLElement", + "ModelValidationContext": "ModelValidationContext", "Node": "org.w3c.dom.Node", "TModel": "TModel", "TView": "TView", - "ModelValidationContext": "ModelValidationContext", "TemplateRequestOptions": "TemplateRequestOptions" }, "unsupported": [] From 2f1e66dd0d99a8caf371d7d9cac8f2093453b412 Mon Sep 17 00:00:00 2001 From: tolyo Date: Tue, 27 Oct 2026 11:08:13 +0200 Subject: [PATCH 4/6] Sort Kotlin type overrides --- integrations/kotlin/tool/generator-overrides.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/kotlin/tool/generator-overrides.json b/integrations/kotlin/tool/generator-overrides.json index 13dc6381d..2da93d4da 100644 --- a/integrations/kotlin/tool/generator-overrides.json +++ b/integrations/kotlin/tool/generator-overrides.json @@ -25,9 +25,9 @@ "HTMLElement": "org.w3c.dom.HTMLElement", "ModelValidationContext": "ModelValidationContext", "Node": "org.w3c.dom.Node", + "TemplateRequestOptions": "TemplateRequestOptions", "TModel": "TModel", - "TView": "TView", - "TemplateRequestOptions": "TemplateRequestOptions" + "TView": "TView" }, "unsupported": [] } From 2d36cd83dfca00a66d6d3efb8ec21153989e0313 Mon Sep 17 00:00:00 2001 From: tolyo Date: Tue, 27 Oct 2026 11:08:54 +0200 Subject: [PATCH 5/6] Preserve generated members for manual parity coverage --- integrations/kotlin/tool/generator-overrides.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/kotlin/tool/generator-overrides.json b/integrations/kotlin/tool/generator-overrides.json index 2da93d4da..badd5c732 100644 --- a/integrations/kotlin/tool/generator-overrides.json +++ b/integrations/kotlin/tool/generator-overrides.json @@ -1,6 +1,7 @@ { "callableProperties": [], - "manual": [ + "manual": [], + "manualCoverage": [ "ModelFormatter.call", "ModelParser.call", "TemplateRequestOptions.signal" From e2c9675570a42d0819e05ea202f9b94c90d42d84 Mon Sep 17 00:00:00 2001 From: tolyo Date: Tue, 27 Oct 2026 11:09:00 +0200 Subject: [PATCH 6/6] Preserve generated members for manual parity coverage --- integrations/kotlin/tool/check_ng_namespace_members.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/integrations/kotlin/tool/check_ng_namespace_members.mjs b/integrations/kotlin/tool/check_ng_namespace_members.mjs index 6f36e3e79..668737cdd 100644 --- a/integrations/kotlin/tool/check_ng_namespace_members.mjs +++ b/integrations/kotlin/tool/check_ng_namespace_members.mjs @@ -30,6 +30,7 @@ const stalePatterns = [ ...staleObjectKeys("types", overrides.types, collectReferencedTypeNames()), ...staleListPatterns("callableProperties", overrides.callableProperties), ...staleListPatterns("manual", overrides.manual), + ...staleListPatterns("manualCoverage", overrides.manualCoverage), ...staleListPatterns("unsupported", overrides.unsupported), ]; const orderingProblems = [ @@ -38,6 +39,7 @@ const orderingProblems = [ ...objectOrderingProblems("types", overrides.types), ...listOrderingProblems("callableProperties", overrides.callableProperties), ...listOrderingProblems("manual", overrides.manual), + ...listOrderingProblems("manualCoverage", overrides.manualCoverage), ...listOrderingProblems("unsupported", overrides.unsupported), ]; const missingCoverage = uncoveredImplementedMembers(); @@ -189,7 +191,7 @@ function isRepoTypesNode(node) { } function uncoveredImplementedMembers() { - const manual = new Set(overrides.manual ?? []); + const manual = new Set([...(overrides.manual ?? []), ...(overrides.manualCoverage ?? [])]); const unsupported = new Set(overrides.unsupported ?? []); const missing = [];