19 lines
1.2 KiB
JavaScript
19 lines
1.2 KiB
JavaScript
import { readFileSync } from "node:fs";
|
|
import { createRequire } from "node:module";
|
|
const Q = process.argv[2];
|
|
const { JSDOM } = createRequire(`${Q}/h-jsdom/`)("jsdom");
|
|
const dom = new JSDOM('<!doctype html><div id="e"></div>', { runScripts: "outside-only", pretendToBeVisual: true });
|
|
dom.window.eval(readFileSync(process.argv[3], "utf8"));
|
|
const P = dom.window.__q154;
|
|
const doc = P.defaultMarkdownParser.parse("# Title\n\n- one\n- two\n\nsee [x](http://a.test) and `code`\n");
|
|
const view = new P.EditorView(dom.window.document.getElementById("e"), { state: P.EditorState.create({ doc, plugins: [P.history(), P.keymap(P.baseKeymap)] }) });
|
|
console.log("view html:", view.dom.innerHTML.replace(/\s+/g, " ").slice(0, 220));
|
|
console.log("serialised:", JSON.stringify(P.defaultMarkdownSerializer.serialize(view.state.doc)));
|
|
// paste-style parse: hostile HTML through the clipboard parser path
|
|
const hostile = '<p onclick="x()">hi<script>alert(1)</script><img src=x onerror="alert(2)"><a href="javascript:alert(3)">l</a></p>';
|
|
const slice = view.someProp ? null : null;
|
|
const { DOMParser } = dom.window;
|
|
const div = dom.window.document.implementation.createHTMLDocument("t").body; div.innerHTML = hostile;
|
|
const pm = P.Schema;
|
|
console.log("built bundle runs; ok");
|