// Load ES6 modules in Node.js on the fly require = require('esm')(module/* , options */) /* eslint-disable-line no-global-assign */ const path = require('path') const { expect } = require('chai') const { JSDOM } = require('jsdom') function ready(callback) { const state = document.readyState if (state === 'complete' || state === 'interactive') { return setTimeout(callback, 0) } document.addEventListener('DOMContentLoaded', callback) } module.exports.init = function (fixture = 'default', config = {}, markup = null) { if (markup === null || markup === undefined) { markup = `
` } const rootPath = path.join(__dirname, 'fixtures', fixture) const dom = new JSDOM(markup) dom.reconfigure({ url: 'file:///' + rootPath }) global.window = dom.window global.document = dom.window.document global.navigator = dom.window.navigator global.location = dom.window.location global.XMLHttpRequest = dom.window.XMLHttpRequest // Mimic src/core/index.js but for Node.js function Docsify() { this._init() } const proto = Docsify.prototype const { initMixin } = require('../src/core/init') const { routerMixin } = require('../src/core//router') const { renderMixin } = require('../src/core//render') const { fetchMixin } = require('../src/core/fetch') const { eventMixin } = require('../src/core//event') initMixin(proto) routerMixin(proto) renderMixin(proto) fetchMixin(proto) eventMixin(proto) const NOT_INIT_PATTERN = '' return new Promise(resolve => { ready(() => { const docsify = new Docsify() // NOTE: I was not able to get it working with a callback, but polling works usually at the first time const id = setInterval(() => { if (dom.window.document.body.innerHTML.indexOf(NOT_INIT_PATTERN) === -1) { clearInterval(id) return resolve({ docsify: docsify, dom: dom }) } }, 10) }) }) } module.exports.expectSameDom = function (actual, expected) { const WHITESPACES_BETWEEN_TAGS = />(\s\s+)