diff --git a/rangy/rangy-tests.ts b/rangy/rangy-tests.ts
new file mode 100644
index 000000000..b0c6c1cc2
--- /dev/null
+++ b/rangy/rangy-tests.ts
@@ -0,0 +1,95 @@
+///
+
+declare function assertAny(a:any):any;
+declare function assertBoolean(b:boolean):any;
+declare function assertString(s:string):any;
+declare function assertRangyRange(r:RangyRange):any;
+declare function getRangyRange():RangyRange;
+
+function testRangyStatic() {
+ rangy.addInitListener((rangy:RangyStatic) => {
+ });
+
+ rangy.createMissingNativeApi();
+ rangy.shim();
+
+ let nativeRange:Range|TextRange = rangy.createNativeRange(document);
+ nativeRange = rangy.createNativeRange(window);
+ nativeRange = rangy.createNativeRange(new HTMLIFrameElement);
+ nativeRange = rangy.createNativeRange();
+
+ let rangyRange:RangyRange = rangy.createRange(document);
+ rangyRange = rangy.createRange(window);
+ rangyRange = rangy.createRange(new HTMLIFrameElement);
+ rangyRange = rangy.createRange();
+
+ rangyRange = rangy.createRangyRange(document);
+ rangyRange = rangy.createRangyRange(window);
+ rangyRange = rangy.createRangyRange(new HTMLIFrameElement);
+ rangyRange = rangy.createRangyRange();
+
+ let nativeSelection:Selection = rangy.getNativeSelection(window);
+ nativeSelection = rangy.getNativeSelection();
+
+ let rangySelection:RangySelection = rangy.getSelection();
+
+ let initialized:boolean = rangy.initialized;
+ let supported:boolean = rangy.supported;
+}
+
+function testRangyRange() {
+ let rangyRange:RangyRange = rangy.createRange();
+
+ assertBoolean(rangyRange.canSurroundContents());
+ rangyRange.collapseAfter(new Node);
+ rangyRange.collapseBefore(new Node);
+ rangyRange.collapseToPoint(new Node, 23);
+ assertAny(rangyRange.compareNode(new Node));
+ assertBoolean(rangyRange.containsNode(new Node, true));
+ assertBoolean(rangyRange.containsNodeContents(new Node));
+ assertBoolean(rangyRange.containsNodeText(new Node));
+ assertBoolean(rangyRange.containsNodeText(new Node));
+ assertBoolean(rangyRange.containsRange(rangyRange));
+ assertBoolean(rangyRange.equals(rangyRange));
+ let bookmark:{start:number, end:number} = rangyRange.getBookmark();
+ bookmark = rangyRange.getBookmark(new Node);
+ let doc:Document = rangyRange.getDocument();
+ let nodes:Node[] = rangyRange.getNodes();
+ nodes = rangyRange.getNodes([new Node]);
+ nodes = rangyRange.getNodes([new Node], (node:Node) => true);
+ assertString(rangyRange.inspect());
+ assertRangyRange(rangyRange.intersection(rangyRange));
+ assertBoolean(rangyRange.intersectsOrTouchesRange(rangyRange));
+ assertBoolean(rangyRange.intersectsRange(rangyRange));
+ assertBoolean(rangyRange.isValid());
+ rangyRange.moveToBookmark({});
+ rangyRange.normalizeBoundaries();
+ rangyRange.refresh();
+ rangyRange.select();
+ rangyRange.setStartAndEnd(new Node, 23);
+ rangyRange.setStartAndEnd(new Node, 23, 42);
+ rangyRange.setStartAndEnd(new Node, 23, new Node, 42);
+ rangyRange.splitBoundaries();
+ assertString(rangyRange.toHtml());
+ assertRangyRange(rangyRange.union(rangyRange));
+}
+
+function testSelection() {
+ let selection:RangySelection = rangy.getSelection();
+
+ selection.detach();
+ let ranges:RangyRange[] = selection.getAllRanges();
+ selection.getBookmark(new Node);
+ let nativeTextRange:TextRange = selection.getNativeTextRange();
+ assertString(selection.inspect());
+ assertBoolean(selection.isBackwards());
+ selection.moveToBookmark({});
+ var nativeSelection:Selection = selection.nativeSelection;
+ selection.refresh();
+ selection.refresh(true);
+ selection.restoreRanges({});
+ var object:Object = selection.saveRanges();
+ selection.setRanges(ranges);
+ selection.setSingleRange(getRangyRange());
+ assertString(selection.toHtml());
+}
diff --git a/rangy/rangy.d.ts b/rangy/rangy.d.ts
new file mode 100644
index 000000000..16ce2a5a3
--- /dev/null
+++ b/rangy/rangy.d.ts
@@ -0,0 +1,66 @@
+// Type definitions for Rangy
+// Project: https://github.com/timdown/rangy
+// Definitions by: Rudolph Gottesheim
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+interface RangyRange extends Range {
+ setStartAndEnd(startNode:Node, startOffset:number, endNode?:Node, endOffset?:number):any;
+ setStartAndEnd(startNode:Node, startOffset:number, endOffset:number):any;
+ canSurroundContents():boolean;
+ isValid():boolean;
+ toHtml():string;
+ compareNode(node:Node):any;
+ intersectsOrTouchesRange(range:RangyRange):boolean;
+ intersectsRange(range:RangyRange):boolean;
+ intersection(range:RangyRange):RangyRange;
+ union(range:RangyRange):RangyRange;
+ containsNode(node:Node, partial:boolean):boolean;
+ containsNodeContents(node:Node):boolean;
+ containsNodeText(node:Node):boolean;
+ containsRange(range:RangyRange):boolean;
+ splitBoundaries():any;
+ normalizeBoundaries():any;
+ collapseToPoint(node:Node, offset:number):any;
+ collapseBefore(node:Node):any;
+ collapseAfter(node:Node):any;
+ getNodes(nodeTypes?:any[], filter?:(node:Node) => boolean):Node[];
+ getBookmark(containerNode?:Node):{start:number, end:number};
+ moveToBookmark(bookmark:Object):any;
+ getDocument():Document;
+ inspect():string;
+ equals(range:RangyRange):boolean;
+ refresh():any;
+ select():any;
+}
+
+interface RangySelection extends Selection {
+ nativeSelection:Selection;
+ isBackwards():boolean;
+ refresh(checkForChanges?:boolean):any;
+ toHtml():string;
+ getAllRanges():RangyRange[];
+ getNativeTextRange():TextRange;
+ setSingleRange(range:RangyRange):any;
+ setRanges(ranges:RangyRange[]):any;
+ getBookmark(containerNode:Node):any;
+ moveToBookmark(bookmark:Object):any;
+ saveRanges():Object;
+ restoreRanges(saved:Object):any;
+ detach():any;
+ inspect():string;
+}
+
+interface RangyStatic {
+ createNativeRange(doc?:Document|Window|HTMLIFrameElement):TextRange|Range;
+ createRange(doc?:Document|Window|HTMLIFrameElement):RangyRange;
+ createRangyRange(doc?:Document|Window|HTMLIFrameElement):RangyRange;
+ getNativeSelection(win?:Window):Selection;
+ getSelection():RangySelection;
+ addInitListener(listener:(rangy:RangyStatic) => void):any;
+ shim():any;
+ createMissingNativeApi():any;
+ initialized:boolean;
+ supported:boolean;
+}
+
+declare var rangy:RangyStatic;