{"version":3,"sources":["jsdelivr-header.js","/npm/percollate@4.3.0/index.js"],"names":[],"mappings":"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","file":"/npm/percollate@4.3.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/percollate@4.3.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import fs from 'node:fs';\nimport stream from 'node:stream';\nimport path from 'node:path';\nimport { randomUUID as uuid } from 'node:crypto';\nimport { fileURLToPath } from 'node:url';\n\nimport pup from 'puppeteer';\nimport archiver from 'archiver';\nimport fetch from 'node-fetch';\nimport { JSDOM } from 'jsdom';\nimport validateNames from 'jsdom/lib/jsdom/living/helpers/validate-names.js';\n\nimport nunjucks from 'nunjucks';\nimport css from 'css';\nimport MimeType from 'whatwg-mimetype';\n\n/*\n\tMarkdown functions\n*/\nimport { fromDom } from 'hast-util-from-dom';\nimport { toMdast } from 'hast-util-to-mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport { toMarkdown } from 'mdast-util-to-markdown';\nimport {\n\tAVAILABLE_MARKDOWN_OPTIONS,\n\tDEFAULT_MARKDOWN_OPTIONS\n} from './src/constants/markdown.js';\n\nimport slurp from './src/util/slurp.js';\nimport { lookupMimetype } from './src/util/file-mimetype.js';\nimport epubDate from './src/util/epub-date.js';\nimport humanDate from './src/util/human-date.js';\nimport outputPath from './src/util/output-path.js';\nimport getCssPageFormat from './src/util/get-css-page-format.js';\nimport { resolveSequence, resolveParallel } from './src/util/promises.js';\nimport addExif from './src/exif.js';\n\nimport { isURL } from './src/util/url.js';\nimport { isFeed, processFeed } from './src/feeds.js';\n\nimport get_style_attribute_value from './src/get-style-attribute-value.js';\n\nimport cleanupItem from './src/cleanup-item.js';\nimport wrapHTMLFragment from './src/util/wrap-html-fragment.js';\n\nconst out = process.stdout;\nconst err = process.stderr;\n\nconst { readFile, writeFile } = fs.promises;\n\nconst pkg = JSON.parse(\n\tfs.readFileSync(new URL('./package.json', import.meta.url))\n);\n\nlet UA = `percollate/${pkg.version}`;\n\nconst JUSTIFY_CSS = `\n\t.article__content p {\n\t\ttext-align: justify;\n\t}\n`;\n\n/*\n\tSome setup\n\t----------\n */\nlet configured = false;\nfunction configure() {\n\tif (!configured) {\n\t\tconst env = nunjucks.configure({\n\t\t\tautoescape: false,\n\t\t\tnoCache: true\n\t\t});\n\t\tenv.addFilter('humandate', humanDate);\n\t\tconfigured = true;\n\t}\n}\n\nfunction launch(options, size) {\n\t/*\n\t\tProduce tagged PDFs, better for accessibility;\n\t\tHopefully will also produce an Outline (ToC) eventually.\n\t\tSee: https://github.com/danburzo/percollate/issues/47\n\t */\n\tlet args = ['--export-tagged-pdf'];\n\n\t/*\n\t\tAllow running with no sandbox\n\t\tSee: https://github.com/danburzo/percollate/issues/26\n\t */\n\tif (options.sandbox === false) {\n\t\targs = args.concat(['--no-sandbox', '--disable-setuid-sandbox']);\n\t}\n\n\treturn pup.launch({\n\t\theadless: 'new',\n\t\tproduct: options.browser || 'chrome',\n\t\targs,\n\t\tdefaultViewport: {\n\t\t\t// Emulate retina display (@2x)...\n\t\t\tdeviceScaleFactor: 2,\n\t\t\t// ...but then we need to provide the other\n\t\t\t// viewport parameters as well\n\t\t\twidth: 1920,\n\t\t\theight: 1080,\n\t\t\t...size\n\t\t}\n\t});\n}\n\n/*\n\tFetch a web page and clean the HTML\n\t-----------------------------------\n */\n\nasync function fetchContent(ref, fetchOptions = {}) {\n\tif (ref instanceof stream.Readable) {\n\t\treturn {\n\t\t\tbuffer: await slurp(ref),\n\t\t\tcontentType: undefined\n\t\t};\n\t}\n\n\tlet url;\n\ttry {\n\t\turl = new URL(ref);\n\t} catch (err) {\n\t\t// no-op\n\t}\n\n\tif (!url) {\n\t\treturn {\n\t\t\tbuffer: await readFile(ref),\n\t\t\tcontentType: lookupMimetype(ref)\n\t\t};\n\t}\n\n\tif (url && url.protocol === 'file:') {\n\t\turl = decodeURI(url.href.replace(/^file:\\/\\//, ''));\n\t\treturn {\n\t\t\tbuffer: await readFile(url),\n\t\t\tcontentType: lookupMimetype(url)\n\t\t};\n\t}\n\n\t/*\n\t\tMust ensure that the URL is properly encoded.\n\t\tSee: https://github.com/danburzo/percollate/pull/83\n\t */\n\treturn fetch(url.href, {\n\t\t...fetchOptions,\n\t\theaders: {\n\t\t\t...fetchOptions.headers,\n\t\t\t'user-agent': UA\n\t\t}\n\t}).then(async response => {\n\t\tlet contentType = response.headers.get('Content-Type');\n\t\tlet mt = new MimeType(contentType);\n\n\t\tif (!mt.isHTML() && !mt.isXML()) {\n\t\t\tthrow new Error(\n\t\t\t\t`URL ${url.href} has unsupported content type: ${contentType}`\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: await response.arrayBuffer(),\n\t\t\tcontentType\n\t\t};\n\t});\n}\n\nasync function cleanup(url, options) {\n\tif (!url) {\n\t\treturn null;\n\t}\n\ttry {\n\t\terr.write(`Fetching: ${url}`);\n\n\t\tconst { buffer, contentType } = await fetchContent(\n\t\t\turl === '-' ? process.stdin : url,\n\t\t\toptions.fetch || {}\n\t\t);\n\n\t\terr.write(' ✓\\n');\n\n\t\tconst final_url =\n\t\t\toptions.preferred_url !== undefined\n\t\t\t\t? options.preferred_url\n\t\t\t\t: url === '-'\n\t\t\t\t? undefined\n\t\t\t\t: isURL(url)\n\t\t\t\t? url\n\t\t\t\t: 'file://' + path.resolve(url);\n\n\t\t/*\n\t\t\tDisable some validations in JSDOM to allow\n\t\t\tsome invalid HTML files to be processed correctly.\n\n\t\t\tCurrently done via monkey-patching. See:\n\t\t\thttps://github.com/danburzo/percollate/issues/177\n\t\t*/\n\t\tif (options.unsafe) {\n\t\t\t// make no-op\n\t\t\tvalidateNames.name = () => {};\n\t\t}\n\n\t\tconst dom = new JSDOM(buffer, {\n\t\t\tcontentType,\n\t\t\turl: final_url\n\t\t});\n\n\t\tconst doc = dom.window.document;\n\n\t\t// Stop-gap solution as some of these are still referenced in cleanupItem()\n\t\tconst ENV = {\n\t\t\terr,\n\t\t\tout,\n\t\t\tUA\n\t\t};\n\n\t\t/*\n\t\t\tIf the file is a valid RSS/Atom feed\n\t\t\textract the feed entries to be processed further.\n\t\t*/\n\n\t\tif (isFeed(doc)) {\n\t\t\tconst w = options.wait * 1000;\n\t\t\tconst entries = processFeed(doc);\n\t\t\treturn resolveSequence(\n\t\t\t\tentries,\n\t\t\t\tasync entry => {\n\t\t\t\t\tconst itemDOM = new JSDOM(wrapHTMLFragment(entry), {\n\t\t\t\t\t\turl: entry.url\n\t\t\t\t\t});\n\t\t\t\t\tentry.content = itemDOM.window.document.body;\n\t\t\t\t\tconst clean = await cleanupItem(\n\t\t\t\t\t\titemDOM,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tentry,\n\t\t\t\t\t\tENV\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...clean,\n\t\t\t\t\t\t// TODO\n\t\t\t\t\t\toriginalContent: {\n\t\t\t\t\t\t\tbuffer: null,\n\t\t\t\t\t\t\tcontentType: 'text/html'\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tNumber.isFinite(w) && w >= 0 ? w : 0\n\t\t\t);\n\t\t}\n\n\t\t/*\n\t\t\tUse the AMP version of the article \n\t\t\tif one is available and the user has not opted out.\n\t\t*/\n\t\tconst amp = doc.querySelector('link[rel~=amphtml]');\n\t\tif (amp && options.amp) {\n\t\t\terr.write('\\nFound AMP version (use `--no-amp` to ignore)\\n');\n\t\t\treturn cleanup(amp.href, options, amp.href);\n\t\t}\n\n\t\treturn {\n\t\t\t...(await cleanupItem(dom, options, null, ENV)),\n\t\t\t/* \n\t\t\t\tAugument for original content, useful when\n\t\t\t\tpercollate is used as an API.\n\t\t\t*/\n\t\t\toriginalContent: {\n\t\t\t\tbuffer,\n\t\t\t\tcontentType\n\t\t\t}\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(`${url}:`, error.message);\n\t\tthrow error;\n\t}\n}\n\n/*\n\tBundle the HTML files into a PDF\n\t--------------------------------\n */\nasync function bundlePdf(items, options) {\n\tconst DEFAULT_STYLESHEET = new URL(\n\t\t'templates/default.css',\n\t\timport.meta.url\n\t);\n\tconst DEFAULT_TEMPLATE = new URL('templates/default.html', import.meta.url);\n\n\tconst style =\n\t\t(await readFile(options.style || DEFAULT_STYLESHEET, 'utf8')) +\n\t\t(options.hyphenate === true ? JUSTIFY_CSS : '') +\n\t\t(options.css || '');\n\n\tconst title =\n\t\toptions.title || (items.length === 1 ? items[0].title : 'Untitled');\n\tconst author =\n\t\toptions.author || (items.length === 1 ? items[0].byline : undefined);\n\n\t// either explicit `--toc` or implicit ToC in the absence of `--no-toc`.\n\tconst use_toc =\n\t\toptions.toc ||\n\t\t((items.length > 1 || options['toc-level'] > 1) &&\n\t\t\toptions.toc !== false);\n\n\tconst html = nunjucks.renderString(\n\t\tawait readFile(options.template || DEFAULT_TEMPLATE, 'utf8'),\n\t\t{\n\t\t\tfiletype: 'pdf',\n\t\t\ttitle,\n\t\t\tauthor,\n\t\t\tdate: new Date(),\n\t\t\titems,\n\t\t\tstyle,\n\t\t\toptions: {\n\t\t\t\tuse_toc,\n\t\t\t\tuse_cover:\n\t\t\t\t\toptions.cover ||\n\t\t\t\t\t(options.cover !== false &&\n\t\t\t\t\t\t(options.title || items.length > 1))\n\t\t\t}\n\t\t}\n\t);\n\n\tconst doc = new JSDOM(html).window.document;\n\tconst headerTemplate = doc.querySelector('.header-template');\n\tconst footerTemplate = doc.querySelector('.footer-template');\n\tconst header = new JSDOM(\n\t\theaderTemplate ? headerTemplate.innerHTML : '<span></span>'\n\t).window.document;\n\tconst footer = new JSDOM(\n\t\tfooterTemplate ? footerTemplate.innerHTML : '<span></span>'\n\t).window.document;\n\n\tconst css_ast = css.parse(style);\n\n\tconst header_style = get_style_attribute_value(css_ast, '.header-template');\n\tconst header_div = header.querySelector('body :first-child');\n\n\tif (header_div && header_style) {\n\t\theader_div.setAttribute(\n\t\t\t'style',\n\t\t\t`\n\t\t\t\t${header_style};\n\t\t\t\t${header_div.getAttribute('style') || ''}\n\t\t\t`\n\t\t);\n\t}\n\n\tconst footer_style = get_style_attribute_value(css_ast, '.footer-template');\n\tconst footer_div = footer.querySelector('body :first-child');\n\n\tif (footer_div && footer_style) {\n\t\tfooter_div.setAttribute(\n\t\t\t'style',\n\t\t\t`\n\t\t\t\t${footer_style};\n\t\t\t\t${footer_div.getAttribute('style') || ''}\n\t\t\t`\n\t\t);\n\t}\n\n\tif (options.debug) {\n\t\terr.write('Generating temporary HTML file... ');\n\t\tconst temp_file = path.resolve(process.cwd(), `${uuid()}.html`);\n\t\tawait writeFile(temp_file, html);\n\t\terr.write('✓\\n');\n\t\terr.write(`Temporary HTML file: file://${temp_file}\\n`);\n\t}\n\n\tconst browser = await launch(options);\n\tconst page = await browser.newPage();\n\n\t/*\n\t\tIncrease the navigation timeout to 2 minutes\n\t\tSee: https://github.com/danburzo/percollate/issues/80\n\t */\n\tpage.setDefaultNavigationTimeout(120 * 1000);\n\n\tif (options.debug) {\n\t\tpage.on('response', response => {\n\t\t\terr.write(`Fetched: ${response.url()}\\n`);\n\t\t});\n\t}\n\n\tawait page.setContent(html, { waitUntil: 'load' });\n\n\tconst output_path = outputPath(items, options, '.pdf', options.slugCache);\n\n\tconst pdfOptions = {\n\t\tpreferCSSPageSize: true,\n\t\tdisplayHeaderFooter: options.browser !== 'firefox',\n\t\theaderTemplate: header.body.innerHTML,\n\t\tfooterTemplate: footer.body.innerHTML,\n\t\tprintBackground: true\n\t};\n\n\t/*\n\t\tCurrently, Firefox does not produce PDFs \n\t\twith the page format specified by the author \n\t\twith the `@page/size` CSS declaration.\n\n\t\tWe need to extract that value ourselves and produce\n\t\tthe appropriate Puppeteer config.\n\n\t\tOnce these tasks get done in Firefox,\n\t\tthe EXPLICIT_PAGE_SIZE_FROM_CSS code path can be removed:\n\n\t\thttps://bugzilla.mozilla.org/show_bug.cgi?id=1793220\n\t\thttps://bugzilla.mozilla.org/show_bug.cgi?id=1815565\n\t */\n\tconst EXPLICIT_PAGE_SIZE_FROM_CSS = options.browser === 'firefox';\n\n\tlet buffer = await page.pdf(\n\t\tEXPLICIT_PAGE_SIZE_FROM_CSS\n\t\t\t? {\n\t\t\t\t\t...pdfOptions,\n\t\t\t\t\t...getCssPageFormat(doc)\n\t\t\t  }\n\t\t\t: pdfOptions\n\t);\n\n\tawait browser.close();\n\n\tlet pdf = await addExif(buffer, {\n\t\tTitle: title,\n\t\tAuthor: author\n\t});\n\n\tawait writeFile(output_path, pdf);\n\n\terr.write(`Saved PDF: `);\n\tout.write(String(output_path));\n}\n\n/*\n\tBundle the HTML files into a EPUB\n\t---------------------------------\n */\nasync function bundleEpub(items, options) {\n\tconst DEFAULT_STYLESHEET = new URL(\n\t\t'templates/default.css',\n\t\timport.meta.url\n\t);\n\tconst style =\n\t\t(await readFile(options.style || DEFAULT_STYLESHEET, 'utf8')) +\n\t\t(options.hyphenate === true ? JUSTIFY_CSS : '') +\n\t\t(options.css || '');\n\n\terr.write('Saving EPUB...\\n');\n\n\tconst output_path = outputPath(items, options, '.epub', options.slugCache);\n\n\tconst title =\n\t\toptions.title || (items.length === 1 ? items[0].title : 'Untitled');\n\tconst author =\n\t\toptions.author || (items.length === 1 ? items[0].byline : undefined);\n\n\tawait epubgen(\n\t\t{\n\t\t\tfiletype: 'epub',\n\t\t\ttitle,\n\t\t\tauthor,\n\t\t\tdate: epubDate(new Date()),\n\t\t\tcover:\n\t\t\t\toptions.cover ||\n\t\t\t\t(options.cover !== false &&\n\t\t\t\t\t(options.title || items.length > 1)),\n\t\t\tuuid: uuid(),\n\t\t\titems,\n\t\t\tstyle\n\t\t},\n\t\toutput_path,\n\t\toptions\n\t);\n\n\terr.write(`Saved EPUB: `);\n\tout.write(String(output_path));\n}\n\n/*\n\tBundle the HTML files into a HTML\n\t---------------------------------\n */\nasync function bundleHtml(items, options) {\n\tconst DEFAULT_STYLESHEET = new URL(\n\t\t'templates/default.css',\n\t\timport.meta.url\n\t);\n\tconst DEFAULT_TEMPLATE = new URL('templates/default.html', import.meta.url);\n\n\tconst style =\n\t\t(await readFile(options.style || DEFAULT_STYLESHEET, 'utf8')) +\n\t\t(options.hyphenate === true ? JUSTIFY_CSS : '') +\n\t\t(options.css || '');\n\n\t// either explicit `--toc` or implicit ToC in the absence of `--no-toc`.\n\tconst use_toc =\n\t\toptions.toc ||\n\t\t((items.length > 1 || options['toc-level'] > 1) &&\n\t\t\toptions.toc !== false);\n\n\tconst html = nunjucks.renderString(\n\t\tawait readFile(options.template || DEFAULT_TEMPLATE, 'utf8'),\n\t\t{\n\t\t\tfiletype: 'html',\n\t\t\ttitle:\n\t\t\t\toptions.title ||\n\t\t\t\t(items.length === 1 ? items[0].title : 'Untitled'),\n\t\t\tdate: new Date(),\n\t\t\titems,\n\t\t\tstyle,\n\t\t\toptions: {\n\t\t\t\tuse_toc,\n\t\t\t\tuse_cover:\n\t\t\t\t\toptions.cover ||\n\t\t\t\t\t(options.cover !== false &&\n\t\t\t\t\t\t(options.title || items.length > 1))\n\t\t\t}\n\t\t}\n\t);\n\n\tif (options.output === '-') {\n\t\tout.write(html);\n\t\treturn;\n\t}\n\n\terr.write('Saving HTML...\\n');\n\tconst output_path = outputPath(items, options, '.html', options.slugCache);\n\tawait writeFile(output_path, html);\n\terr.write(`Saved HTML: `);\n\tout.write(String(output_path));\n}\n\n/*\n\tBundle the HTML files into a Markdown\n\t-------------------------------------\n*/\n\nasync function bundleMd(items, options) {\n\tconst DEFAULT_STYLESHEET = new URL(\n\t\t'templates/default.css',\n\t\timport.meta.url\n\t);\n\tconst DEFAULT_TEMPLATE = new URL('templates/default.html', import.meta.url);\n\n\tconst style =\n\t\t(await readFile(options.style || DEFAULT_STYLESHEET, 'utf8')) +\n\t\t(options.hyphenate === true ? JUSTIFY_CSS : '') +\n\t\t(options.css || '');\n\n\t// either explicit `--toc` or implicit ToC in the absence of `--no-toc`.\n\tconst use_toc =\n\t\toptions.toc ||\n\t\t((items.length > 1 || options['toc-level'] > 1) &&\n\t\t\toptions.toc !== false);\n\n\tconst html = nunjucks.renderString(\n\t\tawait readFile(options.template || DEFAULT_TEMPLATE, 'utf8'),\n\t\t{\n\t\t\tfiletype: 'html',\n\t\t\ttitle:\n\t\t\t\toptions.title ||\n\t\t\t\t(items.length === 1 ? items[0].title : 'Untitled'),\n\t\t\tdate: new Date(),\n\t\t\titems,\n\t\t\tstyle,\n\t\t\toptions: {\n\t\t\t\tuse_toc,\n\t\t\t\tuse_cover:\n\t\t\t\t\toptions.cover ||\n\t\t\t\t\t(options.cover !== false &&\n\t\t\t\t\t\t(options.title || items.length > 1))\n\t\t\t}\n\t\t}\n\t);\n\n\tconst md = toMarkdown(toMdast(fromDom(new JSDOM(html).window.document)), {\n\t\t...DEFAULT_MARKDOWN_OPTIONS,\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(options.markdownOptions).filter(entry =>\n\t\t\t\tAVAILABLE_MARKDOWN_OPTIONS.has(entry[0])\n\t\t\t)\n\t\t),\n\t\textensions: [gfmToMarkdown()]\n\t});\n\n\tif (options.output === '-') {\n\t\tout.write(md);\n\t\treturn;\n\t}\n\n\terr.write('Saving MD...\\n');\n\tconst output_path = outputPath(items, options, '.md', options.slugCache);\n\tawait writeFile(output_path, md);\n\terr.write(`Saved MD: `);\n\tout.write(String(output_path));\n}\n\nasync function generate(fn, urls, options = {}) {\n\tif (!configured) {\n\t\tconfigure();\n\t}\n\tif (!urls.length) {\n\t\treturn null;\n\t}\n\tlet w = options.wait * 1000;\n\tif (options.debug && w) {\n\t\tif (Number.isFinite(w) && w >= 0) {\n\t\t\terr.write(\n\t\t\t\t`Processing URLs sequentially, waiting ${options.wait} seconds in-between.\\n`\n\t\t\t);\n\t\t} else {\n\t\t\terr.write(\n\t\t\t\t`Invalid --wait: expecting positive number, got ${options.wait}. Processing URLs in parallel.\\n`\n\t\t\t);\n\t\t}\n\t}\n\tlet resolve =\n\t\tNumber.isFinite(w) && w >= 0 ? resolveSequence : resolveParallel;\n\tlet items = (\n\t\tawait resolve(\n\t\t\turls,\n\t\t\t(url, i) => {\n\t\t\t\treturn cleanup(url, {\n\t\t\t\t\t...options,\n\t\t\t\t\tpreferred_url: options.url ? options.url[i] : undefined\n\t\t\t\t}).catch(err => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\tconsole.error('Ignoring item');\n\t\t\t\t\treturn null;\n\t\t\t\t});\n\t\t\t},\n\t\t\tw\n\t\t)\n\t)\n\t\t.filter(it => it)\n\t\t.flat();\n\n\tif (options.individual) {\n\t\tawait Promise.all(items.map(item => fn([item], options)));\n\t} else {\n\t\tawait fn(items, options);\n\t}\n\treturn {\n\t\titems,\n\t\toptions\n\t};\n}\n\n/*\n\tGenerate PDF\n */\nasync function pdf(urls, options) {\n\treturn await generate(bundlePdf, urls, {\n\t\t...options,\n\t\t// Hyphenate by default\n\t\thyphenate: options.hyphenate !== undefined ? options.hyphenate : true,\n\t\tslugCache: {}\n\t});\n}\n\n/*\n\tGenerate EPUB\n */\nasync function epub(urls, options) {\n\treturn await generate(bundleEpub, urls, {\n\t\t...options,\n\t\txhtml: true,\n\t\tmapRemoteResources: !options.inline,\n\t\thyphenate: options.hyphenate !== undefined ? options.hyphenate : false,\n\t\tslugCache: {}\n\t});\n}\n\n/*\n\tGenerate HTML\n */\nasync function html(urls, options) {\n\treturn await generate(bundleHtml, urls, {\n\t\t...options,\n\t\thyphenate: options.hyphenate !== undefined ? options.hyphenate : false,\n\t\tslugCache: {}\n\t});\n}\n\n/*\n\tGenerate Markdown\n */\nasync function md(urls, options) {\n\treturn await generate(bundleMd, urls, {\n\t\t...options,\n\t\thyphenate: options.hyphenate !== undefined ? options.hyphenate : false,\n\t\tslugCache: {}\n\t});\n}\n\n/*\n\tProduce an EPUB file\n\t--------------------\n\n\tReference: \n\n\t\thttps://www.ibm.com/developerworks/xml/tutorials/x-epubtut/index.html\n */\n\nasync function epubgen(data, output_path, options) {\n\tconst wrapAsync = inner => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tinner(resolve, reject).catch(reject);\n\t\t});\n\t};\n\n\treturn wrapAsync(async (resolve, reject) => {\n\t\tconst template_base = fileURLToPath(\n\t\t\tnew URL('templates/epub/', import.meta.url)\n\t\t);\n\n\t\tconst output = fs.createWriteStream(output_path);\n\t\tconst archive = archiver('zip', {\n\t\t\tzlib: {\n\t\t\t\t// Best DEFLATE compression level\n\t\t\t\tlevel: 9\n\t\t\t}\n\t\t});\n\n\t\toutput\n\t\t\t.on('finish', () => {\n\t\t\t\terr.write(`${archive.pointer()} total bytes, archive closed\\n`);\n\t\t\t\tresolve();\n\t\t\t})\n\t\t\t.on('error', reject);\n\n\t\tarchive.on('warning', reject).on('error', reject).pipe(output);\n\n\t\t// mimetype file must be first\n\t\tarchive.append('application/epub+zip', {\n\t\t\tname: 'mimetype',\n\t\t\t// don’t compress the mimetype file as per EPUB spec\n\t\t\tstore: true\n\t\t});\n\n\t\t// static files from META-INF\n\t\tarchive.directory(path.join(template_base, 'META-INF'), 'META-INF');\n\n\t\tconst contentTemplate = await readFile(\n\t\t\tpath.join(template_base, 'OEBPS/content.xhtml'),\n\t\t\t'utf8'\n\t\t);\n\t\tconst navTemplate = await readFile(\n\t\t\tpath.join(template_base, 'OEBPS/nav.xhtml'),\n\t\t\t'utf8'\n\t\t);\n\t\tconst tocTemplate = await readFile(\n\t\t\tpath.join(template_base, 'OEBPS/toc.ncx'),\n\t\t\t'utf8'\n\t\t);\n\t\tconst opfTemplate = await readFile(\n\t\t\tpath.join(template_base, 'OEBPS/content.opf'),\n\t\t\t'utf8'\n\t\t);\n\n\t\tarchive.append(data.style || '', { name: 'OEBPS/style.css' });\n\n\t\tlet remoteResources = [];\n\t\tdata.items.forEach(item => {\n\t\t\tremoteResources = remoteResources.concat(\n\t\t\t\titem.remoteResources || []\n\t\t\t);\n\t\t\tlet item_content = nunjucks.renderString(contentTemplate, {\n\t\t\t\t...data,\n\t\t\t\titem\n\t\t\t});\n\t\t\tarchive.append(item_content, { name: `OEBPS/${item.id}.xhtml` });\n\t\t});\n\n\t\tfor (let i = 0; i < remoteResources.length; i++) {\n\t\t\tlet entry = remoteResources[i];\n\t\t\ttry {\n\t\t\t\tif (options.debug) {\n\t\t\t\t\terr.write(`Fetching: ${entry.original}\\n`);\n\t\t\t\t}\n\t\t\t\tlet stream = (\n\t\t\t\t\tawait fetch(entry.original, {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'user-agent': UA\n\t\t\t\t\t\t},\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tSend the referrer as the browser would \n\t\t\t\t\t\t\twhen fetching the image to render it.\n\t\t\t\t\t\t*/\n\t\t\t\t\t\treferrer: entry.origin,\n\t\t\t\t\t\treferrerPolicy: 'strict-origin-when-cross-origin',\n\t\t\t\t\t\ttimeout: 10 * 1000\n\t\t\t\t\t})\n\t\t\t\t).body;\n\t\t\t\tarchive.append(stream, { name: `OEBPS/${entry.mapped}` });\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(err);\n\t\t\t}\n\t\t}\n\n\t\tconst assets = [\n\t\t\t{\n\t\t\t\tid: 'style',\n\t\t\t\thref: 'style.css',\n\t\t\t\tmimetype: 'text/css'\n\t\t\t}\n\t\t];\n\n\t\tif (data.cover) {\n\t\t\tconst COVER_TEMPLATE = new URL(\n\t\t\t\t'templates/cover.html',\n\t\t\t\timport.meta.url\n\t\t\t);\n\t\t\tconst cover_html = nunjucks.renderString(\n\t\t\t\tawait readFile(COVER_TEMPLATE, 'utf8'),\n\t\t\t\tdata\n\t\t\t);\n\n\t\t\tconst browser = await launch(options, {\n\t\t\t\twidth: 400,\n\t\t\t\theight: 565\n\t\t\t});\n\t\t\tconst page = await browser.newPage();\n\n\t\t\tawait page.setUserAgent(UA);\n\t\t\tawait page.setContent(cover_html, { waitUntil: 'load' });\n\n\t\t\tlet buff = await page.screenshot({\n\t\t\t\ttype: 'png',\n\t\t\t\tfullPage: true\n\t\t\t});\n\n\t\t\tarchive.append(buff, { name: 'OEBPS/cover.png' });\n\n\t\t\tawait browser.close();\n\t\t}\n\n\t\tconst nav = nunjucks.renderString(navTemplate, data);\n\t\tconst opf = nunjucks.renderString(opfTemplate, {\n\t\t\t...data,\n\t\t\tassets,\n\t\t\tcover: data.cover\n\t\t\t\t? {\n\t\t\t\t\t\tid: 'cover',\n\t\t\t\t\t\thref: 'cover.png',\n\t\t\t\t\t\tmimetype: 'image/png'\n\t\t\t\t  }\n\t\t\t\t: undefined,\n\t\t\tremoteResources: remoteResources.map(entry => ({\n\t\t\t\tid: entry.mapped.replace(/[^a-z0-9]/gi, ''),\n\t\t\t\thref: entry.mapped,\n\t\t\t\tmimetype: entry.mimetype\n\t\t\t}))\n\t\t});\n\n\t\tconst toc = nunjucks.renderString(tocTemplate, data);\n\n\t\tarchive.append(nav, { name: 'OEBPS/nav.xhtml' });\n\t\tarchive.append(opf, { name: 'OEBPS/content.opf' });\n\t\tarchive.append(toc, { name: 'OEBPS/toc.ncx' });\n\n\t\tarchive.finalize();\n\t});\n}\n\nexport { configure, pdf, epub, html, md };\n\nexport const __test__ = {\n\tfetchContent\n};\n"]}