import { parse, parseFragment, serialize } from 'parse5'; import * as fs from 'fs'; import * as path from 'path'; import { Node } from './node'; function resolveSrc(urlString: string, options: any) { if (urlString.indexOf('http://') === 0 || urlString.indexOf('https://') === 0) return urlString; else urlString return path.resolve(path.join(path.resolve(options.entry.path), urlString)); } function __NodeHandler(node: any, options: any) { node = Node(node); switch (node.tagName) { case "script": if (node.getAttribute("src")) { if (options.devMode == true) node.setAttribute("data-prewrite-src", node.getAttribute("src")); var _resolved = fs.readFileSync(resolveSrc(node.getAttribute("src"), options), "utf-8"); node.attrs = [{ name: "type", value: node.getAttribute("type") || "text/javascript" }]; node.childNodes = [ { nodeName: "#text", value: _resolved, parentNode: node } ] } case "link": if (node.getAttribute("rel") == "stylesheet") { if (options.devMode == true) node.setAttribute("data-prewrite-href", node.getAttribute("href")); var _resolved = fs.readFileSync(resolveSrc(node.getAttribute("href"), options), "utf-8"); node = parseFragment(``).childNodes[0]; } } if (node.childNodes) { for (let i = 0; i < node.childNodes.length; i++) { node.childNodes[i] = __NodeHandler(node.childNodes[i], options); } } return node; } function compile(options: any) { var entryFile = path.resolve(options.entry.path + options.entry.file); var entry = fs.readFileSync(entryFile, "utf-8"); var parsed = parse(entry); for (let i = 0; i < parsed.childNodes.length; i++) { parsed.childNodes[i] = __NodeHandler(parsed.childNodes[i], options); } fs.writeFileSync(path.resolve(options.output), serialize(parsed)); } export default function CompileSourceInterface(options: any) { var entryFile = path.resolve(options.entry.path + options.entry.file); const __watchFile = (callback: any) => { fs.watchFile(entryFile, () => { compile(options); callback(); }); } compile(options); return { watch: __watchFile } }