diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..5b5dec4 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,57 @@ +import { CookieJar } from 'cookiejar'; +import { Response as FetchResponse } from 'node-fetch-commonjs'; + +declare global { + interface Window { + prototype: Window; + } + interface Document { + prototype: Document; + } + interface MutationObserver { + prototype: Document; + new(callback: MutationCallback): MutationObserver; + } +} + +export class BrowserTab { + /** Cheerio context */ + get $(): cheerio.Cheerio; + get jar(): CookieJar; + get response(): FetchResponse; + window: Window; + document: Document; + navigateTo(uri: string, headers?: Record, statusCode?: number): Promise; + load(markup: string): BrowserTab; + focusIframe(element: HTMLElement, src: string): Promise; + runScript(script: HTMLElement): void; + runScripts(context?: Node): void; + mutated(targetNode: Node, config?: { childList?: boolean, attributes?: boolean }): Promise; +} + +export class WebPage { + navigateTo(uri: string, headers?: Record, statusCode?: number): Promise; + load(markup: string): BrowserTab; + submit(uri: string, options?: Record): Promise; + fetch(uri: string, requestOptions?: Record): Promise; +} + +export class Browser { + constructor(origin: any, options?: Record); + constructor(options?: Record); + navigateTo(uri: string, headers?: Record, statusCode?: number): Promise; + load(markup: string): WebPage; +} + +interface DOMInterface { + Document: Document; + HTMLCollection: HTMLCollection; + IntersectionObserver: IntersectionObserver; + MutationObserver: MutationObserver; + Window: Window; + Storage: Storage; +} + +export const DOM: DOMInterface; + +export default Browser; diff --git a/index.js b/index.js index ec50a4b..05b4c67 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,8 @@ const { CookieJar, Cookie } = require("cookiejar"); const { normalizeHeaders } = require("./lib/getHeaders.js"); const WebPage = require("./lib/WebPage.js"); +const BrowserTab = require("./lib/BrowserTab.js"); +const DOM = require("./lib/index.js"); const kOrigin = Symbol.for("origin"); @@ -54,3 +56,7 @@ module.exports = class Tallahassee { return new WebPage(this[kOrigin], this.jar, requestHeaders, this.options); } }; + +module.exports.WebPage = WebPage; +module.exports.BrowserTab = BrowserTab; +module.exports.DOM = { ...DOM }; diff --git a/lib/index.js b/lib/index.js index 332b75f..72211c5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -8,10 +8,10 @@ const Window = require("./Window.js"); const HTMLCollection = require("./HTMLCollection.js"); module.exports = { + Window, Document, + Storage, HTMLCollection, IntersectionObserver, MutationObserver, - Window, - Storage, }; diff --git a/package.json b/package.json index 777f782..20b4dd5 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Lightweight client testing framework", "main": "index.js", "license": "BSD-3-Clause", + "types": "index.d.ts", "scripts": { "test": "mocha", "posttest": "eslint . --cache && npm run test-md && npm run toc", @@ -45,7 +46,8 @@ }, "files": [ "lib/", - "index.js" + "index.js", + "index.d.ts" ], "bugs": { "url": "https://github.com/BonnierNews/tallahassee/issues" diff --git a/test/index.js b/test/index.js index d27ef47..9ee2c1e 100644 --- a/test/index.js +++ b/test/index.js @@ -6,6 +6,14 @@ const Script = require("@bonniernews/wichita"); const { app } = require("../app/app.js"); const Browser = require("../index.js"); +const BrowserTab = require("../lib/BrowserTab.js"); +const WebPage = require("../lib/WebPage.js"); +const Window = require("../lib/Window.js"); +const Document = require("../lib/Document.js"); +const Storage = require("../lib/Storage"); +const MutationObserver = require("../lib/MutationObserver.js"); +const IntersectionObserver = require("../lib/IntersectionObserver.js"); +const HTMLCollection = require("../lib/HTMLCollection"); describe("Tallahassee", () => { describe("navigateTo()", () => { @@ -392,4 +400,18 @@ describe("Tallahassee", () => { expect(browser.document.getElementsByTagName("h1")[0].textContent).to.equal("Apocalyptic"); }); }); + + describe("exports", () => { + it("expected interface", () => { + expect(Browser.BrowserTab).to.equal(BrowserTab); + expect(Browser.WebPage).to.equal(WebPage); + expect(Browser.DOM, "DOM").to.be.an("object"); + expect(Browser.DOM.Window).to.equal(Window); + expect(Browser.DOM.Document).to.equal(Document); + expect(Browser.DOM.Storage).to.equal(Storage); + expect(Browser.DOM.HTMLCollection).to.equal(HTMLCollection); + expect(Browser.DOM.IntersectionObserver).to.equal(IntersectionObserver); + expect(Browser.DOM.MutationObserver).to.equal(MutationObserver); + }); + }); });