UNPKG

18.8 kBSource Map (JSON)View Raw
1{"version":3,"file":"hdb.modern.js","sources":["../src/lib/plugin/hdb.js"],"sourcesContent":["\n/**\n * @param {HyperscriptObject} _hyperscript\n */\nexport default _hyperscript => {\n\tfunction HDB(ctx, runtime, breakpoint) {\n\t\tthis.ctx = ctx;\n\t\tthis.runtime = runtime;\n\t\tthis.cmd = breakpoint;\n\t\tthis._hyperscript = _hyperscript;\n\n\t\tthis.cmdMap = [];\n\n\t\tthis.bus = new EventTarget();\n\t} // See below for methods\n\n\t_hyperscript.addCommand(\"breakpoint\", function (parser, runtime, tokens) {\n\t\tif (!tokens.matchToken(\"breakpoint\")) return;\n\n\t\tvar hdb;\n\n\t\treturn {\n\t\t\top: function (ctx) {\n\t\t\t\tglobalThis.hdb = hdb = new HDB(ctx, runtime, this);\n\t\t\t\ttry {\n\t\t\t\t\treturn hdb.break(ctx);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e, e.stack);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t});\n\tHDB.prototype.break = function(ctx) {\n\t\tconsole.log(\"=== HDB///_hyperscript/debugger ===\");\n\t\tthis.ui();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.bus.addEventListener(\n\t\t\t\t\"continue\",\n\t\t\t\t() => {\n\t\t\t\t\tif (this.ctx !== ctx) {\n\t\t\t\t\t\t// Context switch\n\t\t\t\t\t\tfor (var attr in ctx) {\n\t\t\t\t\t\t\tdelete ctx[attr];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tObject.assign(ctx, this.ctx);\n\t\t\t\t\t}\n\t\t\t\t\tdelete window['hdb'];\n\t\t\t\t\tresolve(this.runtime.findNext(this.cmd, this.ctx));\n\t\t\t\t},\n\t\t\t\t{ once: true }\n\t\t\t);\n\t\t});\n\t};\n\n\tHDB.prototype.continueExec = function () {\n\t\tthis.bus.dispatchEvent(new Event(\"continue\"));\n\t};\n\n\tHDB.prototype.stepOver = function () {\n\t\tif (!this.cmd) return this.continueExec();\n\t\tvar result =\n\t\t\tthis.cmd && this.cmd.type === \"breakpointCommand\"\n\t\t\t\t? this.runtime.findNext(this.cmd, this.ctx)\n\t\t\t\t: this.runtime.unifiedEval(this.cmd, this.ctx);\n\t\tif (result.type === \"implicitReturn\") return this.stepOut();\n\t\tif (result && result.then instanceof Function) {\n\t\t\treturn result.then(next => {\n\t\t\t\tthis.cmd = next;\n\t\t\t\tthis.bus.dispatchEvent(new Event(\"step\"));\n\t\t\t\tthis.logCommand();\n\t\t\t});\n\t\t} else if (result.halt_flag) {\n\t\t\tthis.bus.dispatchEvent(new Event(\"continue\"));\n\t\t} else {\n\t\t\tthis.cmd = result;\n\t\t\tthis.bus.dispatchEvent(new Event(\"step\"));\n\t\t\tthis.logCommand();\n\t\t}\n\t};\n\n\tHDB.prototype.stepOut = function () {\n\t\tif (!this.ctx.meta.caller) return this.continueExec();\n\t\tvar callingCmd = this.ctx.meta.callingCommand;\n\t\tvar oldMe = this.ctx.me;\n\t\tthis.ctx = this.ctx.meta.caller;\n\t\tconsole.log(\n\t\t\t\"[hdb] stepping out into \" + this.ctx.meta.feature.displayName)\n\t\tif (this.ctx.me instanceof Element && this.ctx.me !== oldMe) {\n\t\t\tconsole.log(\"[hdb] me: \", this.ctx.me)\n\t\t}\n\t\tthis.cmd = this.runtime.findNext(callingCmd, this.ctx);\n\t\tthis.cmd = this.runtime.findNext(this.cmd, this.ctx);\n\t\tthis.logCommand();\n\t\tthis.bus.dispatchEvent(new Event(\"step\"));\n\t};\n\n\tHDB.prototype.skipTo = function (toCmd) {\n\t\tthis.cmd = toCmd.cmd\n\t\tthis.bus.dispatchEvent(new Event(\"skip\"));\n\t}\n\n\tHDB.prototype.rewrite = function (command, newCode) {\n\t\tconsole.log('##', command)\n\t\tconst parent = command.cmd.parent\n\t\tlet prev\n\t\tfor (prev of parent.children) {\n\t\t\tif (prev.next === command.cmd) break;\n\t\t}\n\t\tconst next = command.next\n\n\t\tconst tok = _hyperscript.internals.lexer.tokenize(newCode)\n\t\tconst newcmd = _hyperscript.internals.parser.requireElement('command', tok)\n\n\t\tconsole.log(newcmd)\n\t\tnewcmd.startToken = command.startToken\n\t\tnewcmd.endToken = command.endToken\n\t\tnewcmd.programSource = command.programSource\n\t\tnewcmd.sourceFor = function () { return newCode }\n\n\t\tprev.next = newcmd\n\t\tnewcmd.next = next\n\t\tnewcmd.parent = parent\n\n\t\tthis.bus.dispatchEvent(new Event('step'))\n\t}\n\n\tHDB.prototype.logCommand = function () {\n\t\tvar hasSource = this.cmd.sourceFor instanceof Function;\n\t\tvar cmdSource = hasSource ? this.cmd.sourceFor() : '-- '+this.cmd.type;\n\t\tconsole.log(\"[hdb] current command: \" + cmdSource)\n\t}\n\n\tHDB.prototype.traverse = function (ge) {\n\t\tconst rv = [];\n\n\t\t(function recurse (ge) {\n\t\t\trv.push(ge);\n\t\t\tif ('children' in ge) for (const child of ge.children) recurse(child);\n\t\t})(ge);\n\n\t\treturn rv;\n\t}\n\n\tvar ui = `\n<div class=\"hdb\" _=\"\n\ton load trigger update end\n\ton step from hdb.bus trigger update end\n\ton skip from hdb.bus trigger update end\n\ton continue from hdb.bus log 'done' then remove me.getRootNode().host\">\n\n\t<script type=\"text/hyperscript\">\n\n\tdef escapeHTML(unsafe)\n\t\tjs(unsafe) return unsafe\n\t\t\t.replace(/&/g, \"&amp;\")\n\t\t\t.replace(/</g, \"&lt;\")\n\t\t\t.replace(/>/g, \"&gt;\")\n\t\t\t.replace(/\\\\x22/g, \"&quot;\")\n\t\t\t.replace(/\\\\x27/g, \"&#039;\") end\n\t\treturn it\n\tend\n\n\tdef makeCommandWidget(i)\n\t\tget \\`<span data-cmd=\\${i}><button class=skip data-cmd=\\${i}>&rdca;</button>\\`\n\t\tif hdb.EXPERIMENTAL\n\t\t\tappend \\`<button class=rewrite data-cmd=\\${i}>Rewrite</button></span>\\`\n\t\tend\n\t\treturn it\n\tend\n\n\tdef renderCode\n\t\tset hdb.cmdMap to []\n\t\tset src to hdb.cmd.programSource\n\n\t\t-- Find feature\n\t\tset feat to hdb.cmd\n\t\trepeat until no feat.parent or feat.isFeature set feat to feat.parent end\n\n\t\t-- Traverse, finding starts\n\t\tfor cmd in hdb.traverse(feat)\n\t\t\tif no cmd.startToken continue end\n\t\t\tappend {\n\t\t\t\tindex: cmd.startToken.start,\n\t\t\t\twidget: makeCommandWidget(hdb.cmdMap.length),\n\t\t\t\tcmd: cmd\n\t\t\t} to hdb.cmdMap\n\t\tend\n\n\t\tset rv to src.slice(0, hdb.cmdMap[0].index)\n\t\tfor obj in hdb.cmdMap index i\n\t\t\tif obj.cmd is hdb.cmd\n\t\t\t\tappend obj.widget + '<u class=current>' +\n\t\t\t\t\tescapeHTML(src.slice(obj.index, hdb.cmdMap[i+1].index)) + '</u>' to rv\n\t\t\telse\n\t\t\t\tappend obj.widget + escapeHTML(src.slice(obj.index, hdb.cmdMap[i+1].index)) to rv\n\t\t\tend\n\t\tend\n\t\treturn rv\n\tend\n\n\tdef truncate(str, len)\n\t\tif str.length <= len return str end\n\t\treturn str.substr(0, len) + '…'\n\n\tdef prettyPrint(obj)\n\t\tif obj is null return 'null' end\n\t\tif Element.prototype.isPrototypeOf(obj)\n\t\t\tset rv to '&lt;<span class=\"token tagname\">' +\n\t\t\t\tobj.tagName.toLowerCase() + \"</span>\"\n\t\t\tfor attr in Array.from(obj.attributes)\n\t\t\t\tif attr.specified\n\t\t\t\t\tset rv to rv +\n\t\t\t\t\t\t' <span class=\"token attr\">' + attr.nodeName +\n\t\t\t\t\t\t'</span>=<span class=\"token string\">\"' + truncate(attr.textContent, 10) +\n\t\t\t\t\t\t'\"</span>'\n\t\t\t\tend\n\t\t\tend\n\t\t\tset rv to rv + '>'\n\t\t\treturn rv\n\t\telse if obj.call\n\t\t\tif obj.hyperfunc\n\t\t\t\tget \"def \" + obj.hypername + ' ...'\n\t\t\telse\n\t\t\t\tget \"function \"+obj.name+\"(...) {...}\"\n\t\t\tend\n\t\telse if obj.toString\n\t\t\tcall obj.toString()\n\t\tend\n\t\treturn escapeHTML((it or 'undefined').trim())\n\tend\n\t</script>\n\n\t<header _=\"\n\ton pointerdown(clientX, clientY)\n\t\thalt the event\n\t\tcall event.stopPropagation()\n\t\tget first .hdb\n\t\tmeasure its x, y\n\t\tset xoff to clientX - x\n\t\tset yoff to clientY - y\n\t\trepeat until event pointerup from document\n\t\t\twait for pointermove or pointerup from document\n\t\t\tadd {\n\t\t\t\tleft: \\${its clientX - xoff}px;\n\t\t\t\ttop: \\${its clientY - yoff}px;\n\t\t\t} to .hdb\n\t\tend\n\t\">\n\t\t<h2 class=\"titlebar\">HDB</h2>\n\t\t<ul role=\"toolbar\" class=\"toolbar\" _=\"on pointerdown halt\">\n\t\t\t<li><button _=\"on click call hdb.continueExec()\">\n\t\t\t\t&#x23F5; Continue\n\t\t\t</button>\n\t\t\t<li><button _=\"on click call hdb.stepOver()\">\n\t\t\t\t&#8631; Step Over\n\t\t\t</button>\n\t\t</ul>\n\t</header>\n\n\t<section class=\"sec-code\">\n\n\t\t<div class=\"code-container\">\n\t\t\t<pre class=\"code language-hyperscript\" _=\"\n\t\t\t\ton update from .hdb if hdb.cmd.programSource\n\t\t\t \tput renderCode() into me\n\t\t\t \tif Prism\n\t\t\t \t\tcall Prism.highlightAllUnder(me)\n\t\t\t \tend\n\t\t\t go to bottom of .current in me\n\t\t\t\tend\n\n\t\t\t\ton click\n\t\t\t\t\tif target matches .skip\n\t\t\t\t\t\tget (target's @data-cmd) as Int\n\t\t\t\t\t\tcall hdb.skipTo(hdb.cmdMap[result])\n\t\t\t\t\tend\n\t\t\t\t\tif target matches .rewrite\n\t\t\t\t\t\tset cmdNo to (target's @data-cmd) as Int\n\t\t\t\t\t\tset span to the first <span[data-cmd='\\${cmdNo}'] />\n\t\t\t\t\t\tput \\`<form class=rewrite><input id=cmd></form>\\` into the span\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\ton submit\n\t\t\t\t\thalt the event\n\t\t\t\t\tget (closest @data-cmd to target) as Int\n\t\t\t\t\tcall hdb.rewrite(hdb.cmdMap[result], #cmd's value)\n\t\t\t\tend\n\t\t\t\"><code></code></pre>\n\t\t</div>\n\t</section>\n\n\t<section class=\"sec-console\" _=\"\n\t\t-- Print context at startup\n\t\tinit repeat for var in Object.keys(hdb.ctx) if var is not 'meta'\n\t\t\tsend hdbUI:consoleEntry(input: var, output: hdb.ctx[var]) to #console\">\n\n\t\t<ul id=\"console\" role=\"list\" _=\"\n\t\t\ton hdbUI:consoleEntry(input, output)\n\t\t\t\tif no hdb.consoleHistory set hdb.consoleHistory to [] end\n\t\t\t\tpush(input) on hdb.consoleHistory\n\t\t\t\tset node to #tmpl-console-entry.content.cloneNode(true)\n\t\t\t\tput the node at end of me\n\t\t\t\tset entry to my lastElementChild\n\t\t\t\tgo to bottom of the entry\n\t\t\t\tput escapeHTML(input) into .input in the entry\n\t\t\t\tif no output\n\t\t\t\t\tcall hdb._hyperscript.parse(input)\n\t\t\t\t\tif its execute is not undefined then call its execute(hdb.ctx)\n\t\t\t\t\telse call its evaluate(hdb.ctx)\n\t\t\t\t\tend\n\t\t\t\t\tset output to it\n\t\t\t\tend\n\t\t\t\tput prettyPrint(output) as Fragment into .output in the entry\n\t\t\t\">\n\t\t\t<template id=\"tmpl-console-entry\">\n\t\t\t\t<li class=\"console-entry\">\n\t\t\t\t\t<kbd><code class=\"input\"></code></kbd>\n\t\t\t\t\t<samp class=\"output\"></samp>\n\t\t\t\t</li>\n\t\t\t</template>\n\t\t</ul>\n\n\t\t<form id=\"console-form\" data-hist=\"0\" _=\"on submit\n\t\t\t\tsend hdbUI:consoleEntry(input: #console-input's value) to #console\n\t\t\t\tset #console-input's value to ''\n\t\t\t\tset @data-hist to 0\n\t\t\t\tset element oldContent to null\n\t\t\t\thalt\n\t\t\ton keydown[key is 'ArrowUp' or key is 'ArrowDown']\n\t\t\t\tif no hdb.consoleHistory or exit end\n\t\t\t\tif element oldContent is null set element oldContent to #console-input.value end\n\t\t\t\tif event.key is 'ArrowUp' and hdb.consoleHistory.length > -@data-hist\n\t\t\t\t\tdecrement @data-hist\n\t\t\t\telse if event.key is 'ArrowDown' and @data-hist < 0\n\t\t\t\t\tincrement @data-hist\n\t\t\t\tend end\n\t\t\t\tset #console-input.value to hdb.consoleHistory[hdb.consoleHistory.length + @data-hist as Int]\n\t\t\t\t\tor oldContent\n\t\t\t\thalt default\n\t\t\ton input if @data-hist is '0' set element oldContent to #console-input.value\">\n\t\t\t<input id=\"console-input\" placeholder=\"Enter an expression&hellip;\"\n\t\t\t\tautocomplete=\"off\">\n\t\t</form>\n\t</section>\n\n\t<style>\n\t.hdb {\n\t\tborder: 1px solid #888;\n\t\tborder-radius: .3em;\n\t\tbox-shadow: 0 .2em .3em #0008;\n\t\tposition: fixed;\n\t\ttop: .5em; right: .5em;\n\t\twidth: min(40ch, calc(100% - 1em));\n\t\tmax-height: calc(100% - 1em);\n\t\tbackground-color: white;\n\t\tfont-family: sans-serif;\n\t\topacity: .9;\n\t\tz-index: 2147483647;\n\t\tcolor: black;\n\t\tdisplay: flex;\n\t\tflex-flow: column;\n\t}\n\n\t* {\n\t\tbox-sizing: border-box;\n\t}\n\n\theader {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tpadding: .4em;\n\t}\n\n\t.titlebar {\n\t\tmargin: 0;\n\t\tfont-size: 1em;\n\t\ttouch-action: none;\n\t}\n\n\t.toolbar {\n\t\tdisplay: flex;\n\t\tgap: .35em;\n\n\t\tlist-style: none;\n\t\tpadding-left: 0;\n\t\tmargin: 0;\n\t}\n\n\t.toolbar a, .toolbar button {\n\t\tbackground: #2183ff;\n\t\tborder: 1px solid #3465a4;\n\t\tbox-shadow: 0 1px #b3c6ff inset, 0 .06em .06em #000;\n\t\tborder-radius: .2em;\n\t\tfont: inherit;\n\t\tpadding: .2em .3em;\n\t\tcolor: white;\n\t\ttext-shadow: 0 1px black;\n\t\tfont-weight: bold;\n\t}\n\n\t.toolbar a:hover .toolbar a:focus, .toolbar button:hover, .toolbar button:focus {\n\t\tbackground: #94c8ff;\n\t}\n\n\t.toolbar a:active, .toolbar button:active {\n\t\tbackground: #3465a4;\n\t}\n\n\t.sec-code {\n\t\tborder-radius: .3em;\n\t\toverflow: hidden;\n\t\tbox-shadow: 0 1px white inset, 0 .06em .06em #0008;\n\t\tbackground: #bdf;\n\t\tmargin: 0 .4em;\n\t\tborder: 1px solid #3465a4;\n\t}\n\n\t.hdb h3 {\n\t\tmargin: 0;\n\t\tfont-size: 1em;\n\t\tpadding: .2em .4em 0 .4em;\n\t}\n\n\t.code-container {\n\t\tdisplay: grid;\n\t\tline-height: 1.2em;\n\t\theight: calc(12 * 1.2em);\n\t\tborder-radius: 0 0 .2em .2em;\n\t\toverflow: auto;\n\t\tscrollbar-width: thin;\n\t\tscrollbar-color: #0003 transparent;\n\t}\n\n\t.code, #console, #console-input {\n\t\tfont-family: Consolas, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", Monaco, \"Courier New\", Courier, monospace;\n\t}\n\n\t.code {\n\t\twidth: 0;\n\t\tmargin: 0;\n\t\tpadding-left: 1ch;\n\t\ttab-size: 2;\n\t\t-moz-tab-size: 2;\n\t\t-o-tab-size: 2;\n\t}\n\n\t.current {\n\t\tfont-weight: bold;\n\t\tbackground: #abf;\n\t}\n\n\t.skip {\n\t\tpadding: 0;\n\t\tmargin: 2px;\n\t\tborder: 1px solid #3465a4;\n\t\tborder-radius: 50%;\n\t\tcolor: #3465a4;\n\t\tbackground: none;\n\t\tfont-weight: bold;\n\t\tfont-size: 1.2em;\n\t\twidth: calc(2ch / 1.2 - 4px);\n\t\theight: calc(2ch / 1.2 - 4px);\n\t\tline-height: 0.6;\n\t}\n\n\t.skip:hover {\n\t\tbackground: #3465a4;\n\t\tcolor: #bdf;\n\t}\n\n\t#console {\n\t\toverflow-y: scroll;\n\t\tscrollbar-width: thin;\n\t\tscrollbar-color: #afc2db transparent;\n\t\theight: calc(12 * 1.2em);\n\t\tlist-style: none;\n\t\tpadding-left: 0;\n\t\tmargin: 0 .4em .4em .4em;\n\t\tposition: relative;\n\t\tword-wrap: break-word;\n\t}\n\n\t#console>*+* {\n\t\tmargin-top: .5em;\n\t}\n\n\t.console-entry>* {\n\t\tdisplay: block;\n\t}\n\n\t.console-entry .input { color: #3465a4; }\n\t.console-entry .output { color: #333; }\n\n\t.console-entry .input:before { content: '>> ' }\n\t.console-entry .output:before { content: '<- ' }\n\n\t#console-form {\n\t\tmargin: 0 .4em .4em .4em;\n\t}\n\n\t#console-input {\n\t\twidth: 100%;\n\t\tfont-size: inherit;\n\t}\n\n\t.token.tagname { font-weight: bold; }\n\t.token.attr, .token.builtin, .token.italic { font-style: italic; }\n\t.token.string { opacity: .8; }\n\t.token.keyword { color: #3465a4; }\n\t.token.bold, .token.punctuation, .token.operator { font-weight: bold; }\n\t</style>\n\t</div>\n\t`;\n\tHDB.prototype.ui = function () {\n\t\tvar node = document.createElement(\"div\");\n\t\tvar shadow = node.attachShadow({ mode: \"open\" });\n\t\tnode.style.cssText = \"all: initial\";\n\t\tshadow.innerHTML = ui;\n\t\tdocument.body.appendChild(node);\n\t\t_hyperscript.processNode(shadow.querySelector(\".hdb\"));\n\t};\n}\n"],"names":["_hyperscript","HDB","ctx","runtime","breakpoint","this","cmd","cmdMap","bus","EventTarget","addCommand","parser","tokens","hdb","matchToken","op","globalThis","break","e","console","error","stack","prototype","log","ui","Promise","resolve","reject","addEventListener","attr","Object","assign","window","findNext","once","continueExec","dispatchEvent","Event","stepOver","result","type","unifiedEval","stepOut","then","Function","next","logCommand","halt_flag","meta","caller","callingCmd","callingCommand","oldMe","me","feature","displayName","Element","skipTo","toCmd","rewrite","command","newCode","parent","prev","children","tok","internals","lexer","tokenize","newcmd","requireElement","startToken","endToken","programSource","sourceFor","cmdSource","traverse","ge","rv","recurse","push","child","node","document","createElement","shadow","attachShadow","mode","style","cssText","innerHTML","body","appendChild","processNode","querySelector"],"mappings":"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"}
\No newline at end of file