Skip to content

Commit 8716ebb

Browse files
committed
Add interface checks for lib.dom.d.ts
Check that a `lib.dom.d.ts` Document can be cast as SimpleDocument and that it is implicitly a SerializableNode
1 parent 7d5a0a7 commit 8716ebb

6 files changed

Lines changed: 56 additions & 16 deletions

File tree

check-types/index.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { SimpleNode, SimpleDocument, SimpleElement, SimpleText, SimpleComment, SimpleDocumentFragment, SerializableNode, SerializableElement } from '@simple-dom/interface';
2+
3+
export class CheckSimple {
4+
createHTMLDocument(): SimpleDocument {
5+
return document.implementation.createHTMLDocument('foo') as SimpleDocument;
6+
}
7+
8+
createElement(tagName: string): SimpleElement {
9+
return document.createElement(tagName) as SimpleElement;
10+
}
11+
12+
createText(text: string): SimpleText {
13+
return document.createTextNode(text) as SimpleText;
14+
}
15+
16+
createComment(text: string): SimpleComment {
17+
return document.createComment(text) as SimpleComment;
18+
}
19+
20+
createDocumentFragment(text: string): SimpleDocumentFragment {
21+
return document.createDocumentFragment() as SimpleDocumentFragment;
22+
}
23+
}
24+
25+
export class CheckSerializable {
26+
createHTMLDocument(): SerializableNode {
27+
return document.implementation.createHTMLDocument('foo');
28+
}
29+
30+
createElement(tagName: string): SerializableElement {
31+
return document.createElement(tagName);
32+
}
33+
}

check-types/tsconfig.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"compilerOptions": {
3+
"strict": true,
4+
"noEmit": true,
5+
"moduleResolution": "node",
6+
"module": "es2015",
7+
"target": "es2017",
8+
"declaration": true
9+
},
10+
"files": [
11+
"index.ts"
12+
]
13+
}

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
"build": "ember build",
66
"lint": "tslint -p tsconfig.json",
77
"prepare": "ember build --environment=production",
8-
"test": "yarn run test:browser && yarn run test:node",
8+
"test": "yarn run test:browser && yarn run test:node && yarn run test:types",
99
"test:browser": "ember test",
10-
"test:node": "nyc --check-coverage -- qunit packages/@simple-dom/*/dist/test/commonjs/index.js packages/simple-dom/dist/test/commonjs/index.js"
10+
"test:node": "nyc --check-coverage -- qunit packages/@simple-dom/*/dist/test/commonjs/index.js packages/simple-dom/dist/test/commonjs/index.js",
11+
"test:types": "tsc -p check-types/tsconfig.json"
1112
},
1213
"devDependencies": {
1314
"@types/qunit": "^2.0.31",

packages/@simple-dom/document/src/document.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
import SimpleNodeImpl from './node';
77

88
export function createHTMLDocument(): SimpleDocument {
9-
const document = new SimpleNodeImpl(null, NodeType.DOCUMENT_NODE, '#document', null, Namespace.HTML);
9+
// dom.d.ts types ownerDocument as Document but for a document ownerDocument is null
10+
const document = new SimpleNodeImpl(null as any, NodeType.DOCUMENT_NODE, '#document', null, Namespace.HTML);
1011
const doctype = new SimpleNodeImpl(document, NodeType.DOCUMENT_TYPE_NODE, 'html', null, Namespace.HTML);
1112
const html = new SimpleNodeImpl(document, NodeType.ELEMENT_NODE, 'HTML', null, Namespace.HTML);
1213
const head = new SimpleNodeImpl(document, NodeType.ELEMENT_NODE, 'HEAD', null, Namespace.HTML);

packages/@simple-dom/document/src/node.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@ import {
3232
parseQualifiedName,
3333
} from './qualified-name';
3434

35-
export type SimpleElementImpl = SimpleNodeImpl<NodeType.ELEMENT_NODE, SimpleDocument, null, ElementNamespace>;
36-
export type SimpleDocumentImpl = SimpleNodeImpl<NodeType.DOCUMENT_NODE, null, null, Namespace.HTML>;
35+
export type SimpleElementImpl = SimpleNodeImpl<NodeType.ELEMENT_NODE, null, ElementNamespace>;
36+
export type SimpleDocumentImpl = SimpleNodeImpl<NodeType.DOCUMENT_NODE, null, Namespace.HTML>;
3737

3838
export default class SimpleNodeImpl<
3939
T extends NodeType,
40-
O extends SimpleDocument | null,
4140
V extends string | null,
4241
N extends ElementNamespace | undefined
4342
> {
@@ -55,7 +54,7 @@ export default class SimpleNodeImpl<
5554
public _childNodes: ChildNodes | undefined = undefined;
5655

5756
constructor(
58-
public readonly ownerDocument: O,
57+
public readonly ownerDocument: SimpleDocument,
5958
public readonly nodeType: T,
6059
public readonly nodeName: string,
6160
public nodeValue: V,

packages/@simple-dom/interface/index.d.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export type SimpleNode =
4747
SimpleDocumentFragment;
4848

4949
export interface SimpleNodeBase {
50-
readonly ownerDocument: SimpleDocument | null;
50+
readonly ownerDocument: SimpleDocument;
5151
readonly nodeType: NodeType;
5252
readonly nodeName: string;
5353

@@ -89,7 +89,6 @@ export interface SimpleAttrs {
8989
}
9090

9191
export interface SimpleElement extends SimpleNodeBase {
92-
readonly ownerDocument: SimpleDocument;
9392
readonly nodeType: NodeType.ELEMENT_NODE;
9493
readonly nodeValue: null;
9594

@@ -110,19 +109,16 @@ export interface SimpleElement extends SimpleNodeBase {
110109
}
111110

112111
export interface SimpleDocumentType extends SimpleNodeBase {
113-
readonly ownerDocument: SimpleDocument;
114112
readonly nodeType: NodeType.DOCUMENT_TYPE_NODE;
115113
readonly nodeValue: null;
116114
}
117115

118116
export interface SimpleDocumentFragment extends SimpleNodeBase {
119-
readonly ownerDocument: SimpleDocument;
120117
readonly nodeType: NodeType.DOCUMENT_FRAGMENT_NODE;
121118
readonly nodeValue: null;
122119
}
123120

124121
export interface SimpleDocument extends SimpleNodeBase {
125-
readonly ownerDocument: null;
126122
readonly nodeType: NodeType.DOCUMENT_NODE;
127123
readonly nodeValue: null;
128124

@@ -146,19 +142,16 @@ export interface SimpleDocument extends SimpleNodeBase {
146142
}
147143

148144
export interface SimpleRawHTMLSection extends SimpleNodeBase {
149-
readonly ownerDocument: SimpleDocument;
150145
readonly nodeType: NodeType.RAW_NODE;
151146
readonly nodeValue: string;
152147
}
153148

154149
export interface SimpleText extends SimpleNodeBase {
155-
readonly ownerDocument: SimpleDocument;
156150
readonly nodeType: NodeType.TEXT_NODE;
157151
readonly nodeValue: string;
158152
}
159153

160154
export interface SimpleComment extends SimpleNodeBase {
161-
readonly ownerDocument: SimpleDocument;
162155
readonly nodeType: NodeType.COMMENT_NODE;
163156
readonly nodeValue: string;
164157
}
@@ -196,6 +189,6 @@ export interface SerializableAttr {
196189
}
197190

198191
export interface SerializableElement extends SerializableNode {
199-
readonly namespaceURI: string;
192+
readonly namespaceURI: string | null;
200193
readonly attributes: SerializableAttrs;
201194
}

0 commit comments

Comments
 (0)