import { JSDOM, VirtualConsole, CookieJar, FromUrlOptions, FromFileOptions, DOMWindow, ResourceLoader, FetchOptions, ConstructorOptions } from 'jsdom'; import { CookieJar as ToughCookieJar, MemoryCookieStore } from 'tough-cookie'; import { Script } from 'vm'; function test_basic_usage() { const dom = new JSDOM(`

Hello world

`); console.log(dom.window.document.querySelector('p')!.textContent); // "Hello world" const { window } = new JSDOM(`...`); // or even const { document } = (new JSDOM(`...`)).window; } function test_executing_scripts1() { const dom = new JSDOM(` `); // The script will not be executed, by default: dom.window.document.body.children.length === 1; } function test_executing_scripts2() { const dom = new JSDOM(` `, { runScripts: 'dangerously' }); // The script will be executed and modify the DOM: dom.window.document.body.children.length === 2; } function test_executing_scripts3() { const window = (new JSDOM(``, { runScripts: 'outside-only' })).window; window.eval(`document.body.innerHTML = "

Hello, world!

";`); window.document.body.children.length === 1; } function test_virtualConsole() { const virtualConsole = new VirtualConsole(); const dom = new JSDOM(``, { virtualConsole }); virtualConsole.on('error', () => { }); virtualConsole.on('warn', () => { }); virtualConsole.on('info', () => { }); virtualConsole.on('dir', () => { }); // ... etc. See https://console.spec.whatwg.org/#logging virtualConsole.sendTo(console); const c = console; virtualConsole.sendTo(c, { omitJSDOMErrors: true }); } function test_cookieJar() { const store = {} as MemoryCookieStore; const options = {} as ToughCookieJar.Options; const cookieJar: CookieJar = new CookieJar(store, options); const constructorOptions: ConstructorOptions = { cookieJar }; const dom = new JSDOM(``, constructorOptions); } function test_beforeParse() { const dom = new JSDOM(`

Hello

`, { beforeParse(window) { window.document.childNodes.length === 0; } }); } function test_storageQuota() { new JSDOM('', { storageQuota: 1337 }); } function test_pretendToBeVisual() { new JSDOM('', { pretendToBeVisual: true }); } function test_serialize() { const dom = new JSDOM(`hello`); dom.serialize() === 'hello'; // Contrast with: // tslint:disable-next-line no-unnecessary-type-assertion dom.window.document.documentElement!.outerHTML === 'hello'; } function test_nodeLocation() { const dom = new JSDOM( `

Hello

`, { includeNodeLocations: true } ); const document = dom.window.document; const bodyEl = document.body; // implicitly created const pEl = document.querySelector('p')!; const textNode = pEl.firstChild!; const imgEl = document.querySelector('img')!; console.log(dom.nodeLocation(bodyEl)); // null; it's not in the source console.log(dom.nodeLocation(pEl)); // { startOffset: 0, endOffset: 39, startTag: ..., endTag: ... } console.log(dom.nodeLocation(textNode)); // { startOffset: 3, endOffset: 13 } console.log(dom.nodeLocation(imgEl)); // { startOffset: 13, endOffset: 32 } } function test_runVMScript() { const dom = new JSDOM(``, { runScripts: 'outside-only' }); const s = new Script(` if (!this.ran) { this.ran = 0; } ++this.ran; `); dom.runVMScript(s); dom.runVMScript(s); dom.runVMScript(s); (dom.window as any).ran === 3; } function test_reconfigure() { const myFakeTopForTesting = {} as DOMWindow; const dom = new JSDOM(); dom.window.top === dom.window; dom.window.location.href === 'about:blank'; dom.reconfigure({ windowTop: myFakeTopForTesting, url: 'https://example.com/' }); dom.window.top === myFakeTopForTesting; dom.window.location.href === 'https://example.com/'; } function test_fromURL() { const options = {} as FromUrlOptions; JSDOM.fromURL('https://example.com/', options).then(dom => { console.log(dom.serialize()); }); function pretendToBeVisual() { JSDOM.fromURL("https://github.com", { pretendToBeVisual: true }); } } function test_fromFile() { const options = {} as FromFileOptions; JSDOM.fromFile('stuff.html', options).then(dom => { console.log(dom.serialize()); }); } function test_fragment() { const frag = JSDOM.fragment(`

Hello

Hi!`); frag.childNodes.length === 2; frag.querySelector('strong')!.textContent = 'Why hello there!'; // etc. } function test_fragment_serialization() { const frag = JSDOM.fragment(`

Hello

`); if (frag instanceof Element) { if (frag.firstChild instanceof Element) { console.log(frag.firstChild.outerHTML); // logs "

Hello

" } } } function test_custom_resource_loader() { class CustomResourceLoader extends ResourceLoader { fetch(url: string, options: FetchOptions) { if (options.element) { console.log(`Element ${options.element.localName} is requesting the url ${url}`); } return super.fetch(url, options); } } new JSDOM('', { resources: new CustomResourceLoader() }); }