From b2a94c4944cbb386e9ab8ba0f1c74737d71e902f Mon Sep 17 00:00:00 2001 From: Alex <8125011+alex-kinokon@users.noreply.github.com> Date: Wed, 19 Mar 2025 23:03:51 -0400 Subject: [PATCH 1/5] Make most textContent not nullable --- baselines/dom.generated.d.ts | 9 +++++++ baselines/ts5.5/dom.generated.d.ts | 9 +++++++ inputfiles/addedTypes.jsonc | 42 ++++++++++++++++++++++++++++++ unittests/files/nodeValue.ts | 26 ++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 unittests/files/nodeValue.ts diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 0b09311f8..232622434 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -2908,6 +2908,9 @@ interface Attr extends Node { readonly specified: boolean; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Attr/value) */ value: string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var Attr: { @@ -6213,6 +6216,9 @@ interface CharacterData extends Node, ChildNode, NonDocumentTypeChildNode { replaceData(offset: number, count: number, data: string): void; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CharacterData/substringData) */ substringData(offset: number, count: number): string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var CharacterData: { @@ -8608,6 +8614,9 @@ interface Element extends Node, ARIAMixin, Animatable, ChildNode, NonDocumentTyp * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/matches) */ webkitMatchesSelector(selectors: string): boolean; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); addEventListener(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; diff --git a/baselines/ts5.5/dom.generated.d.ts b/baselines/ts5.5/dom.generated.d.ts index e1b9525bd..f7920a70b 100644 --- a/baselines/ts5.5/dom.generated.d.ts +++ b/baselines/ts5.5/dom.generated.d.ts @@ -2908,6 +2908,9 @@ interface Attr extends Node { readonly specified: boolean; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Attr/value) */ value: string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var Attr: { @@ -6206,6 +6209,9 @@ interface CharacterData extends Node, ChildNode, NonDocumentTypeChildNode { replaceData(offset: number, count: number, data: string): void; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CharacterData/substringData) */ substringData(offset: number, count: number): string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var CharacterData: { @@ -8599,6 +8605,9 @@ interface Element extends Node, ARIAMixin, Animatable, ChildNode, NonDocumentTyp * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/matches) */ webkitMatchesSelector(selectors: string): boolean; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); addEventListener(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index 3c2041999..655c2b338 100644 --- a/inputfiles/addedTypes.jsonc +++ b/inputfiles/addedTypes.jsonc @@ -11,6 +11,19 @@ ] } }, + "Comment": { + "methods": { + "method": { + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): string", + "set textContent(value: string | null)" + ] + } + } + } + }, "DocumentAndElementEventHandlers": { "events": { "event": [ @@ -786,6 +799,13 @@ ] } } + }, + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): string", + "set textContent(value: string | null)" + ] } } }, @@ -1196,6 +1216,17 @@ }, "Attr": { "name": "Attr", + "methods": { + "method": { + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): string", + "set textContent(value: string | null)" + ] + } + } + }, "properties": { "property": { "ownerDocument": { @@ -1208,6 +1239,17 @@ }, "CharacterData": { "name": "CharacterData", + "methods": { + "method": { + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): string", + "set textContent(value: string | null)" + ] + } + } + }, "properties": { "property": { "ownerDocument": { diff --git a/unittests/files/nodeValue.ts b/unittests/files/nodeValue.ts new file mode 100644 index 000000000..1cc664ce3 --- /dev/null +++ b/unittests/files/nodeValue.ts @@ -0,0 +1,26 @@ +declare const assertType: () => ( + _x: T1, +) => StrictEqual extends true + ? () => void + : T1 extends T + ? { error: "Left side is not assignable to right side" } + : { error: "Right side is not assignable to left side" }; + +type StrictEqual = + (() => T extends X ? 1 : 2) extends () => T extends Y ? 1 : 2 + ? true + : false; + +const div = document.createElement("div"); +assertType()(div.textContent)(); +div.textContent = null; + +const text = document.createTextNode("hello"); +assertType()(text.textContent)(); + +assertType()(document.textContent)(); + +const type = document.doctype!; +assertType()(type.textContent)(); + +export {}; From 205a044418f0d8f90e0d09d479b42fc3c86dd582 Mon Sep 17 00:00:00 2001 From: Alex <8125011+alex-kinokon@users.noreply.github.com> Date: Wed, 21 May 2025 01:56:26 -0400 Subject: [PATCH 2/5] Address feedback --- inputfiles/addedTypes.jsonc | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index 01fbedeb2..625dbefb8 100644 --- a/inputfiles/addedTypes.jsonc +++ b/inputfiles/addedTypes.jsonc @@ -11,19 +11,6 @@ ] } }, - "Comment": { - "methods": { - "method": { - "textContent": { - "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", - "overrideSignatures": [ - "get textContent(): string", - "set textContent(value: string | null)" - ] - } - } - } - }, "DocumentAndElementEventHandlers": { "events": { "event": [ From 82bf237bf6de4f451999d819a84ba6d9fa29537b Mon Sep 17 00:00:00 2001 From: Alex <8125011+alex-kinokon@users.noreply.github.com> Date: Wed, 21 May 2025 02:00:06 -0400 Subject: [PATCH 3/5] Fix CI error --- baselines/ts5.6/dom.generated.d.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/baselines/ts5.6/dom.generated.d.ts b/baselines/ts5.6/dom.generated.d.ts index 435ce4c60..0b4e51a03 100644 --- a/baselines/ts5.6/dom.generated.d.ts +++ b/baselines/ts5.6/dom.generated.d.ts @@ -2990,6 +2990,9 @@ interface Attr extends Node { readonly specified: boolean; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Attr/value) */ value: string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var Attr: { @@ -6531,6 +6534,9 @@ interface CharacterData extends Node, ChildNode, NonDocumentTypeChildNode { replaceData(offset: number, count: number, data: string): void; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CharacterData/substringData) */ substringData(offset: number, count: number): string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var CharacterData: { @@ -9035,6 +9041,9 @@ interface Element extends Node, ARIAMixin, Animatable, ChildNode, NonDocumentTyp * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/matches) */ webkitMatchesSelector(selectors: string): boolean; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); addEventListener(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; From 99e0b2f12cd92b987ad5817970e26182cad86600 Mon Sep 17 00:00:00 2001 From: Alex <8125011+alex-kinokon@users.noreply.github.com> Date: Thu, 29 May 2025 23:55:37 -0400 Subject: [PATCH 4/5] Apply suggestions --- baselines/dom.generated.d.ts | 7 ++++++ baselines/ts5.5/dom.generated.d.ts | 7 ++++++ baselines/ts5.6/dom.generated.d.ts | 7 ++++++ inputfiles/addedTypes.jsonc | 10 +++++++++ inputfiles/overridingTypes.jsonc | 13 +++++++++++ unittests/files/nodeValue.ts | 36 ++++++++++++++++++++++++------ 6 files changed, 73 insertions(+), 7 deletions(-) diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index e3e2aa222..2db623fea 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -8514,6 +8514,8 @@ interface Document extends Node, DocumentOrShadowRoot, FontFaceSource, GlobalEve * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/writeln) */ writeln(...text: string[]): void; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): null; addEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -8535,6 +8537,9 @@ declare var Document: { interface DocumentFragment extends Node, NonElementParentNode, ParentNode { readonly ownerDocument: Document; getElementById(elementId: string): HTMLElement | null; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var DocumentFragment: { @@ -8608,6 +8613,8 @@ interface DocumentType extends Node, ChildNode { readonly publicId: string; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DocumentType/systemId) */ readonly systemId: string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): null; } declare var DocumentType: { diff --git a/baselines/ts5.5/dom.generated.d.ts b/baselines/ts5.5/dom.generated.d.ts index 752d805cb..d877dcbdc 100644 --- a/baselines/ts5.5/dom.generated.d.ts +++ b/baselines/ts5.5/dom.generated.d.ts @@ -8507,6 +8507,8 @@ interface Document extends Node, DocumentOrShadowRoot, FontFaceSource, GlobalEve * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/writeln) */ writeln(...text: string[]): void; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): null; addEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -8528,6 +8530,9 @@ declare var Document: { interface DocumentFragment extends Node, NonElementParentNode, ParentNode { readonly ownerDocument: Document; getElementById(elementId: string): HTMLElement | null; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var DocumentFragment: { @@ -8601,6 +8606,8 @@ interface DocumentType extends Node, ChildNode { readonly publicId: string; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DocumentType/systemId) */ readonly systemId: string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): null; } declare var DocumentType: { diff --git a/baselines/ts5.6/dom.generated.d.ts b/baselines/ts5.6/dom.generated.d.ts index 0b4e51a03..9243a444a 100644 --- a/baselines/ts5.6/dom.generated.d.ts +++ b/baselines/ts5.6/dom.generated.d.ts @@ -8514,6 +8514,8 @@ interface Document extends Node, DocumentOrShadowRoot, FontFaceSource, GlobalEve * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/writeln) */ writeln(...text: string[]): void; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): null; addEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -8535,6 +8537,9 @@ declare var Document: { interface DocumentFragment extends Node, NonElementParentNode, ParentNode { readonly ownerDocument: Document; getElementById(elementId: string): HTMLElement | null; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): string; + set textContent(value: string | null); } declare var DocumentFragment: { @@ -8608,6 +8613,8 @@ interface DocumentType extends Node, ChildNode { readonly publicId: string; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DocumentType/systemId) */ readonly systemId: string; + /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) */ + get textContent(): null; } declare var DocumentType: { diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index 0a3718b0e..ddb79b34f 100644 --- a/inputfiles/addedTypes.jsonc +++ b/inputfiles/addedTypes.jsonc @@ -1289,6 +1289,16 @@ "type": "Document" } } + }, + "methods": { + "method": { + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): null" + ] + } + } } }, "ProcessingInstruction": { diff --git a/inputfiles/overridingTypes.jsonc b/inputfiles/overridingTypes.jsonc index d87d431f5..f7332d04d 100644 --- a/inputfiles/overridingTypes.jsonc +++ b/inputfiles/overridingTypes.jsonc @@ -831,6 +831,12 @@ "overrideType": "NodeListOf" } } + }, + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): null" + ] } } }, @@ -897,6 +903,13 @@ "overrideSignatures": [ "getElementById(elementId: string): HTMLElement | null" ] + }, + "textContent": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent", + "overrideSignatures": [ + "get textContent(): string", + "set textContent(value: string | null)" + ] } } }, diff --git a/unittests/files/nodeValue.ts b/unittests/files/nodeValue.ts index 1cc664ce3..908516c3d 100644 --- a/unittests/files/nodeValue.ts +++ b/unittests/files/nodeValue.ts @@ -11,16 +11,38 @@ type StrictEqual = ? true : false; -const div = document.createElement("div"); -assertType()(div.textContent)(); -div.textContent = null; +// string | null: +declare const element: Element; +assertType()(element.textContent)(); +element.textContent = null; -const text = document.createTextNode("hello"); +declare const characterData: CharacterData; +assertType()(characterData.textContent)(); +characterData.textContent = null; + +declare const text: Text; assertType()(text.textContent)(); +text.textContent = null; + +declare const comment: Comment; +assertType()(comment.textContent)(); +comment.textContent = null; + +declare const processingInstruction: ProcessingInstruction; +assertType()(processingInstruction.textContent)(); +processingInstruction.textContent = null; + +declare const documentFragment: DocumentFragment; +assertType()(documentFragment.textContent)(); + +declare const attr: Attr; +assertType()(attr.textContent)(); +attr.textContent = null; -assertType()(document.textContent)(); +// null: +assertType()(document.textContent)(); -const type = document.doctype!; -assertType()(type.textContent)(); +declare const documentType: DocumentType; +assertType()(documentType.textContent)(); export {}; From 47d94ebcbb0f59b17dd927d63b095f6164ada3fe Mon Sep 17 00:00:00 2001 From: Alex <8125011+alex-kinokon@users.noreply.github.com> Date: Fri, 30 May 2025 01:55:58 -0400 Subject: [PATCH 5/5] Rename file --- unittests/files/{nodeValue.ts => textContent.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename unittests/files/{nodeValue.ts => textContent.ts} (98%) diff --git a/unittests/files/nodeValue.ts b/unittests/files/textContent.ts similarity index 98% rename from unittests/files/nodeValue.ts rename to unittests/files/textContent.ts index 908516c3d..ad0ed1d79 100644 --- a/unittests/files/nodeValue.ts +++ b/unittests/files/textContent.ts @@ -11,7 +11,7 @@ type StrictEqual = ? true : false; -// string | null: +// string: declare const element: Element; assertType()(element.textContent)(); element.textContent = null;