From 22652ae92cd3779827d35eb8e470101a6ca96502 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Sep 2026 00:57:28 +0000 Subject: [PATCH 1/2] Initial plan From 09f82b6fd962e23e1706ded14c1ae8dc84cccd03 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Sep 2026 01:09:02 +0000 Subject: [PATCH 2/2] Update MutationObserverInit.attributeFilter to accept Iterable Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- tsc/internal/bundled/libs/lib.dom.d.ts | 2 +- ...tionObserverInitAttributeFilterIterable.js | 16 ++++++++++ ...bserverInitAttributeFilterIterable.symbols | 26 ++++++++++++++++ ...nObserverInitAttributeFilterIterable.types | 31 +++++++++++++++++++ ...tionObserverInitAttributeFilterIterable.ts | 8 +++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.js create mode 100644 tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.symbols create mode 100644 tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.types create mode 100644 tsc/testdata/tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts diff --git a/tsc/internal/bundled/libs/lib.dom.d.ts b/tsc/internal/bundled/libs/lib.dom.d.ts index 9e127c3f5a524..7ffa528860919 100644 --- a/tsc/internal/bundled/libs/lib.dom.d.ts +++ b/tsc/internal/bundled/libs/lib.dom.d.ts @@ -1671,7 +1671,7 @@ interface MultiCacheQueryOptions extends CacheQueryOptions { interface MutationObserverInit { /** Set to a list of attribute local names (without namespace) if not all attribute mutations need to be observed and attributes is true or omitted. */ - attributeFilter?: string[]; + attributeFilter?: string[] | Iterable; /** Set to true if attributes is true or omitted and target's attribute value before the mutation needs to be recorded. */ attributeOldValue?: boolean; /** Set to true if mutations to target's attributes are to be observed. Can be omitted if attributeOldValue or attributeFilter is specified. */ diff --git a/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.js b/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.js new file mode 100644 index 0000000000000..d5b15bc48b2cd --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts] //// + +//// [mutationObserverInitAttributeFilterIterable.ts] +const names = new Set(); + +const options1: MutationObserverInit = { attributeFilter: names.keys() }; +const options2: MutationObserverInit = { attributeFilter: ["foo", "bar"] }; +const options3: MutationObserverInit = { attributeFilter: names }; + + +//// [mutationObserverInitAttributeFilterIterable.js] +"use strict"; +const names = new Set(); +const options1 = { attributeFilter: names.keys() }; +const options2 = { attributeFilter: ["foo", "bar"] }; +const options3 = { attributeFilter: names }; diff --git a/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.symbols b/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.symbols new file mode 100644 index 0000000000000..199da748ffdb9 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.symbols @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts] //// + +=== mutationObserverInitAttributeFilterIterable.ts === +const names = new Set(); +>names : Symbol(names, Decl(mutationObserverInitAttributeFilterIterable.ts, 0, 5)) +>Set : Symbol(Set, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2025.collection.d.ts, --, --)) + +const options1: MutationObserverInit = { attributeFilter: names.keys() }; +>options1 : Symbol(options1, Decl(mutationObserverInitAttributeFilterIterable.ts, 2, 5)) +>MutationObserverInit : Symbol(MutationObserverInit, Decl(lib.dom.d.ts, --, --)) +>attributeFilter : Symbol(attributeFilter, Decl(mutationObserverInitAttributeFilterIterable.ts, 2, 40)) +>names.keys : Symbol(Set.keys, Decl(lib.es2015.iterable.d.ts, --, --)) +>names : Symbol(names, Decl(mutationObserverInitAttributeFilterIterable.ts, 0, 5)) +>keys : Symbol(Set.keys, Decl(lib.es2015.iterable.d.ts, --, --)) + +const options2: MutationObserverInit = { attributeFilter: ["foo", "bar"] }; +>options2 : Symbol(options2, Decl(mutationObserverInitAttributeFilterIterable.ts, 3, 5)) +>MutationObserverInit : Symbol(MutationObserverInit, Decl(lib.dom.d.ts, --, --)) +>attributeFilter : Symbol(attributeFilter, Decl(mutationObserverInitAttributeFilterIterable.ts, 3, 40)) + +const options3: MutationObserverInit = { attributeFilter: names }; +>options3 : Symbol(options3, Decl(mutationObserverInitAttributeFilterIterable.ts, 4, 5)) +>MutationObserverInit : Symbol(MutationObserverInit, Decl(lib.dom.d.ts, --, --)) +>attributeFilter : Symbol(attributeFilter, Decl(mutationObserverInitAttributeFilterIterable.ts, 4, 40)) +>names : Symbol(names, Decl(mutationObserverInitAttributeFilterIterable.ts, 0, 5)) + diff --git a/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.types b/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.types new file mode 100644 index 0000000000000..bc1d6158fd41e --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/mutationObserverInitAttributeFilterIterable.types @@ -0,0 +1,31 @@ +//// [tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts] //// + +=== mutationObserverInitAttributeFilterIterable.ts === +const names = new Set(); +>names : Set +>new Set() : Set +>Set : SetConstructor + +const options1: MutationObserverInit = { attributeFilter: names.keys() }; +>options1 : MutationObserverInit +>{ attributeFilter: names.keys() } : { attributeFilter: SetIterator; } +>attributeFilter : SetIterator +>names.keys() : SetIterator +>names.keys : () => SetIterator +>names : Set +>keys : () => SetIterator + +const options2: MutationObserverInit = { attributeFilter: ["foo", "bar"] }; +>options2 : MutationObserverInit +>{ attributeFilter: ["foo", "bar"] } : { attributeFilter: string[]; } +>attributeFilter : string[] +>["foo", "bar"] : string[] +>"foo" : "foo" +>"bar" : "bar" + +const options3: MutationObserverInit = { attributeFilter: names }; +>options3 : MutationObserverInit +>{ attributeFilter: names } : { attributeFilter: Set; } +>attributeFilter : Set +>names : Set + diff --git a/tsc/testdata/tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts b/tsc/testdata/tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts new file mode 100644 index 0000000000000..1c6681e6b91e5 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/mutationObserverInitAttributeFilterIterable.ts @@ -0,0 +1,8 @@ +// @target: esnext +// @lib: dom,esnext + +const names = new Set(); + +const options1: MutationObserverInit = { attributeFilter: names.keys() }; +const options2: MutationObserverInit = { attributeFilter: ["foo", "bar"] }; +const options3: MutationObserverInit = { attributeFilter: names };